00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include <cstring>
00021
00022 #include <fst/compat.h>
00023 #include <fst/flags.h>
00024
00025 DEFINE_int32(v, 0, "verbose level");
00026 DEFINE_bool(help, false, "verbose level");
00027 DEFINE_string(tmpdir, "/tmp/", "temporary directory");
00028
00029 using namespace std;
00030
00031 static string flag_usage;
00032
00033 void SetFlags(const char *usage, int *argc, char ***argv, bool remove_flags) {
00034 flag_usage = usage;
00035 int index = 1;
00036 for (; index < *argc; ++index) {
00037 string argval = (*argv)[index];
00038
00039 if (argval[0] != '-' || argval == "-")
00040 break;
00041 while (argval[0] == '-')
00042 argval = argval.substr(1);
00043
00044 string arg = argval;
00045 string val = "";
00046
00047
00048 int pos = argval.find("=");
00049 if (pos != string::npos) {
00050 arg = argval.substr(0, pos);
00051 val = argval.substr(pos + 1);
00052 }
00053
00054 FlagRegister<bool> *bool_register =
00055 FlagRegister<bool>::GetRegister();
00056 if (bool_register->SetFlag(arg, val))
00057 continue;
00058 FlagRegister<string> *string_register =
00059 FlagRegister<string>::GetRegister();
00060 if (string_register->SetFlag(arg, val))
00061 continue;
00062 FlagRegister<int32> *int32_register =
00063 FlagRegister<int32>::GetRegister();
00064 if (int32_register->SetFlag(arg, val))
00065 continue;
00066 FlagRegister<int64> *int64_register =
00067 FlagRegister<int64>::GetRegister();
00068 if (int64_register->SetFlag(arg, val))
00069 continue;
00070 FlagRegister<double> *double_register =
00071 FlagRegister<double>::GetRegister();
00072 if (double_register->SetFlag(arg, val))
00073 continue;
00074
00075 LOG(FATAL) << "SetFlags: Bad option: " << (*argv)[index];
00076 }
00077
00078 if (remove_flags) {
00079 for (int i = 0; i < *argc - index; ++i)
00080 (*argv)[i + 1] = (*argv)[i + index];
00081 *argc -= index - 1;
00082 }
00083
00084 if (FLAGS_help) {
00085 ShowUsage();
00086 exit(1);
00087 }
00088 }
00089
00090 void ShowUsage() {
00091 cout << flag_usage << "\n";
00092 cout << " Flags Description:\n";
00093 FlagRegister<bool> *bool_register = FlagRegister<bool>::GetRegister();
00094 bool_register->ShowUsage();
00095 FlagRegister<string> *string_register = FlagRegister<string>::GetRegister();
00096 string_register->ShowUsage();
00097 FlagRegister<int32> *int32_register = FlagRegister<int32>::GetRegister();
00098 int32_register->ShowUsage();
00099 FlagRegister<int64> *int64_register = FlagRegister<int64>::GetRegister();
00100 int64_register->ShowUsage();
00101 FlagRegister<double> *double_register = FlagRegister<double>::GetRegister();
00102 double_register->ShowUsage();
00103 }