/**
 * $Id: ReadMe.Option,v 1.1.1.1 1999/08/03 08:19:18 yamauchi Exp $
 *     
 *	Copyright (C) 1999 MAEDA Atusi 
 *	@author MAEDA Atusi 
 *
 */

* 使う手順の概要

    1. コマンドラインオプションの仕様を記述したOptionの配列を用意する。
    2. Optionの配列とStringの配列を引数としてOption.parseCommandLineメ
       ソッドを呼び出す。
    3. 戻り値としてOption.CommandLineクラスのオブジェクトが帰って来る。
       このオブジェクトに対しては以下の2つのメソッドが使用できる。
       Map getOptions()
         解析したオプションを表すMap。オプション名をキーとして引くと、
         コマンドラインで与えられた値が返る。(与えられなければnull。)
       int getNonOptionIndex()
         オプション以外のコマンドライン引数が、String配列の何番目から
         始まるかを示す0以上で配列の長さ以下の整数。

* オプションの仕様の記述法と、オプションの文法

   ** 引数の無いオプション

      Option(String longName, String shortName) コンストラクタを使う。

      例:
	static Option[] options = {
	  new Option("verbose", "v")
	};
	...
	public static void main(String[] args) {
	 Option.CommandLine cl = Option.parseCommandLine(options, args);
	 Map opts = cl.getOptions();

	 boolean verbose = (opts.get("verbose") != null);
	 ...

      上のプログラムが受け付けるオプションの書式:
        --verbose または -v

      引数の無い複数のオプションa, b, c(いずれもshortName)があるとき、
      -abc は -a -b -c と同じものとみなされる。

   ** 必須引数を取るオプション

      Option(String longName, String shortName,
             Object argDefault, Option.ArgType parser)
      Option(String longName, String shortName,
             Object argDefault, Option.ArgType parser,
	     Object defaultValue)
      のいずれかのコンストラクタを使い、argDefaultとしてOption.REQUIRED_ARG
      を指定する。

      例:
	static Option[] options = {
	  new Option("interval", "i", Option.REQUIRED_ARG, Option.INT),
	  new Option("ratio", "r", Option.REQUIRED_ARG, Option.DOUBLE,
	             new Double(1.0));
	};
	...
	public static void main(String[] args) {
	 Option.CommandLine cl = Option.parseCommandLine(options, args);
	 Map opts = cl.getOptions();

	 int interval;
	 if (opts.get("interval") != null) {
	   interval = ((Integer)opts.get("interval")).intValue();
         }
	 double ratio = ((Double)opts.get("double")).doubleValue();
	 ...

      上のプログラムが受け付けるオプションの書式:
        --interval=100, --interval 100, -i100, -i 100
        --ratio=0.5, --ratio 0.2, -r1.2e-2, -r -3.2

      ratio引数についてはdefaultValueが指定してあるため、必ずDoubleク
      ラスのオブジェクトがMap中に入っている。

      argTypeとしては、以下のものが既に定義されている。
      Option.INT     整数をIntegerオブジェクトとして返す。
                     0x<16進数> 0<8進数>も可。
      Option.DOUBLE  浮動小数点数をDoubleとして返す。
      Option.STRING  引数文字列をそのままStringとして返す。
      Option.BOOLEAN 論理値をBoolean.TRUEまたはBoolean.FALSEとして返す。
                     true, yes, on, 1なら真、false, no, off, 0なら偽。
		     それ以外ならIllegalArgumentExceptionを投げる。

   ** 省略可能な引数を取るオプション
      not yet

   ** ヘルプ文字列
      not yet
   ** ヘルプ文字列のローカライズ
      not yet

* Appletのパラメータの解析
      not yet
* Propertyの解析
      not yet
