/* Copyright (C) 1999-2015 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) 2015 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);
      }
  }
}
