diff options
| author | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2009-02-07 11:00:34 +0000 |
|---|---|---|
| committer | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2009-02-07 11:00:34 +0000 |
| commit | 2881dbe025d2002fc5260969cd0c402404713ebc (patch) | |
| tree | 4d30de40e909a9c9e9f3d2bdb0ad2748afc35922 /src/OptionHandlerImpl.h | |
| parent | bbb3589293139db527cf72f0a30e989fc2889a53 (diff) | |
2009-02-07 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Added OptionParser::parseArg() which internally uses getopt_long
to parse command-line options. All command-line options are now
configured by OptionHandler. No manual editing of struct option*
is required any more.
* src/NameMatchOptionHandler.h
* src/OptionHandler.h
* src/OptionHandlerFactory.cc
* src/OptionHandlerImpl.h
* src/OptionParser.cc
* src/OptionParser.h
* src/array_fun.h
* src/main.cc
* src/option_processing.cc
* test/OptionHandlerTest.cc
* test/OptionParserTest.cc
Diffstat (limited to 'src/OptionHandlerImpl.h')
| -rw-r--r-- | src/OptionHandlerImpl.h | 156 |
1 files changed, 103 insertions, 53 deletions
diff --git a/src/OptionHandlerImpl.h b/src/OptionHandlerImpl.h index b9160115..5d3b00d8 100644 --- a/src/OptionHandlerImpl.h +++ b/src/OptionHandlerImpl.h @@ -56,12 +56,14 @@ namespace aria2 { class NullOptionHandler : public OptionHandler { +private: + int _id; public: virtual ~NullOptionHandler() {} virtual bool canHandle(const std::string& optName) { return true; } - virtual void parse(Option* option, const std::string& arg) {} + virtual void parse(Option& option, const std::string& arg) {} virtual bool hasTag(const std::string& tag) const { return false; } @@ -78,23 +80,47 @@ public: virtual std::string createPossibleValuesString() const { return A2STR::NIL; } virtual bool isHidden() const { return true; } + + virtual OptionHandler::ARG_TYPE getArgType() const + { + return OptionHandler::NO_ARG; + } + + virtual int getOptionID() const + { + return _id; + } + + virtual void setOptionID(int id) + { + _id = id; + } + + virtual char getShortName() const + { + return 0; + } }; class BooleanOptionHandler : public NameMatchOptionHandler { public: BooleanOptionHandler(const std::string& optName, const std::string& description = NO_DESCRIPTION, - const std::string& defaultValue = NO_DEFAULT_VALUE): - NameMatchOptionHandler(optName, description, defaultValue) {} + const std::string& defaultValue = NO_DEFAULT_VALUE, + OptionHandler::ARG_TYPE argType = OptionHandler::REQ_ARG, + char shortName = 0): + NameMatchOptionHandler(optName, description, defaultValue, + argType, shortName) {} virtual ~BooleanOptionHandler() {} - virtual void parseArg(Option* option, const std::string& optarg) + virtual void parseArg(Option& option, const std::string& optarg) { - if(optarg == "true") { - option->put(_optName, V_TRUE); + if(optarg == "true" || + (_argType == OptionHandler::OPT_ARG && optarg.empty())) { + option.put(_optName, V_TRUE); } else if(optarg == "false") { - option->put(_optName, V_FALSE); + option.put(_optName, V_FALSE); } else { std::string msg = _optName+" "+_("must be either 'true' or 'false'."); throw FatalException(msg); @@ -115,13 +141,15 @@ public: IntegerRangeOptionHandler(const std::string& optName, const std::string& description, const std::string& defaultValue, - int32_t min, int32_t max): - NameMatchOptionHandler(optName, description, defaultValue), + int32_t min, int32_t max, + char shortName = 0): + NameMatchOptionHandler(optName, description, defaultValue, + OptionHandler::REQ_ARG, shortName), _min(min), _max(max) {} virtual ~IntegerRangeOptionHandler() {} - virtual void parseArg(Option* option, const std::string& optarg) + virtual void parseArg(Option& option, const std::string& optarg) { IntSequence seq = Util::parseIntRange(optarg); while(seq.hasNext()) { @@ -132,7 +160,7 @@ public: (StringFormat(msg.c_str(), Util::itos(_min).c_str(), Util::itos(_max).c_str()).str()); } - option->put(_optName, optarg); + option.put(_optName, optarg); } } @@ -152,22 +180,23 @@ public: const std::string& defaultValue = NO_DEFAULT_VALUE, int64_t min = -1, int64_t max = -1, - bool hidden = false): - NameMatchOptionHandler(optName, description, defaultValue, hidden), + char shortName = 0): + NameMatchOptionHandler(optName, description, defaultValue, + OptionHandler::REQ_ARG, shortName), _min(min), _max(max) {} virtual ~NumberOptionHandler() {} - virtual void parseArg(Option* option, const std::string& optarg) + virtual void parseArg(Option& option, const std::string& optarg) { int64_t num = Util::parseLLInt(optarg); parseArg(option, num); } - void parseArg(Option* option, int64_t number) + void parseArg(Option& option, int64_t number) { if((_min == -1 || _min <= number) && (_max == -1 || number <= _max)) { - option->put(_optName, Util::itos(number)); + option.put(_optName, Util::itos(number)); } else { std::string msg = _optName+" "; if(_min == -1 && _max != -1) { @@ -200,12 +229,13 @@ public: const std::string& defaultValue = NO_DEFAULT_VALUE, int64_t min = -1, int64_t max = -1, - bool hidden = false): - NumberOptionHandler(optName, description, defaultValue, min, max, hidden) {} + char shortName = 0): + NumberOptionHandler(optName, description, defaultValue, min, max, + shortName) {} virtual ~UnitNumberOptionHandler() {} - virtual void parseArg(Option* option, const std::string& optarg) + virtual void parseArg(Option& option, const std::string& optarg) { int64_t num = Util::getRealSize(optarg); NumberOptionHandler::parseArg(option, num); @@ -220,17 +250,19 @@ public: FloatNumberOptionHandler(const std::string& optName, const std::string& description = NO_DESCRIPTION, const std::string& defaultValue = NO_DEFAULT_VALUE, - double min = -1, double max = -1): - NameMatchOptionHandler(optName, description, defaultValue), + double min = -1, double max = -1, + char shortName = 0): + NameMatchOptionHandler(optName, description, defaultValue, + OptionHandler::REQ_ARG, shortName), _min(min), _max(max) {} virtual ~FloatNumberOptionHandler() {} - virtual void parseArg(Option* option, const std::string& optarg) + virtual void parseArg(Option& option, const std::string& optarg) { double number = strtod(optarg.c_str(), 0); if((_min < 0 || _min <= number) && (_max < 0 || number <= _max)) { - option->put(_optName, optarg); + option.put(_optName, optarg); } else { std::string msg = _optName+" "; if(_min < 0 && _max >= 0) { @@ -279,15 +311,17 @@ public: const std::string& description = NO_DESCRIPTION, const std::string& defaultValue = NO_DEFAULT_VALUE, const std::string& possibleValuesString = A2STR::NIL, - bool hidden = false): - NameMatchOptionHandler(optName, description, defaultValue, hidden), + OptionHandler::ARG_TYPE argType = OptionHandler::REQ_ARG, + char shortName = 0): + NameMatchOptionHandler(optName, description, defaultValue, argType, + shortName), _possibleValuesString(possibleValuesString) {} virtual ~DefaultOptionHandler() {} - virtual void parseArg(Option* option, const std::string& optarg) + virtual void parseArg(Option& option, const std::string& optarg) { - option->put(_optName, optarg); + option.put(_optName, optarg); } virtual std::string createPossibleValuesString() const @@ -306,18 +340,22 @@ public: const std::string& description, const std::string& defaultValue, const std::string& delim, - const std::string& possibleValuesString = A2STR::NIL): - NameMatchOptionHandler(optName, description, defaultValue), + const std::string& possibleValuesString = A2STR::NIL, + OptionHandler::ARG_TYPE argType = + OptionHandler::REQ_ARG, + char shortName = 0): + NameMatchOptionHandler(optName, description, defaultValue, argType, + shortName), _delim(delim), _possibleValuesString(possibleValuesString) {} virtual ~CumulativeOptionHandler() {} - virtual void parseArg(Option* option, const std::string& optarg) + virtual void parseArg(Option& option, const std::string& optarg) { - std::string value = option->get(_optName); + std::string value = option.get(_optName); value += optarg+_delim; - option->put(_optName, value); + option.put(_optName, value); } virtual std::string createPossibleValuesString() const @@ -333,15 +371,19 @@ public: ParameterOptionHandler(const std::string& optName, const std::string& description, const std::string& defaultValue, - const std::deque<std::string>& validParamValues): - NameMatchOptionHandler(optName, description, defaultValue), + const std::deque<std::string>& validParamValues, + char shortName = 0): + NameMatchOptionHandler(optName, description, defaultValue, + OptionHandler::REQ_ARG, shortName), _validParamValues(validParamValues) {} ParameterOptionHandler(const std::string& optName, const std::string& description, const std::string& defaultValue, - const std::string& validParamValue): - NameMatchOptionHandler(optName, description, defaultValue) + const std::string& validParamValue, + char shortName = 0): + NameMatchOptionHandler(optName, description, defaultValue, + OptionHandler::REQ_ARG, shortName) { _validParamValues.push_back(validParamValue); } @@ -350,8 +392,10 @@ public: const std::string& description, const std::string& defaultValue, const std::string& validParamValue1, - const std::string& validParamValue2): - NameMatchOptionHandler(optName, description, defaultValue) + const std::string& validParamValue2, + char shortName = 0): + NameMatchOptionHandler(optName, description, defaultValue, + OptionHandler::REQ_ARG, shortName) { _validParamValues.push_back(validParamValue1); _validParamValues.push_back(validParamValue2); @@ -362,8 +406,10 @@ public: const std::string& defaultValue, const std::string& validParamValue1, const std::string& validParamValue2, - const std::string& validParamValue3): - NameMatchOptionHandler(optName, description, defaultValue) + const std::string& validParamValue3, + char shortName = 0): + NameMatchOptionHandler(optName, description, defaultValue, + OptionHandler::REQ_ARG, shortName) { _validParamValues.push_back(validParamValue1); _validParamValues.push_back(validParamValue2); @@ -372,7 +418,7 @@ public: virtual ~ParameterOptionHandler() {} - virtual void parseArg(Option* option, const std::string& optarg) + virtual void parseArg(Option& option, const std::string& optarg) { std::deque<std::string>::const_iterator itr = std::find(_validParamValues.begin(), _validParamValues.end(), optarg); @@ -388,7 +434,7 @@ public: } throw FatalException(msg); } else { - option->put(_optName, optarg); + option.put(_optName, optarg); } } @@ -411,14 +457,16 @@ public: const std::string& description, const std::string& defaultValue, const std::string& hostOptionName, - const std::string& portOptionName): - NameMatchOptionHandler(optName, description, defaultValue), + const std::string& portOptionName, + char shortName = 0): + NameMatchOptionHandler(optName, description, defaultValue, + OptionHandler::REQ_ARG, shortName), _hostOptionName(hostOptionName), _portOptionName(portOptionName) {} virtual ~HostPortOptionHandler() {} - virtual void parseArg(Option* option, const std::string& optarg) + virtual void parseArg(Option& option, const std::string& optarg) { std::pair<std::string, std::string> proxy = Util::split(optarg, ":"); int32_t port = Util::parseInt(proxy.second); @@ -426,14 +474,14 @@ public: port <= 0 || 65535 < port) { throw FatalException(_("unrecognized proxy format")); } - option->put(_optName, optarg); + option.put(_optName, optarg); setHostAndPort(option, proxy.first, port); } - void setHostAndPort(Option* option, const std::string& hostname, uint16_t port) + void setHostAndPort(Option& option, const std::string& hostname, uint16_t port) { - option->put(_hostOptionName, hostname); - option->put(_portOptionName, Util::uitos(port)); + option.put(_hostOptionName, hostname); + option.put(_portOptionName, Util::uitos(port)); } virtual std::string createPossibleValuesString() const @@ -446,14 +494,16 @@ class HttpProxyOptionHandler : public NameMatchOptionHandler { public: HttpProxyOptionHandler(const std::string& optName, const std::string& description, - const std::string& defaultValue) + const std::string& defaultValue, + char shortName = 0) : - NameMatchOptionHandler(optName, description, defaultValue) + NameMatchOptionHandler(optName, description, defaultValue, + OptionHandler::REQ_ARG, shortName) {} virtual ~HttpProxyOptionHandler() {} - virtual void parseArg(Option* option, const std::string& optarg) + virtual void parseArg(Option& option, const std::string& optarg) { Request req; std::string url; @@ -463,7 +513,7 @@ public: url = "http://"+optarg; } if(req.setUrl(url)) { - option->put(_optName, url); + option.put(_optName, url); } else { throw FatalException(_("unrecognized proxy format")); } |
