aboutsummaryrefslogtreecommitdiff
path: root/src/lib/flags.cc
diff options
context:
space:
mode:
authorIan Hodson <idh@google.com>2012-05-30 21:27:06 +0100
committerIan Hodson <idh@google.com>2012-05-30 22:47:36 +0100
commitf4c12fce1ee58e670f9c3fce46c40296ba9ee8a2 (patch)
treeb131ed907f9b2d5af09c0983b651e9e69bc6aab9 /src/lib/flags.cc
parenta92766f0a6ba4fac46cd6fd3856ef20c3b204f0d (diff)
downloadopenfst-f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2.tar.gz
Moved from GoogleTTS Change-Id: I6bc6bdadaa53bd0f810b88443339f6d899502cc8
Diffstat (limited to 'src/lib/flags.cc')
-rw-r--r--src/lib/flags.cc103
1 files changed, 103 insertions, 0 deletions
diff --git a/src/lib/flags.cc b/src/lib/flags.cc
new file mode 100644
index 0000000..d05fd73
--- /dev/null
+++ b/src/lib/flags.cc
@@ -0,0 +1,103 @@
+// 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();
+}