[libcamera-devel] [PATCH 08/30] cam: options: Move key string left in usage() for key-value parser

Kieran Bingham kieran.bingham at ideasonboard.com
Mon Jul 12 15:41:47 CEST 2021


Hi Laurent,

On 07/07/2021 03:19, Laurent Pinchart wrote:
> When printing usage information for a key-value parser, the
> documentation of the keys and values is printed in the second column of
> the usage text:
> 
>   -s, --stream key=value[,key=value,...] ...            Set configuration of a camera stream
>                                                         height=integer          Height in pixels
>                                                         pixelformat=string      Pixel format name
>                                                         role=string             Role for the stream (viewfinder, video, still, raw)
>                                                         width=integer           Width in pixels
>   -h, --help                                            Display this help message
> 
> This results in long lines. Improve this by moving the key description
> to the first column, and aligning the value description as other option
> description text:
> 
>   -s, --stream key=value[,key=value,...] ...            Set configuration of a camera stream
>           height=integer                                Height in pixels
>           pixelformat=string                            Pixel format name
>           role=string                                   Role for the stream (viewfinder, video, still, raw)
>           width=integer                                 Width in pixels
>   -h, --help                                            Display this help message

Much nicer indeed.

Reviewed-by: Kieran Bingham <kieran.bingham at ideasonboard.com>


> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> ---
>  src/cam/options.cpp | 28 ++++++++++++++++++----------
>  src/cam/options.h   |  1 +
>  2 files changed, 19 insertions(+), 10 deletions(-)
> 
> diff --git a/src/cam/options.cpp b/src/cam/options.cpp
> index f4fd8973f97a..4a88c38fb154 100644
> --- a/src/cam/options.cpp
> +++ b/src/cam/options.cpp
> @@ -411,27 +411,30 @@ KeyValueParser::Options KeyValueParser::parse(const char *arguments)
>  	return options;
>  }
>  
> -void KeyValueParser::usage(int indent)
> +unsigned int KeyValueParser::maxOptionLength() const
>  {
> -	unsigned int space = 0;
> +	unsigned int maxLength = 0;
>  
>  	for (auto const &iter : optionsMap_) {
>  		const Option &option = iter.second;
> -		unsigned int length = 14;
> +		unsigned int length = 10 + strlen(option.name);
>  		if (option.argument != ArgumentNone)
>  			length += 1 + strlen(option.typeName());
>  		if (option.argument == ArgumentOptional)
>  			length += 2;
>  
> -		if (length > space)
> -			space = length;
> +		if (length > maxLength)
> +			maxLength = length;
>  	}
>  
> -	space = (space + 7) / 8 * 8;
> +	return maxLength;
> +}
>  
> +void KeyValueParser::usage(int indent)
> +{
>  	for (auto const &iter : optionsMap_) {
>  		const Option &option = iter.second;
> -		std::string argument = option.name;
> +		std::string argument = std::string("          ") + option.name;
>  
>  		if (option.argument != ArgumentNone) {
>  			if (option.argument == ArgumentOptional)
> @@ -443,14 +446,13 @@ void KeyValueParser::usage(int indent)
>  				argument += "]";
>  		}
>  
> -		std::cerr << std::setw(indent) << std::right << " "
> -			  << std::setw(space) << std::left << argument;
> +		std::cerr << std::setw(indent) << std::left << argument;
>  
>  		for (const char *help = option.help, *end = help; end;) {
>  			end = strchr(help, '\n');
>  			if (end) {
>  				std::cerr << std::string(help, end - help + 1);
> -				std::cerr << std::setw(indent + space) << " ";
> +				std::cerr << std::setw(indent) << " ";
>  				help = end + 1;
>  			} else {
>  				std::cerr << help << std::endl;
> @@ -918,6 +920,12 @@ void OptionsParser::usage()
>  
>  		if (length > indent)
>  			indent = length;
> +
> +		if (option->keyValueParser) {
> +			length = option->keyValueParser->maxOptionLength();
> +			if (length > indent)
> +				indent = length;
> +		}
>  	}
>  
>  	indent = (indent + 7) / 8 * 8;
> diff --git a/src/cam/options.h b/src/cam/options.h
> index 4418e201bf1f..5c51a94c2f37 100644
> --- a/src/cam/options.h
> +++ b/src/cam/options.h
> @@ -72,6 +72,7 @@ private:
>  	KeyValueParser &operator=(const KeyValueParser &) = delete;
>  
>  	friend class OptionsParser;
> +	unsigned int maxOptionLength() const;
>  	void usage(int indent);
>  
>  	std::map<std::string, Option> optionsMap_;
> 


More information about the libcamera-devel mailing list