// flags.cc // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // // Author: riley@google.com (Michael Riley) // // \file // Google-style flag handling definitions #include <cstring> #include <fst/compat.h> #include <fst/flags.h> DEFINE_int32(v, 0, "verbose level"); DEFINE_bool(help, false, "show usage information"); DEFINE_string(tmpdir, "/tmp/", "temporary directory"); using namespace std; static string flag_usage; void SetFlags(const char *usage, int *argc, char ***argv, bool remove_flags) { flag_usage = usage; int index = 1; for (; index < *argc; ++index) { string argval = (*argv)[index]; if (argval[0] != '-' || argval == "-") break; while (argval[0] == '-') argval = argval.substr(1); // remove initial '-'s string arg = argval; string val = ""; // split argval (arg=val) into arg and val int pos = argval.find("="); if (pos != string::npos) { arg = argval.substr(0, pos); val = argval.substr(pos + 1); } FlagRegister<bool> *bool_register = FlagRegister<bool>::GetRegister(); if (bool_register->SetFlag(arg, val)) continue; FlagRegister<string> *string_register = FlagRegister<string>::GetRegister(); if (string_register->SetFlag(arg, val)) continue; FlagRegister<int32> *int32_register = FlagRegister<int32>::GetRegister(); if (int32_register->SetFlag(arg, val)) continue; FlagRegister<int64> *int64_register = FlagRegister<int64>::GetRegister(); if (int64_register->SetFlag(arg, val)) continue; FlagRegister<double> *double_register = FlagRegister<double>::GetRegister(); if (double_register->SetFlag(arg, val)) continue; LOG(FATAL) << "SetFlags: Bad option: " << (*argv)[index]; } if (remove_flags) { for (int i = 0; i < *argc - index; ++i) (*argv)[i + 1] = (*argv)[i + index]; *argc -= index - 1; } if (FLAGS_help) { ShowUsage(); exit(1); } } void ShowUsage() { cout << flag_usage << "\n"; cout << " Flags Description:\n"; FlagRegister<bool> *bool_register = FlagRegister<bool>::GetRegister(); bool_register->ShowUsage(); FlagRegister<string> *string_register = FlagRegister<string>::GetRegister(); string_register->ShowUsage(); FlagRegister<int32> *int32_register = FlagRegister<int32>::GetRegister(); int32_register->ShowUsage(); FlagRegister<int64> *int64_register = FlagRegister<int64>::GetRegister(); int64_register->ShowUsage(); FlagRegister<double> *double_register = FlagRegister<double>::GetRegister(); double_register->ShowUsage(); }