[libcamera-devel] [PATCH 3/3] cam: options: Add support for repeatable options
Laurent Pinchart
laurent.pinchart at ideasonboard.com
Tue Mar 26 07:28:21 CET 2019
Hi Niklas,
Thank you for the patch.
On Tue, Mar 26, 2019 at 12:47:36AM +0100, Niklas Söderlund wrote:
> 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 that tan option is
s/tan/that/?
> repeatable.
>
> Signed-off-by: Niklas Söderlund <niklas.soderlund at ragnatech.se>
> ---
> src/cam/options.cpp | 21 +++++++++++++++------
> src/cam/options.h | 5 +++--
> 2 files changed, 18 insertions(+), 8 deletions(-)
>
> diff --git a/src/cam/options.cpp b/src/cam/options.cpp
> index 0dec154815d3cad5..0fdde9d84ba0de0e 100644
> --- a/src/cam/options.cpp
> +++ b/src/cam/options.cpp
> @@ -96,7 +96,11 @@ bool OptionsBase<T>::parseValue(const T &opt, const Option &option,
> break;
> }
>
> - values_[opt] = value;
> + if (option.array)
> + values_[opt].add(value);
> + else
> + values_[opt] = value;
I would be tempted to overload the [] operator for values_ to just do
the right thing depending on the type, but I think it would be bother
overkill and confusing. Still tempting to play with the available toys
though :-)
> +
> return true;
> }
>
> @@ -128,7 +132,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;
> }
>
> @@ -336,7 +340,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.
> @@ -354,16 +358,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;
> @@ -461,6 +465,8 @@ void OptionsParser::usage()
> length += 1 + strlen(option.argumentName);
> if (option.argument == ArgumentOptional)
> length += 2;
> + if (option.array)
> + length += 4;
>
> if (length > indent)
> indent = length;
> @@ -494,6 +500,9 @@ void OptionsParser::usage()
> argument += "]";
> }
>
> + if (option.array)
> + 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 6a887416c0070c41..1dac15ea90f2ffd2 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 array;
Maybe isArray ?
I think the rest is fine. How does the help output look like ?
>
> 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();
--
Regards,
Laurent Pinchart
More information about the libcamera-devel
mailing list