diff options
author | Laurent Pinchart <laurent.pinchart@ideasonboard.com> | 2021-07-07 03:26:43 +0300 |
---|---|---|
committer | Laurent Pinchart <laurent.pinchart@ideasonboard.com> | 2021-07-22 17:13:22 +0300 |
commit | b53f68e66ccfe67ca8b4ff4f7235a66fcfae01de (patch) | |
tree | 7bc6f8b13a566164f5188f510c92f568cdf9964c | |
parent | c71691e66cb463dffe749b201724877449e67866 (diff) |
cam: options: Move key string left in usage() for key-value parser
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
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
-rw-r--r-- | src/cam/options.cpp | 28 | ||||
-rw-r--r-- | 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 350c8084..379b68c3 100644 --- a/src/cam/options.cpp +++ b/src/cam/options.cpp @@ -410,27 +410,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) @@ -442,14 +445,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; @@ -917,6 +919,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 4418e201..5c51a94c 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_; |