26 #include <string_view> 31 static const char *private_tmpdir = getenv(
"TMPDIR");
35 DEFINE_bool(helpshort,
false,
"show brief usage information");
36 DEFINE_string(tmpdir, private_tmpdir ? private_tmpdir :
"/tmp",
37 "temporary directory");
39 static std::string flag_usage;
40 static std::string prog_src;
43 static void SetProgSrc(
const char *src) {
48 static constexpr std::string_view kMainSuffix =
"-main.cc";
49 const int prefix_length = prog_src.size() - kMainSuffix.size();
50 if (prefix_length > 0 &&
51 std::string_view(prog_src).substr(prefix_length) == kMainSuffix) {
52 static constexpr
size_t kDashMainSize = std::string_view(
"-main").size();
53 prog_src.erase(prefix_length, kDashMainSize);
57 void SetFlags(
const char *usage,
int *argc,
char ***argv,
58 bool remove_flags,
const char *src) {
63 for (; index < *argc; ++index) {
64 std::string_view argval = (*argv)[index];
65 if (argval[0] !=
'-' || argval ==
"-")
break;
66 while (argval[0] ==
'-') argval.remove_prefix(1);
67 std::string arg(argval);
70 auto pos = argval.find(
'=');
71 if (pos != std::string::npos) {
72 arg = argval.substr(0, pos);
73 val = argval.substr(pos + 1);
76 if (bool_register->SetFlag(arg, val))
79 if (string_register->SetFlag(arg, val))
continue;
81 if (int32_register->SetFlag(arg, val))
continue;
83 if (int64_register->SetFlag(arg, val))
continue;
85 if (uint64_register->SetFlag(arg, val))
continue;
87 if (double_register->SetFlag(arg, val))
continue;
88 LOG(FATAL) <<
"SetFlags: Bad option: " << (*argv)[index];
91 for (
auto i = 0; i < *argc - index; ++i) {
92 (*argv)[i + 1] = (*argv)[i + index];
100 if (FST_FLAGS_helpshort) {
108 static void ShowUsageRestrict(
109 const std::set<std::pair<std::string, std::string>> &usage_set,
110 const std::string &src,
bool in_src,
bool show_file) {
111 std::string old_file;
112 bool file_out =
false;
113 bool usage_out =
false;
114 for (
const auto &pair : usage_set) {
115 const auto &file = pair.first;
116 const auto &usage = pair.second;
117 bool match = file == src;
118 if ((match && !in_src) || (!match && in_src))
continue;
119 if (file != old_file) {
121 if (file_out) std::cout << std::endl;
122 std::cout <<
"Flags from: " << file << std::endl;
127 std::cout << usage << std::endl;
130 if (usage_out) std::cout << std::endl;
134 std::cerr <<
"Memory allocation failed" << std::endl;
139 std::set<std::pair<std::string, std::string>> usage_set;
140 std::cout << flag_usage << std::endl;
142 bool_register->GetUsage(&usage_set);
144 string_register->GetUsage(&usage_set);
146 int32_register->GetUsage(&usage_set);
148 int64_register->GetUsage(&usage_set);
150 uint64_register->GetUsage(&usage_set);
152 double_register->GetUsage(&usage_set);
153 if (!prog_src.empty()) {
154 std::cout <<
"PROGRAM FLAGS:" << std::endl << std::endl;
155 ShowUsageRestrict(usage_set, prog_src,
true,
false);
157 if (!long_usage)
return;
158 if (!prog_src.empty()) {
159 std::cout <<
"LIBRARY FLAGS:" << std::endl << std::endl;
161 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)