25 #include <string_view> 30 static const char *private_tmpdir = getenv(
"TMPDIR");
34 DEFINE_bool(helpshort,
false,
"show brief usage information");
35 DEFINE_string(tmpdir, private_tmpdir ? private_tmpdir :
"/tmp",
36 "temporary directory");
38 static std::string flag_usage;
39 static std::string prog_src;
42 static void SetProgSrc(
const char *src) {
47 static constexpr std::string_view kMainSuffix =
"-main.cc";
48 const int prefix_length = prog_src.size() - kMainSuffix.size();
49 if (prefix_length > 0 &&
50 std::string_view(prog_src).substr(prefix_length) == kMainSuffix) {
51 static constexpr
size_t kDashMainSize = std::string_view(
"-main").size();
52 prog_src.erase(prefix_length, kDashMainSize);
56 void SetFlags(
const char *usage,
int *argc,
char ***argv,
57 bool remove_flags,
const char *src) {
62 for (; index < *argc; ++index) {
63 std::string_view argval = (*argv)[index];
64 if (argval[0] !=
'-' || argval ==
"-")
break;
65 while (argval[0] ==
'-') argval.remove_prefix(1);
66 std::string arg(argval);
69 auto pos = argval.find(
'=');
70 if (pos != std::string::npos) {
71 arg = argval.substr(0, pos);
72 val = argval.substr(pos + 1);
75 if (bool_register->SetFlag(arg, val))
78 if (string_register->SetFlag(arg, val))
continue;
80 if (int32_register->SetFlag(arg, val))
continue;
82 if (int64_register->SetFlag(arg, val))
continue;
84 if (uint64_register->SetFlag(arg, val))
continue;
86 if (double_register->SetFlag(arg, val))
continue;
87 LOG(FATAL) <<
"SetFlags: Bad option: " << (*argv)[index];
90 for (
auto i = 0; i < *argc - index; ++i) {
91 (*argv)[i + 1] = (*argv)[i + index];
99 if (FST_FLAGS_helpshort) {
107 static void ShowUsageRestrict(
108 const std::set<std::pair<std::string, std::string>> &usage_set,
109 const std::string &src,
bool in_src,
bool show_file) {
110 std::string old_file;
111 bool file_out =
false;
112 bool usage_out =
false;
113 for (
const auto &pair : usage_set) {
114 const auto &file = pair.first;
115 const auto &usage = pair.second;
116 bool match = file == src;
117 if ((match && !in_src) || (!match && in_src))
continue;
118 if (file != old_file) {
120 if (file_out) std::cout << std::endl;
121 std::cout <<
"Flags from: " << file << std::endl;
126 std::cout << usage << std::endl;
129 if (usage_out) std::cout << std::endl;
133 std::set<std::pair<std::string, std::string>> usage_set;
134 std::cout << flag_usage << std::endl;
136 bool_register->GetUsage(&usage_set);
138 string_register->GetUsage(&usage_set);
140 int32_register->GetUsage(&usage_set);
142 int64_register->GetUsage(&usage_set);
144 uint64_register->GetUsage(&usage_set);
146 double_register->GetUsage(&usage_set);
147 if (!prog_src.empty()) {
148 std::cout <<
"PROGRAM FLAGS:" << std::endl << std::endl;
149 ShowUsageRestrict(usage_set, prog_src,
true,
false);
151 if (!long_usage)
return;
152 if (!prog_src.empty()) {
153 std::cout <<
"LIBRARY FLAGS:" << std::endl << std::endl;
155 ShowUsageRestrict(usage_set, prog_src,
false,
true);
static FlagRegister< T > * GetRegister()
DEFINE_bool(help, false,"show usage information")
void SetFlags(const char *usage, int *argc, char ***argv, bool remove_flags, const char *src)
DEFINE_int32(v, 0,"verbosity level")
DEFINE_string(tmpdir, private_tmpdir?private_tmpdir:"/tmp","temporary directory")
void ShowUsage(bool long_usage)