[{"id":1118,"web_url":"https://patchwork.libcamera.org/comment/1118/","msgid":"<20190323143136.GM4587@pendragon.ideasonboard.com>","date":"2019-03-23T14:31:36","subject":"Re: [libcamera-devel] [RFC 3/4] cam: options: Add parsing of\n\tmultiple instances of the same option","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi Niklas,\n\nThank you for the patch.\n\nOn Fri, Mar 22, 2019 at 02:53:48AM +0100, Niklas Söderlund wrote:\n> Add the ability to allow storing multiple instances of the same option.\n\n\"Allow multiple instances of the same option.\"\n\nAnd this actually just duplicates the subject line, so maybe you need\nsomething else :-)\n\n> Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>\n> ---\n>  src/cam/options.cpp | 12 ++++++------\n>  src/cam/options.h   |  5 +++--\n>  2 files changed, 9 insertions(+), 8 deletions(-)\n> \n> diff --git a/src/cam/options.cpp b/src/cam/options.cpp\n> index 7995a9b359764ec7..e9dcd0c39cdc50ce 100644\n> --- a/src/cam/options.cpp\n> +++ b/src/cam/options.cpp\n> @@ -96,7 +96,7 @@ bool OptionsBase<T>::parseValue(const T &opt, const Option &option,\n>  \t\tbreak;\n>  \t}\n>  \n> -\tvalues_[opt] = value;\n> +\tvalues_[opt] = option.array ? OptionValue(value, values_[opt]) : value;\n\nThis is the part that bothers me, as explained in the review of 2/4.\n\nYou're also missing an update for the help text generation, options that\naccept multiple instances should be marked as such.\n\nApart from that the patch looks good to me.\n\n>  \treturn true;\n>  }\n>  \n> @@ -128,7 +128,7 @@ bool KeyValueParser::addOption(const char *name, OptionType type,\n>  \t\treturn false;\n>  \n>  \toptionsMap_[name] = Option({ 0, type, name, argument, nullptr,\n> -\t\t\t\t     help, nullptr });\n> +\t\t\t\t     help, nullptr, false });\n>  \treturn true;\n>  }\n>  \n> @@ -338,7 +338,7 @@ std::vector<OptionValue> OptionValue::toArray() const\n>  \n>  bool OptionsParser::addOption(int opt, OptionType type, const char *help,\n>  \t\t\t      const char *name, OptionArgument argument,\n> -\t\t\t      const char *argumentName)\n> +\t\t\t      const char *argumentName, bool array)\n>  {\n>  \t/*\n>  \t * Options must have at least a short or long name, and a text message.\n> @@ -356,16 +356,16 @@ bool OptionsParser::addOption(int opt, OptionType type, const char *help,\n>  \t\treturn false;\n>  \n>  \toptions_.push_back(Option({ opt, type, name, argument, argumentName,\n> -\t\t\t\t    help, nullptr }));\n> +\t\t\t\t    help, nullptr, array }));\n>  \toptionsMap_[opt] = &options_.back();\n>  \treturn true;\n>  }\n>  \n>  bool OptionsParser::addOption(int opt, KeyValueParser *parser, const char *help,\n> -\t\t\t      const char *name)\n> +\t\t\t      const char *name, bool array)\n>  {\n>  \tif (!addOption(opt, OptionKeyValue, help, name, ArgumentRequired,\n> -\t\t       \"key=value[,key=value,...]\"))\n> +\t\t       \"key=value[,key=value,...]\", array))\n>  \t\treturn false;\n>  \n>  \toptions_.back().keyValueParser = parser;\n> diff --git a/src/cam/options.h b/src/cam/options.h\n> index 789ba36187dd1fc3..922db4650b49117d 100644\n> --- a/src/cam/options.h\n> +++ b/src/cam/options.h\n> @@ -36,6 +36,7 @@ struct Option {\n>  \tconst char *argumentName;\n>  \tconst char *help;\n>  \tKeyValueParser *keyValueParser;\n> +\tbool array;\n>  \n>  \tbool hasShortOption() const { return isalnum(opt); }\n>  \tbool hasLongOption() const { return name != nullptr; }\n> @@ -125,9 +126,9 @@ public:\n>  \tbool addOption(int opt, OptionType type, const char *help,\n>  \t\t       const char *name = nullptr,\n>  \t\t       OptionArgument argument = ArgumentNone,\n> -\t\t       const char *argumentName = nullptr);\n> +\t\t       const char *argumentName = nullptr, bool array = false);\n>  \tbool addOption(int opt, KeyValueParser *parser, const char *help,\n> -\t\t       const char *name = nullptr);\n> +\t\t       const char *name = nullptr, bool array = false);\n>  \n>  \tOptions parse(int argc, char *argv[]);\n>  \tvoid usage();","headers":{"Return-Path":"<laurent.pinchart@ideasonboard.com>","Received":["from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id AC63C610B6\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tSat, 23 Mar 2019 15:31:49 +0100 (CET)","from pendragon.ideasonboard.com\n\t(p5269001-ipngn11702marunouchi.tokyo.ocn.ne.jp [114.158.195.1])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 17EA922;\n\tSat, 23 Mar 2019 15:31:47 +0100 (CET)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1553351509;\n\tbh=Oux3srvNgAjaDCXS/oK4Pe4ExOcDNCd8qj7GbytEmcg=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=tCi/xlRnGS5Jz4uotekkKL4BUCL0Py66OiLiuNUMXUMhKpdxtyosY0J78iAyfOzv/\n\trBIRJtqX97w6xZngkJbUpWDLAGJH6OdMdWRmREyYGv1BSeiqI0SUvu4+q5GhbXAAzy\n\tjwSgfOv6O1uDgCTVDC55Bm9VtXmPMGZpYHrLLCn0=","Date":"Sat, 23 Mar 2019 16:31:36 +0200","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"Niklas =?utf-8?q?S=C3=B6derlund?= <niklas.soderlund@ragnatech.se>","Cc":"libcamera-devel@lists.libcamera.org","Message-ID":"<20190323143136.GM4587@pendragon.ideasonboard.com>","References":"<20190322015349.14934-1-niklas.soderlund@ragnatech.se>\n\t<20190322015349.14934-4-niklas.soderlund@ragnatech.se>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","Content-Transfer-Encoding":"8bit","In-Reply-To":"<20190322015349.14934-4-niklas.soderlund@ragnatech.se>","User-Agent":"Mutt/1.10.1 (2018-07-13)","Subject":"Re: [libcamera-devel] [RFC 3/4] cam: options: Add parsing of\n\tmultiple instances of the same option","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.23","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","X-List-Received-Date":"Sat, 23 Mar 2019 14:31:49 -0000"}}]