[libcamera-devel] [RFC 3/4] cam: options: Add parsing of multiple instances of the same option

Niklas Söderlund niklas.soderlund at ragnatech.se
Fri Mar 22 02:53:48 CET 2019


Add the ability to allow storing multiple instances of the same option.

Signed-off-by: Niklas Söderlund <niklas.soderlund at ragnatech.se>
---
 src/cam/options.cpp | 12 ++++++------
 src/cam/options.h   |  5 +++--
 2 files changed, 9 insertions(+), 8 deletions(-)

diff --git a/src/cam/options.cpp b/src/cam/options.cpp
index 7995a9b359764ec7..e9dcd0c39cdc50ce 100644
--- a/src/cam/options.cpp
+++ b/src/cam/options.cpp
@@ -96,7 +96,7 @@ bool OptionsBase<T>::parseValue(const T &opt, const Option &option,
 		break;
 	}
 
-	values_[opt] = value;
+	values_[opt] = option.array ? OptionValue(value, values_[opt]) : value;
 	return true;
 }
 
@@ -128,7 +128,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;
 }
 
@@ -338,7 +338,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.
@@ -356,16 +356,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;
diff --git a/src/cam/options.h b/src/cam/options.h
index 789ba36187dd1fc3..922db4650b49117d 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;
 
 	bool hasShortOption() const { return isalnum(opt); }
 	bool hasLongOption() const { return name != nullptr; }
@@ -125,9 +126,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();
-- 
2.21.0



More information about the libcamera-devel mailing list