[PATCH] Better output for long help strings for command-line options.

Rafael EspĂ­ndola rafael.espindola at gmail.com
Fri May 10 09:24:24 PDT 2013


please make printHelpStr static. LGTM with that.

On 10 May 2013 11:03, Alexander Kornienko <alexfh at google.com> wrote:
> Hi atrick,
>
> This patch allows using \n inside long help strings for command-line
> options, so that all lines are equally indented. This is not a perfect solution,
> as we don't (and probably don't want to) know about terminal width, but it
> allows to format long help strings somehow readable without manually padding
> them with spaces. A motivating example is -help output from clang-format (source
> code in tools/clang-format/ClangFormat.cpp, see cl options offset, length,
> style, and dump-config).
>
> http://llvm-reviews.chandlerc.com/D779
>
> Files:
>   docs/CommandLine.rst
>   lib/Support/CommandLine.cpp
>
> Index: docs/CommandLine.rst
> ===================================================================
> --- docs/CommandLine.rst
> +++ docs/CommandLine.rst
> @@ -930,7 +930,8 @@
>  .. _cl::desc(...):
>
>  * The **cl::desc** attribute specifies a description for the option to be
> -  shown in the ``-help`` output for the program.
> +  shown in the ``-help`` output for the program. This attribute supports
> +  multi-line descriptions with lines separated by '\n'.
>
>  .. _cl::value_desc:
>
> Index: lib/Support/CommandLine.cpp
> ===================================================================
> --- lib/Support/CommandLine.cpp
> +++ lib/Support/CommandLine.cpp
> @@ -913,11 +913,20 @@
>    return std::strlen(ArgStr)+6;
>  }
>
> +void printHelpStr(StringRef HelpStr, size_t Indent,
> +                  size_t FirstLineIndentedBy) {
> +  std::pair<StringRef, StringRef> Split = HelpStr.split('\n');
> +  outs().indent(Indent - FirstLineIndentedBy) << " - " << Split.first << "\n";
> +  while (!Split.second.empty()) {
> +    Split = Split.second.split('\n');
> +    outs().indent(Indent) << Split.first << "\n";
> +  }
> +}
> +
>  // Print out the option for the alias.
>  void alias::printOptionInfo(size_t GlobalWidth) const {
> -  size_t L = std::strlen(ArgStr);
>    outs() << "  -" << ArgStr;
> -  outs().indent(GlobalWidth-L-6) << " - " << HelpStr << "\n";
> +  printHelpStr(HelpStr, GlobalWidth, std::strlen(ArgStr) + 6);
>  }
>
>  //===----------------------------------------------------------------------===//
> @@ -946,7 +955,7 @@
>    if (const char *ValName = getValueName())
>      outs() << "=<" << getValueStr(O, ValName) << '>';
>
> -  outs().indent(GlobalWidth-getOptionWidth(O)) << " - " << O.HelpStr << '\n';
> +  printHelpStr(O.HelpStr, GlobalWidth, getOptionWidth(O));
>  }
>
>  void basic_parser_impl::printOptionName(const Option &O,
> @@ -1087,9 +1096,8 @@
>  void generic_parser_base::printOptionInfo(const Option &O,
>                                            size_t GlobalWidth) const {
>    if (O.hasArgStr()) {
> -    size_t L = std::strlen(O.ArgStr);
>      outs() << "  -" << O.ArgStr;
> -    outs().indent(GlobalWidth-L-6) << " - " << O.HelpStr << '\n';
> +    printHelpStr(O.HelpStr, GlobalWidth, std::strlen(O.ArgStr) + 6);
>
>      for (unsigned i = 0, e = getNumOptions(); i != e; ++i) {
>        size_t NumSpaces = GlobalWidth-strlen(getOption(i))-8;
> @@ -1100,9 +1108,9 @@
>      if (O.HelpStr[0])
>        outs() << "  " << O.HelpStr << '\n';
>      for (unsigned i = 0, e = getNumOptions(); i != e; ++i) {
> -      size_t L = std::strlen(getOption(i));
> -      outs() << "    -" << getOption(i);
> -      outs().indent(GlobalWidth-L-8) << " - " << getDescription(i) << '\n';
> +      const char *Option = getOption(i);
> +      outs() << "    -" << Option;
> +      printHelpStr(getDescription(i), GlobalWidth, std::strlen(Option) + 8);
>      }
>    }
>  }
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>



More information about the llvm-commits mailing list