diff options
| author | _ov4 <ov4@ov4.org> | 2026-09-02 04:19:08 +0000 |
|---|---|---|
| committer | _ov4 <ov4@ov4.org> | 2026-09-02 04:19:08 +0000 |
| commit | fc7eec4af8c35012effdb62992adc9b49b869c28 (patch) | |
| tree | 8949790dbc7033f189304d4b594cab5226f6f888 /src | |
| parent | 7d44fcb22f8c3817627815322e57dda893f3cab4 (diff) | |
better option sys
Diffstat (limited to 'src')
| -rw-r--r-- | src/main.cc | 33 | ||||
| -rw-r--r-- | src/option.cc | 32 | ||||
| -rw-r--r-- | src/util/option_parse.cc | 52 |
3 files changed, 102 insertions, 15 deletions
diff --git a/src/main.cc b/src/main.cc index 2132ccb..ed88912 100644 --- a/src/main.cc +++ b/src/main.cc @@ -36,21 +36,24 @@ int main(int argc, char **argv) dup2(1, 2); /* Parse the command line */ - while ((c = getopt(argc, argv, "hvp")) != EOF) { - switch (c) { - case 'h': /* print help message */ - usage(); - break; - case 'v': /* emit additional diagnostic info */ - verbose = true; - break; - case 'p': /* don't print a prompt */ - emit_prompt = 0; /* handy for automatic testing */ - break; - default: - usage(); - } - } + + exe_option(argv); + + // while ((c = getopt(argc, argv, "hvp")) != EOF) { + // switch (c) { + // case 'h': /* print help message */ + // usage(); + // break; + // case 'v': /* emit additional diagnostic info */ + // verbose = true; + // break; + // case 'p': /* don't print a prompt */ + // emit_prompt = 0; /* handy for automatic testing */ + // break; + // default: + // usage(); + // } + // } diff --git a/src/option.cc b/src/option.cc new file mode 100644 index 0000000..552d83f --- /dev/null +++ b/src/option.cc @@ -0,0 +1,32 @@ +#include "option.h" + +#include <string> +#include <iostream> + +#include "global.h" +#include "util/io.h" + +using namespace std; + +namespace ov4::option +{ + +void v(string s) +{ + if (s == "" || s == "true" || s == "1") + { + ov4::verbose = true; + LOG << "verbose = true" << endl; + return; + } + if (s == "false" || s == "0") + { + ov4::verbose = false; + LOG << "verbose = flase" << endl; + return; + } + LOG << "-v: invalid value" << endl; +} + +} + diff --git a/src/util/option_parse.cc b/src/util/option_parse.cc new file mode 100644 index 0000000..f9185fb --- /dev/null +++ b/src/util/option_parse.cc @@ -0,0 +1,52 @@ +#include "util/option_parse.h" + +#include <iostream> +#include <string> +#include <vector> +#include <unordered_map> +#include <functional> +#include <utility> + +#include "all.h" + +using namespace std; + +const char option_key_value_split = '='; +constexpr char option_prefix = '-'; + +namespace ov4 +{ + +void exe_option(char **c_argv) +{ + vector<string> argv; + argv2string(&argv, c_argv); + + for (auto c : argv) + { + pair<string, string> key_value = option_split(c); + if (key_value.first != "") + { + if (option_list.find(key_value.first) == option_list.end()) + { + cerr << key_value.first << ": option not fund" << endl; + continue; + } + option_list.at(key_value.first)(key_value.second); + } + } +} + +pair<string, string> option_split(string s) +{ + if (s.size() == 0) return make_pair("", ""); + if (s[0] != option_prefix) return make_pair("", ""); + size_t pos = s.find(option_key_value_split); + if (pos == string::npos) return make_pair(s, ""); + if (pos == s.size()+1) return make_pair(s.substr(0, pos), ""); + string key = s.substr(0, pos); + string value = s.substr(pos+1); + return make_pair(key, value); +} + +} |
