/* Copyright (C) 1999-2016 Free Software Foundation

   This file is part of libgcj.

This software is copyrighted work licensed under the terms of the
Libgcj License.  Please consult the file "LIBGCJ_LICENSE" for
details.  */

package gnu.gcj.convert;
import java.io.*;

public class Convert
{
  static void error (String message)
  {
    System.err.print("jv-convert: ");
    System.err.println(message);
    System.err.println("Try `jv-convert --help' for more information.");
    System.exit(1);
  }

  static void help ()
  {
    System.out.println("Usage: jv-convert [OPTIONS] [INPUTFILE [OUTPUTFILE]]");
    System.out.println();
    System.out.println("Convert from one encoding to another.");
    System.out.println();
    System.out.println("   --encoding FROM");
    System.out.println("   --from FROM        use FROM as source encoding name");
    System.out.println("   --to TO            use TO as target encoding name");
    System.out.println("   -i FILE            read from FILE");
    System.out.println("   -o FILE            print output to FILE");
    System.out.println("   --reverse          swap FROM and TO encodings");
    System.out.println("   --help             print this help, then exit");
    System.out.println("   --version          print version number, then exit");
    System.out.println();
    System.out.println("`-' as a file name argument can be used to refer to stdin or stdout.");
    System.exit(0);
  }

  static void version ()
  {
    System.out.println("jv-convert ("
		       + System.getProperty("java.vm.name")
		       + ") "
		       + System.getProperty("java.vm.version"));
    System.out.println();
    System.out.println("Copyright (C) 2016 Free Software Foundation, Inc.");
    System.out.println("This is free software; see the source for copying conditions.  There is NO");
    System.out.println("warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.");
    System.exit(0);
  }

  static void missing (String arg)
  {
    error("missing arg after `" + arg + "' option");
  }

  public static void main (String[] args)
  {
    String inName = "-";
    String outName = "-";
    String inEncodingName = null;
    String outEncodingName = "JavaSrc";
    int seenNames = 0;
    boolean reverse = false;

    for (int i = 0;  i < args.length;  i++)
      {
	String arg = args[i];
	if (arg.length() == 0)
	  error("zero-length argument");
	if (arg.charAt(0) == '-')
	  {
	    if (arg.equals("-encoding") || arg.equals("--encoding")
		|| args.equals("-from") || arg.equals("--from"))
	      {
		if (++i == args.length) missing(arg);
		inEncodingName = args[i];
	      }
	    else if (arg.equals("-to") || arg.equals("--to"))
	      {
		if (++i == args.length) missing(arg);
		outEncodingName = args[i];
	      }
	    else if (arg.equals("-i"))
	      {
		if (++i == args.length) missing(arg);
		inName = args[i];
	      }
	    else if (arg.equals("-o"))
	      {
		if (++i == args.length) missing(arg);
		outName = args[i];
	      }
	    else if (arg.equals("-reverse") || arg.equals("--reverse"))
	      {
		reverse = true;
	      }
	    else if (arg.equals("-help") || arg.equals("--help"))
	      {
		help ();
	      }
	    else if (arg.equals("-version") || arg.equals("--version"))
	      {
		version ();
	      }
	    else if (arg.equals("-"))
	      {
		switch (seenNames)
		  {
		  case 0:
		    inName = "-";
		    seenNames++;
		    break;
		  case 1:
		    outName = "-";
		    seenNames++;
		    break;
		  default:
		    error("too many `-' arguments");
		  }
	      }
	    else
	      error("unrecognized argument `" + arg + "'");
	  }
	else
	  {
	    switch (seenNames)
	      {
	      case 0:
		inName = arg;
		seenNames++;
		break;
	      case 1:
		outName = arg;
		seenNames++;
		break;
	      default:
		error("too many filename arguments");
	      }
	  }
      }

    if (reverse)
      {
	String tmp = inEncodingName;
	inEncodingName = outEncodingName;
	outEncodingName = tmp;
      }

    try
      {
	InputStream inStream = inName.equals("-") ? System.in
	  : new FileInputStream(inName);
	OutputStream outStream;
	if (outName.equals("-"))
	  outStream = System.out;
	else
	  outStream = new FileOutputStream(outName);
	InputStreamReader in
	  = (inEncodingName == null
	     ? new InputStreamReader(inStream)
	     : new InputStreamReader(inStream, inEncodingName));
	OutputStreamWriter out
	  = (outEncodingName == null
	     ? new OutputStreamWriter(outStream)
	     : new OutputStreamWriter(outStream, outEncodingName));
	char[] buffer = new char[2048];
	for (;;)
	  {
	    int count = in.read(buffer);
	    if (count < 0)
	      break;
	    out.write(buffer, 0, count);
	  }

	in.close();
	out.close();
      }
    catch (java.io.IOException ex)
      {
	System.err.print("jv-convert exception: ");
	System.err.println(ex);
	System.exit(-1);
      }
  }
}
