From fc7eec4af8c35012effdb62992adc9b49b869c28 Mon Sep 17 00:00:00 2001 From: _ov4 Date: Wed, 2 Sep 2026 04:19:08 +0000 Subject: better option sys --- src/main.cc | 33 ++++++++++++++++-------------- src/option.cc | 32 +++++++++++++++++++++++++++++ src/util/option_parse.cc | 52 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 102 insertions(+), 15 deletions(-) create mode 100644 src/option.cc create mode 100644 src/util/option_parse.cc (limited to 'src') 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 +#include + +#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 +#include +#include +#include +#include +#include + +#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 argv; + argv2string(&argv, c_argv); + + for (auto c : argv) + { + pair 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 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); +} + +} -- cgit v1.3.1-4-g156e