/**
 *  @file   ExArgv.h
 *  @brief  argc,argvの拡張処理(ワイルドカード,レスポンスファイル).
 *  @author tenk* (Masashi Kitamura)
 *  @date   2006-2010
 *  @note
 *  -   main(int argc,char* argv[]) のargc,argvに対し、
 *      ワイルドカード指定やレスポンスファイル指定等を展開したargc,argvに変換.
 *      main()の初っ端ぐらいで ExArgv_conv(&argc, &argv); のように呼び出す.
 *      あるいは WinMain() では, ExArgv_forWinMain(cmdl, &argc, &argv);
 *
 *  -   メインはdos/win系(のコマンドラインツール)を想定.
 *      一応 linux gccでのコンパイル可.
 *      (unix系だとワイルドカードはシェル任せだろうで、メリット少なく)
 *
 *  -   ExArgv.hは、一応ヘッダだが、ExArgv.c の設定ファイルでもある.
 *      アプリごとに ExArgv.h ExArgv.c をコピーして、ExArgv.hを
 *      カスタムして使うのを想定.
 *  -   設定できる要素は、
 *          - ワイルドカード (on/off)
 *          - ワイルドカード時の再帰指定(**)の有無 (on/off)
 *          - @レスポンスファイル (on/off)
 *          - .exe連動 .cfg ファイル 読込 (on/off)
 *          - オプション環境変数名の利用
 *          等
 *
 *  -   引数文字列の先頭が'-'ならばオプションだろうで、その文字列中に
 *      ワイルドカード文字があっても展開しない.
 *  -   マクロ UNICODE が定義されていれば、wchar_t用、でなければchar用.
 *  -   _WIN32 が定義されていれば win用、でなければ unix系を想定.
 *
 *  - Public Domain Software
 */

#ifndef EXARGV_INCLUDED
#define EXARGV_INCLUDED

// ---------------------------------------------------------------------------
// 設定.

//[] ワイルドカード指定を 1=有効  0=無効  未定義=デフォルト設定(1)
//#define EXARGV_USE_WC         1


//[] ワイルドカードon時に、ワイルドカード文字 ** があれば再帰検索に
//      1=する 0=しない 未定義=デフォルト設定(1)
//#define EXARGV_USE_WC_REC     1


//[] @レスポンスファイルを
//      1=有効   0=無効  未定義=デフォルト設定(1)
//#define EXARGV_USE_RESFILE    1


//[] 簡易コンフィグ(レスポンス)ファイル入力を
//      1=有効  0=無効  未定義=デフォルト(0)
//   有効時は、win/dosなら .exe を .cfg に置換したパス名.
//             以外なら unix 系だろうで ~/.実行ファイル名.cfg
//#define EXARGV_USE_CONFIG     0


//[] コンフィグファイル入力有効のとき、これを定義すれば、
//      コンフィグファイルの拡張子をこれにする.
//#define EXARGV_CONFIG_EXT     ".cfg"  // .conf


//[] 定義すると、この名前の環境変数をコマンドライン文字列として利用.
//#define EXARGV_ENVNAME    "your_app_env_name"


//[] win環境のみ. argv[0] の実行ファイル名をフルパス化
//      1=有効  0=無効      未定義=デフォルト(1)
//   ※bcc,dmc,watcomは元からフルパスなので何もしません. のでvc,gcc向.
//#define EXARGV_USE_FULLPATH_ARGV0


//[] 定義すれば、filePath中の \ を / に置換.
//#define EXARGV_TOSLASH


//[] 定義すれば、filePath中の / を \ に置換.
//#define EXARGV_TOBACKSLASH


//[] 定義すれば、/ もオプション開始文字とみなす.
//#define EXARGV_USE_SLASH_OPT


//[] 実験. VCのみ. 定義すると、setargvの代用品としてコンパイル(ExArgv_getは無)
//   現状 setargv.obj のリンクも必要.
// #define EXARGV_USE_SETARGV



// ---------------------------------------------------------------------------
#ifdef __cplusplus
extern "C" {
#endif


#if defined EXARGV_USE_SETARGV  // VCの暗黙処理の置き換え用.

#elif defined _WINDOWS      // win-gui 環境用.
 #if defined UNICODE
  void ExArgv_forWinMain(const wchar_t* pCmdLine, int* pArgc, wchar_t*** pppArgv);
 #else
  void ExArgv_forWinMain(const char*    pCmdLine, int* pArgc, char***    pppArgv);
 #endif
#else                       // コマンドラインツール用. mainの初っ端くらいに呼ぶのを想定.
 #if defined UNICODE
  void ExArgv_conv(int* pArgc, wchar_t*** pppArgv);
 #else
  void ExArgv_conv(int* pArgc, char*** pppArgv);
 #endif
#endif


#ifdef __cplusplus
}
#endif
// ---------------------------------------------------------------------------
#endif  // EXARGV_H