summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNiklas Söderlund <niklas.soderlund@ragnatech.se>2019-03-21 19:28:56 +0100
committerNiklas Söderlund <niklas.soderlund@ragnatech.se>2019-03-27 15:06:14 +0100
commit3f906920e4d448441c442be1ce6c7376e33d4237 (patch)
treedc9cc5085913c01d72d1e1e9b6e7c4afce6f0d80
parent2a608965f8cb4bb93522e9b22af840c688ec12a1 (diff)
cam: options: Add support for repeatable options
Add a flag to indicate if an option can be repeatable. If an option is repeatable it must be accessed thru the array interface, even if it's only specified once by the user. Also update the usage generator to indicate which options are repeatable. Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
-rw-r--r--src/cam/options.cpp21
-rw-r--r--src/cam/options.h5
2 files changed, 18 insertions, 8 deletions
diff --git a/src/cam/options.cpp b/src/cam/options.cpp
index 556e7623..92b6b8ef 100644
--- a/src/cam/options.cpp
+++ b/src/cam/options.cpp
@@ -97,7 +97,11 @@ bool OptionsBase<T>::parseValue(const T &opt, const Option &option,
break;
}
- values_[opt] = value;
+ if (option.isArray)
+ values_[opt].addValue(value);
+ else
+ values_[opt] = value;
+
return true;
}
@@ -129,7 +133,7 @@ bool KeyValueParser::addOption(const char *name, OptionType type,
return false;
optionsMap_[name] = Option({ 0, type, name, argument, nullptr,
- help, nullptr });
+ help, nullptr, false });
return true;
}
@@ -339,7 +343,7 @@ std::vector<OptionValue> OptionValue::toArray() const
bool OptionsParser::addOption(int opt, OptionType type, const char *help,
const char *name, OptionArgument argument,
- const char *argumentName)
+ const char *argumentName, bool array)
{
/*
* Options must have at least a short or long name, and a text message.
@@ -357,16 +361,16 @@ bool OptionsParser::addOption(int opt, OptionType type, const char *help,
return false;
options_.push_back(Option({ opt, type, name, argument, argumentName,
- help, nullptr }));
+ help, nullptr, array }));
optionsMap_[opt] = &options_.back();
return true;
}
bool OptionsParser::addOption(int opt, KeyValueParser *parser, const char *help,
- const char *name)
+ const char *name, bool array)
{
if (!addOption(opt, OptionKeyValue, help, name, ArgumentRequired,
- "key=value[,key=value,...]"))
+ "key=value[,key=value,...]", array))
return false;
options_.back().keyValueParser = parser;
@@ -464,6 +468,8 @@ void OptionsParser::usage()
length += 1 + strlen(option.argumentName);
if (option.argument == ArgumentOptional)
length += 2;
+ if (option.isArray)
+ length += 4;
if (length > indent)
indent = length;
@@ -497,6 +503,9 @@ void OptionsParser::usage()
argument += "]";
}
+ if (option.isArray)
+ argument += " ...";
+
std::cerr << std::setw(indent) << std::left << argument;
for (const char *help = option.help, *end = help; end; ) {
diff --git a/src/cam/options.h b/src/cam/options.h
index e0ff50af..6e3ef62e 100644
--- a/src/cam/options.h
+++ b/src/cam/options.h
@@ -36,6 +36,7 @@ struct Option {
const char *argumentName;
const char *help;
KeyValueParser *keyValueParser;
+ bool isArray;
bool hasShortOption() const { return isalnum(opt); }
bool hasLongOption() const { return name != nullptr; }
@@ -126,9 +127,9 @@ public:
bool addOption(int opt, OptionType type, const char *help,
const char *name = nullptr,
OptionArgument argument = ArgumentNone,
- const char *argumentName = nullptr);
+ const char *argumentName = nullptr, bool array = false);
bool addOption(int opt, KeyValueParser *parser, const char *help,
- const char *name = nullptr);
+ const char *name = nullptr, bool array = false);
Options parse(int argc, char *argv[]);
void usage();