From 9bbba091396922093687d11a181e5886c42c5dfd Mon Sep 17 00:00:00 2001 From: Reid Spencer Date: Tue, 16 Nov 2004 06:11:52 +0000 Subject: [PATCH] Per code review: *Implement/Document the cl::extrahelp feature instead of the MoreHelp ptr. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@17871 91177308-0d34-0410-b5e6-96231b3b80d8 --- docs/CommandLine.html | 30 ++++++++++++++++++++++++++++++ include/llvm/Support/CommandLine.h | 20 +++++++++++++------- lib/Support/CommandLine.cpp | 29 ++++++++++++++++++++++++----- 3 files changed, 67 insertions(+), 12 deletions(-) diff --git a/docs/CommandLine.html b/docs/CommandLine.html index 531c0f899c9..c5fa4d36f1e 100644 --- a/docs/CommandLine.html +++ b/docs/CommandLine.html @@ -2,6 +2,7 @@ "http://www.w3.org/TR/html4/strict.dtd"> + CommandLine 2.0 Library Manual @@ -61,6 +62,7 @@
  • The cl::opt class
  • The cl::list class
  • The cl::alias class
  • +
  • The cl::extrahelp class
  • Builtin parsers @@ -1519,6 +1521,34 @@ the conversion from string to data.

    + + + +
    + +

    The cl::extrahelp class is a nontemplated class that allows extra +help text to be printed out for the --help option.

    + +
    +namespace cl {
    +  struct extrahelp;
    +}
    +
    + +

    To use the extrahelp, simply construct one with a const char* +parameter to the constructor. The text passed to the constructor will be printed +at the bottom of the help message, verbatim. Note that multiple +cl::extrahelp can be used but this practice is discouraged. If +your tool needs to print additional help information, put all that help into a +single cl::extrahelp instance.

    +

    For example:

    +
    +  cl::extrahelp("\nADDITIONAL HELP:\n\n  This is the extra help\n");
    +
    +
    +
    Builtin parsers diff --git a/include/llvm/Support/CommandLine.h b/include/llvm/Support/CommandLine.h index 4d5dccd38c0..3b4eda587aa 100644 --- a/include/llvm/Support/CommandLine.h +++ b/include/llvm/Support/CommandLine.h @@ -1046,13 +1046,19 @@ struct aliasopt { void apply(alias &A) const { A.setAliasFor(Opt); } }; -/// Permit the tool to provide additional help output after the normal -/// help output. To use this, create a function that returns void and -/// takes no arguments. Assign its address to cl::MoreHelp. If set, -/// this function will be called just before the CommandLine exits -/// after printing the help. -/// @brief Optional pointer to additional help function -extern void (*MoreHelp)(); +// extrahelp - provide additional help at the end of the normal help +// output. All occurrences of cl::extrahelp will be accumulated and +// printed to std::cerr at the end of the regular help, just before +// exit is called. +struct extrahelp { + const char * morehelp; + extrahelp(const char* help); +}; + +// This function just prints the help message, exactly the same way as if the +// --help option had been given on the command line. +// NOTE: THIS FUNCTION TERMINATES THE PROGRAM! +void PrintHelpMessage(); } // End namespace cl diff --git a/lib/Support/CommandLine.cpp b/lib/Support/CommandLine.cpp index ad82c849479..15fd19591a0 100644 --- a/lib/Support/CommandLine.cpp +++ b/lib/Support/CommandLine.cpp @@ -838,7 +838,15 @@ void generic_parser_base::printOptionInfo(const Option &O, // If this variable is set, it is a pointer to a function that the user wants // us to call after we print out the help info. Basically a hook to allow // additional help to be printed. -void (*cl::MoreHelp)() = 0; +static std::vector* MoreHelp = 0; + +extrahelp::extrahelp(const char* Help) + : morehelp(Help) { + if (!MoreHelp) { + MoreHelp = new std::vector; + } + MoreHelp->push_back(Help); +} namespace { @@ -913,11 +921,16 @@ public: for (unsigned i = 0, e = Options.size(); i != e; ++i) Options[i].second->printOptionInfo(MaxArgLen); - // Call the user's hook so help output can be extended. - if (MoreHelp != 0) - (*MoreHelp)(); + // Print any extra help the user has declared. If MoreHelp is not null, + // then the user used at least one cl::extrahelp instance to provide + // additional help. We just print it out now. + if (MoreHelp != 0) { + for (std::vector::iterator I = MoreHelp->begin(), + E = MoreHelp->end(); I != E; ++I) + std::cerr << *I; + } - // Halt the program if help information is printed + // Halt the program since help information was printed exit(1); } }; @@ -954,4 +967,10 @@ cl::opt > VersOp("version", cl::desc("display the version"), cl::location(VersionPrinterInstance), cl::ValueDisallowed); + } // End anonymous namespace + +// Utility function for printing the help message. +void cl::PrintHelpMessage() { + NormalPrinter = true; +} -- 2.34.1