/* Copyright (C) 1999, 2002  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) 2002 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
      {
	BytesToUnicode inDecoder
	  = inEncodingName == null ? BytesToUnicode.getDefaultDecoder()
	  : BytesToUnicode.getDecoder(inEncodingName);
	UnicodeToBytes outEncoder
	  = outEncodingName == null ? UnicodeToBytes.getDefaultEncoder()
	  : UnicodeToBytes.getEncoder(outEncodingName);
	InputStream inStream = inName == "-" ? System.in
	  : new FileInputStream(inName);
	OutputStream outStream;
	if (outName == "-")
	  outStream = System.out;
	else
	  outStream = new FileOutputStream(outName);
	InputStreamReader in
	  = new InputStreamReader(inStream, inEncodingName);
	OutputStreamWriter out
	  = 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);
      }
  }
}
