/* arguments.h
   Copyright (C) 2005 Free Software Foundation, Inc.

This file is part of Mysaifu JVM

Mysaifu JVM is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 of the License.

Mysaifu JVM is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
General Public License for more details.

You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING.  If not, write to the
Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA.
*/

#ifndef ARGUMENTS_H_INCLUDED
#define ARGUMENTS_H_INCLUDED

/**
 * システムプロパティ
 */
struct property {
	_TCHAR key[256];
	_TCHAR value[256];
};

/**
 * ベリファイモード
 */
enum VerifyMode {
	/**
	 * ベリファイしない
	 */
	VERIFY_MODE_NONE,

	/**
	 * ベリファイする
	 */
	VERIFY_MODE_ALL,
};


/**
 * JVM起動時の引数情報
 */
struct arguments {
	/**
	 * クラスパス
	 */
	_TCHAR classpath[256];
	
	/**
	 * ブートクラスパス
	 */
	_TCHAR boot_classpath[256];

	union {
		/**
		 * 実行クラス名
		 */
		_TCHAR class_name[256];

		/**
		 * jarファイル名
		 */
		_TCHAR jar_file_name[MAX_PATH + 1];
	};

	/**
	 * 最大ヒープサイズ（バイト)
	 */
	int max_heap_size;

	/**
	 * Javaスタックサイズ（バイト単位）
	 */
	int java_stack_size;

	/**
	 * ネイティブスタックサイズ（バイト単位）
	 */
	int native_stack_size;

	/**
	 * コマンドライン引数
	 */
	_TCHAR* argv;

	/**
	 * -verbose:gc オプション
	 */
	bool verbose_gc;

	/**
	 * -verbose:class
	 */
	bool verbose_class;

	/**
	 * -verbose:jni
	 */
	bool verbose_jni;

	/**
	 * -Xloggc:オプションで指定されたファイル名
	 */
	_TCHAR loggc[256];

	/**
	 * assertionを有効にするか
	 */
	bool enableAssertions;

	/**
	 * 起動直後にコンソールウインドウをオープンするか
	 */
	bool show_console;

	/**
	 * 起動後にVMのダイアログを非表示にする
	 */
	bool hide_vm_window;

	/**
	 * 標準入出力を使用するか
	 */
	bool use_stdio;

	/**
	 * コンソールログファイル
	 */
	_TCHAR	logfile[MAX_PATH + 1];
	
	/**
	 * -jar オプション
	 */
	bool jar;

	/**
	 * システムプロパティ数
	 */
	int properties_count;

	/**
	 * システムプロパティ
	 */
	property* properties;

	/**
	 * ベリファイオプション
	 *
	 * 0 - ベリファイしない(-noverify)
	 * 2 - クラスローダによってロードされたクラスをベリファイする（-verifyremote)
	 * 3 - 全てのクラスをベリファイする（-verify)
	 */
	VerifyMode verify_mode;

	/**
	 * カレントディレクトリ
	 */
	_TCHAR current_directory[MAX_PATH];
};

/**
 * 引数情報に関する内部状態を初期化する
 */
void init_arguments_settings();

/**
 * 引数情報を作成する
 */
arguments* arguments_create();

/**
 * 引数情報に割り当てられたメモリを削除する
 */
void arguments_delete(arguments* args);

/**
 * 指定された文字列情報を元に、引数情報を生成する
 */
arguments* arguments_load(const _TCHAR* params);

/**
 * 指定されたバッファに、引数情報を文字列に変換して、指定されたファイルに出力する
 */
int arguments_store(arguments* args, FILE* file);

/**
 * プロパティを設定する
 */
void arguments_put_property(arguments* args, const _TCHAR* key, const _TCHAR* value);

/**
 * すべてのプロパティをクリアする
 */
void arguments_clear_all_properties(arguments* args);

/**
 * プロパティのキーを返す
 */
const _TCHAR* arguments_get_property_key(arguments* args, int index);

/**
 * 指定されたキーに対応するプロパティ値を返す
 */
const _TCHAR* arguments_get_property(arguments* args, const _TCHAR* key);

#endif