/*
 * Galatea Dialog Manager:
 * (c)2003 Takuya NISHIMOTO (nishi@hil.t.u-tokyo.ac.jp)
 * 
 * $Id: Getopt.java,v 1.3 2008/02/12 06:15:29 nishi Exp $
 * 
 * GNU Getopt for Java の仕様に合わせてスクラッチから実装した
 */

package galatea.util;
import java.util.ArrayList;

public class Getopt
{
	private ArrayList<String> options_;
	private int optind_;
	private int optpos_;
	private String optarg_;
	
	public Getopt(String name, String argv[], String opt)
	{
		options_ = new ArrayList<String>();
		optind_ = 0;
		optpos_ = 0;
		optarg_ = "";
		
		// argv = 0:"-c" 1:"hoge.conf" 2:"-p" 3:"hoge.xml"
		// opt = "c:p"
		
		// argv を１要素ずつチェックする
		// if "-"で始まるオプション要素x:
		//   if ("x:"がoptに含まれる) then
		//     {c, "hoge.conf"} を追加
		//   else
		//     {p, null} を追加
		// else
		//   optind を設定する; break;
		// end
		// optpos = 0;
		
		for ( int i = 0; i < argv.length; i++ ) {
			String curr = argv[i];
			if ( curr.startsWith("-") && curr.length() == 2 ) {
				String currOpt = curr.substring(1);
				if ( opt.indexOf( currOpt + ":" ) >= 0 ) {
					if ( i+1 < argv.length ) {
						String item = currOpt + ":" + argv[i+1];
						options_.add( item );
						i++;
					}
				} else {
					options_.add( currOpt );
				}
			} else {
				optind_ = i;
				return;
			}
		}
		optpos_ = 0;
	}
	
	public int getOptind()
	{
		return optind_;
	}
	
	public int getopt()
	{
		if ( optpos_ < options_.size() ) {
			String curr = (String)(options_.get(optpos_));
			if ( curr.length() > 1 ) {
				optarg_ = curr.substring(2);
			} else {
				optarg_ = "";
			}
			if ( curr.length() > 0 ) {
				optpos_++;
				return curr.charAt(0);
			}
		} 
		return -1;
	}
	
	public String getOptarg()
	{
		return optarg_;
	}
	
	public void setOpterr(boolean opterr)
	{
		// ignored
	}
	
	public static void main(String argv[])
	{
		galatea.util.Getopt g = new galatea.util.Getopt("", argv, "c:p");
		g.setOpterr(false);
		int c;
		while ((c = g.getopt()) != -1){
			switch (c)	{
			case 'c':
				System.out.println("option c:" + g.getOptarg());
				break;
			case 'p':
				System.out.println("option p=true");
				break;
			}
		}
		if (argv.length - g.getOptind() != 1){
			System.out.println("Usage: hoge");
			System.exit(1);
		} else {
			System.out.println("arg:" + argv[g.getOptind()]);
		}
	}
}
