yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
flag.cc
Go to the documentation of this file.
1#include "flag.h"
2
3#include <cstdlib>
4#include <iostream>
5
6#include "yaze_config.h"
7
8namespace yaze {
9namespace util {
10
11namespace detail {
12
13[[noreturn]] void FlagParseFatal(const std::string& message) {
14 std::cerr << "[Flag Parser] " << message << std::endl;
15 std::exit(EXIT_FAILURE);
16}
17
18} // namespace detail
19
20void FlagParser::Parse(std::vector<std::string>* tokens) {
21 std::vector<std::string> leftover;
22 leftover.reserve(tokens->size());
23
24 for (size_t i = 0; i < tokens->size(); i++) {
25 const std::string& token = (*tokens)[i];
26 if (token.rfind("--", 0) == 0) {
27 // Found a token that starts with "--".
28 std::string flag_name;
29 std::string value_string;
30 if (!ExtractFlagAndValue(token, &flag_name, &value_string)) {
31 // If no value found after '=', see if next token is a value.
32 if ((i + 1) < tokens->size()) {
33 const std::string& next_token = (*tokens)[i + 1];
34 // If next token is NOT another flag, treat it as the value.
35 if (next_token.rfind("--", 0) != 0) {
36 value_string = next_token;
37 i++;
38 } else {
39 // If no explicit value, treat it as boolean 'true'.
40 value_string = "true";
41 }
42 } else {
43 value_string = "true";
44 }
45 flag_name = token;
46 }
47
48 // Attempt to parse the flag (strip leading dashes in the registry).
49 IFlag* flag_ptr = registry_->GetFlag(flag_name);
50 if (!flag_ptr) {
51 detail::FlagParseFatal("Unrecognized flag: " + flag_name);
52 }
53
54 // Set the parsed value on the matching flag.
55 flag_ptr->ParseValue(value_string);
56 } else if (token.rfind("-", 0) == 0) {
57 if (token == "-v" || token == "-version") {
58 std::cout << "Version: " << YAZE_VERSION_MAJOR << "."
59 << YAZE_VERSION_MINOR << "." << YAZE_VERSION_PATCH << "\n";
60 exit(0);
61 }
62
63 // Check for -h or -help
64 if (token == "-h" || token == "-help") {
65 std::cout << "Available flags:\n";
66 for (const auto& flag :
68 std::cout << flag->name() << ": " << flag->help() << "\n";
69 }
70 exit(0);
71 }
72
73 std::string flag_name;
74 if (!ExtractFlag(token, &flag_name)) {
75 detail::FlagParseFatal("Unrecognized flag: " + token);
76 }
77
78 } else {
79 leftover.push_back(token);
80 }
81 }
82 *tokens = leftover;
83}
84
85bool FlagParser::ExtractFlagAndValue(const std::string& token,
86 std::string* flag_name,
87 std::string* value_string) {
88 const size_t eq_pos = token.find('=');
89 if (eq_pos == std::string::npos) {
90 return false;
91 }
92 *flag_name = token.substr(0, eq_pos);
93 *value_string = token.substr(eq_pos + 1);
94 return true;
95}
96
97bool FlagParser::ExtractFlag(const std::string& token, std::string* flag_name) {
98 if (token.rfind("-", 0) == 0) {
99 *flag_name = token;
100 return true;
101 }
102 return false;
103}
104
105} // namespace util
106} // namespace yaze
FlagRegistry * registry_
Definition flag.h:153
bool ExtractFlagAndValue(const std::string &token, std::string *flag_name, std::string *value_string)
Definition flag.cc:85
void Parse(int argc, char **argv)
Definition flag.h:139
bool ExtractFlag(const std::string &token, std::string *flag_name)
Definition flag.cc:97
IFlag * GetFlag(const std::string &name) const
Definition flag.h:97
std::vector< IFlag * > AllFlags() const
Definition flag.h:106
virtual void ParseValue(const std::string &text)=0
void FlagParseFatal(const std::string &message)
Definition flag.cc:13
FlagRegistry * global_flag_registry()
Definition flag.h:119