summaryrefslogtreecommitdiff
path: root/src/cam/options.cpp
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>2019-03-23 06:05:46 +0200
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>2019-03-27 18:26:15 +0200
commitf8386836dfda04c626e63ba9d64c1a4f63867dfa (patch)
tree087c476c791cca82602f19fec0d372ba1e7abbbf /src/cam/options.cpp
parent3f906920e4d448441c442be1ce6c7376e33d4237 (diff)
cam: Separate options valid() and empty()
An empty option list is not necessarily an error. Add a new empty() function to test the option list for emptiness, and modify the valid() function to only notify parsing errors. As a side effect this allows accessing partially parsed options, which may be useful in the future. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Acked-by: Jacopo Mondi <jacopo@jmondi.org> Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Diffstat (limited to 'src/cam/options.cpp')
-rw-r--r--src/cam/options.cpp34
1 files changed, 15 insertions, 19 deletions
diff --git a/src/cam/options.cpp b/src/cam/options.cpp
index 92b6b8ef..172d40f7 100644
--- a/src/cam/options.cpp
+++ b/src/cam/options.cpp
@@ -41,9 +41,15 @@ const char *Option::typeName() const
*/
template<typename T>
+bool OptionsBase<T>::empty() const
+{
+ return values_.empty();
+}
+
+template<typename T>
bool OptionsBase<T>::valid() const
{
- return !values_.empty();
+ return valid_;
}
template<typename T>
@@ -105,12 +111,6 @@ bool OptionsBase<T>::parseValue(const T &opt, const Option &option,
return true;
}
-template<typename T>
-void OptionsBase<T>::clear()
-{
- values_.clear();
-}
-
template class OptionsBase<int>;
template class OptionsBase<std::string>;
@@ -170,21 +170,18 @@ KeyValueParser::Options KeyValueParser::parse(const char *arguments)
if (optionsMap_.find(key) == optionsMap_.end()) {
std::cerr << "Invalid option " << key << std::endl;
- options.clear();
- break;
+ return options;
}
OptionArgument arg = optionsMap_[key].argument;
if (value.empty() && arg == ArgumentRequired) {
std::cerr << "Option " << key << " requires an argument"
<< std::endl;
- options.clear();
- break;
+ return options;
} else if (!value.empty() && arg == ArgumentNone) {
std::cerr << "Option " << key << " takes no argument"
<< std::endl;
- options.clear();
- break;
+ return options;
}
const Option &option = optionsMap_[key];
@@ -192,11 +189,11 @@ KeyValueParser::Options KeyValueParser::parse(const char *arguments)
std::cerr << "Failed to parse '" << value << "' as "
<< option.typeName() << " for option " << key
<< std::endl;
- options.clear();
- break;
+ return options;
}
}
+ options.valid_ = true;
return options;
}
@@ -438,19 +435,18 @@ OptionsParser::Options OptionsParser::parse(int argc, char **argv)
std::cerr << argv[optind - 1] << std::endl;
usage();
- options.clear();
- break;
+ return options;
}
const Option &option = *optionsMap_[c];
if (!options.parseValue(c, option, optarg)) {
parseValueError(option);
usage();
- options.clear();
- break;
+ return options;
}
}
+ options.valid_ = true;
return options;
}