[{"id":18118,"web_url":"https://patchwork.libcamera.org/comment/18118/","msgid":"<e2d997b9-a94a-d735-9785-12918d2061c5@ideasonboard.com>","date":"2021-07-12T13:41:47","subject":"Re: [libcamera-devel] [PATCH 08/30] cam: options: Move key string\n\tleft in usage() for key-value parser","submitter":{"id":4,"url":"https://patchwork.libcamera.org/api/people/4/","name":"Kieran Bingham","email":"kieran.bingham@ideasonboard.com"},"content":"Hi Laurent,\n\nOn 07/07/2021 03:19, Laurent Pinchart wrote:\n> When printing usage information for a key-value parser, the\n> documentation of the keys and values is printed in the second column of\n> the usage text:\n> \n>   -s, --stream key=value[,key=value,...] ...            Set configuration of a camera stream\n>                                                         height=integer          Height in pixels\n>                                                         pixelformat=string      Pixel format name\n>                                                         role=string             Role for the stream (viewfinder, video, still, raw)\n>                                                         width=integer           Width in pixels\n>   -h, --help                                            Display this help message\n> \n> This results in long lines. Improve this by moving the key description\n> to the first column, and aligning the value description as other option\n> description text:\n> \n>   -s, --stream key=value[,key=value,...] ...            Set configuration of a camera stream\n>           height=integer                                Height in pixels\n>           pixelformat=string                            Pixel format name\n>           role=string                                   Role for the stream (viewfinder, video, still, raw)\n>           width=integer                                 Width in pixels\n>   -h, --help                                            Display this help message\n\nMuch nicer indeed.\n\nReviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n\n\n> \n> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> ---\n>  src/cam/options.cpp | 28 ++++++++++++++++++----------\n>  src/cam/options.h   |  1 +\n>  2 files changed, 19 insertions(+), 10 deletions(-)\n> \n> diff --git a/src/cam/options.cpp b/src/cam/options.cpp\n> index f4fd8973f97a..4a88c38fb154 100644\n> --- a/src/cam/options.cpp\n> +++ b/src/cam/options.cpp\n> @@ -411,27 +411,30 @@ KeyValueParser::Options KeyValueParser::parse(const char *arguments)\n>  \treturn options;\n>  }\n>  \n> -void KeyValueParser::usage(int indent)\n> +unsigned int KeyValueParser::maxOptionLength() const\n>  {\n> -\tunsigned int space = 0;\n> +\tunsigned int maxLength = 0;\n>  \n>  \tfor (auto const &iter : optionsMap_) {\n>  \t\tconst Option &option = iter.second;\n> -\t\tunsigned int length = 14;\n> +\t\tunsigned int length = 10 + strlen(option.name);\n>  \t\tif (option.argument != ArgumentNone)\n>  \t\t\tlength += 1 + strlen(option.typeName());\n>  \t\tif (option.argument == ArgumentOptional)\n>  \t\t\tlength += 2;\n>  \n> -\t\tif (length > space)\n> -\t\t\tspace = length;\n> +\t\tif (length > maxLength)\n> +\t\t\tmaxLength = length;\n>  \t}\n>  \n> -\tspace = (space + 7) / 8 * 8;\n> +\treturn maxLength;\n> +}\n>  \n> +void KeyValueParser::usage(int indent)\n> +{\n>  \tfor (auto const &iter : optionsMap_) {\n>  \t\tconst Option &option = iter.second;\n> -\t\tstd::string argument = option.name;\n> +\t\tstd::string argument = std::string(\"          \") + option.name;\n>  \n>  \t\tif (option.argument != ArgumentNone) {\n>  \t\t\tif (option.argument == ArgumentOptional)\n> @@ -443,14 +446,13 @@ void KeyValueParser::usage(int indent)\n>  \t\t\t\targument += \"]\";\n>  \t\t}\n>  \n> -\t\tstd::cerr << std::setw(indent) << std::right << \" \"\n> -\t\t\t  << std::setw(space) << std::left << argument;\n> +\t\tstd::cerr << std::setw(indent) << std::left << argument;\n>  \n>  \t\tfor (const char *help = option.help, *end = help; end;) {\n>  \t\t\tend = strchr(help, '\\n');\n>  \t\t\tif (end) {\n>  \t\t\t\tstd::cerr << std::string(help, end - help + 1);\n> -\t\t\t\tstd::cerr << std::setw(indent + space) << \" \";\n> +\t\t\t\tstd::cerr << std::setw(indent) << \" \";\n>  \t\t\t\thelp = end + 1;\n>  \t\t\t} else {\n>  \t\t\t\tstd::cerr << help << std::endl;\n> @@ -918,6 +920,12 @@ void OptionsParser::usage()\n>  \n>  \t\tif (length > indent)\n>  \t\t\tindent = length;\n> +\n> +\t\tif (option->keyValueParser) {\n> +\t\t\tlength = option->keyValueParser->maxOptionLength();\n> +\t\t\tif (length > indent)\n> +\t\t\t\tindent = length;\n> +\t\t}\n>  \t}\n>  \n>  \tindent = (indent + 7) / 8 * 8;\n> diff --git a/src/cam/options.h b/src/cam/options.h\n> index 4418e201bf1f..5c51a94c2f37 100644\n> --- a/src/cam/options.h\n> +++ b/src/cam/options.h\n> @@ -72,6 +72,7 @@ private:\n>  \tKeyValueParser &operator=(const KeyValueParser &) = delete;\n>  \n>  \tfriend class OptionsParser;\n> +\tunsigned int maxOptionLength() const;\n>  \tvoid usage(int indent);\n>  \n>  \tstd::map<std::string, Option> optionsMap_;\n>","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 57681C3225\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon, 12 Jul 2021 13:41:50 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id C574268526;\n\tMon, 12 Jul 2021 15:41:49 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 46F9B68513\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 12 Jul 2021 15:41:49 +0200 (CEST)","from [192.168.0.20]\n\t(cpc89244-aztw30-2-0-cust3082.18-1.cable.virginm.net [86.31.172.11])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id CD692CC;\n\tMon, 12 Jul 2021 15:41:48 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"c0xhdBHe\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1626097308;\n\tbh=WYkRTLplMs8QC4Q3+PKYzFlZvXx/VNsr7UPOMOcYsh4=;\n\th=Subject:To:References:From:Date:In-Reply-To:From;\n\tb=c0xhdBHejU+tjB6pIVGI3rH4LGT/8ahzEtcgmxAvNicfu8AwyKEPYKEVk1qIaxqgy\n\t7krGmaLJihtalcPvYEwFulhy2upl75/FuKAVAGoC4dl0BWYwk5sldUrketndvDmCij\n\tmF6rYu/S2JUcGxUyIIZgdKLdLCekFpfodWSe8qK8=","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>,\n\tlibcamera-devel@lists.libcamera.org","References":"<20210707021941.20804-1-laurent.pinchart@ideasonboard.com>\n\t<20210707021941.20804-9-laurent.pinchart@ideasonboard.com>","From":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Message-ID":"<e2d997b9-a94a-d735-9785-12918d2061c5@ideasonboard.com>","Date":"Mon, 12 Jul 2021 14:41:47 +0100","User-Agent":"Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101\n\tThunderbird/78.11.0","MIME-Version":"1.0","In-Reply-To":"<20210707021941.20804-9-laurent.pinchart@ideasonboard.com>","Content-Type":"text/plain; charset=utf-8","Content-Language":"en-GB","Content-Transfer-Encoding":"7bit","Subject":"Re: [libcamera-devel] [PATCH 08/30] cam: options: Move key string\n\tleft in usage() for key-value parser","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","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>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]