CommandLine.cpp revision 0c0edf8afc35a42b15a24ebb5fa5f3fc674290ae
1dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner//===-- CommandLine.cpp - Command line parser implementation --------------===// 2dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner// 3dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner// This class implements a command line argument processor that is useful when 4dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner// creating a tool. It provides a simple, minimalistic interface that is easily 5dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner// extensible and supports nonlocal (library) command line options. 6dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner// 703fe1bd149b21855098e9cc9f959c8e8ca80693cChris Lattner// Note that rather than trying to figure out what this code does, you could try 803fe1bd149b21855098e9cc9f959c8e8ca80693cChris Lattner// reading the library documentation located in docs/CommandLine.html 903fe1bd149b21855098e9cc9f959c8e8ca80693cChris Lattner// 10dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner//===----------------------------------------------------------------------===// 11dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 12cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner#include "Support/CommandLine.h" 13cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner#include "Support/STLExtras.h" 14dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner#include <algorithm> 15dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner#include <map> 16dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner#include <set> 17697954c15da58bd8b186dbafdedd8b06db770201Chris Lattner#include <iostream> 187f1576f0424542d6162c1cedc14629e4cbc3e80aChris Lattner 19dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattnerusing namespace cl; 20697954c15da58bd8b186dbafdedd8b06db770201Chris Lattnerusing std::map; 21697954c15da58bd8b186dbafdedd8b06db770201Chris Lattnerusing std::pair; 22697954c15da58bd8b186dbafdedd8b06db770201Chris Lattnerusing std::vector; 23697954c15da58bd8b186dbafdedd8b06db770201Chris Lattnerusing std::string; 24697954c15da58bd8b186dbafdedd8b06db770201Chris Lattnerusing std::cerr; 25dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 26331de23705a719514e37c211f327379688f81b0dChris Lattner//===----------------------------------------------------------------------===// 27331de23705a719514e37c211f327379688f81b0dChris Lattner// Basic, shared command line option processing machinery... 28331de23705a719514e37c211f327379688f81b0dChris Lattner// 29331de23705a719514e37c211f327379688f81b0dChris Lattner 30dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner// Return the global command line option vector. Making it a function scoped 31f78032fe064bdd2b9a19b875261747b7d0a27a73Chris Lattner// static ensures that it will be initialized correctly before its first use. 32dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner// 33dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattnerstatic map<string, Option*> &getOpts() { 34dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner static map<string,Option*> CommandLineOptions; 35dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner return CommandLineOptions; 36dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner} 37dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 38331de23705a719514e37c211f327379688f81b0dChris Lattnerstatic vector<Option*> &getPositionalOpts() { 39331de23705a719514e37c211f327379688f81b0dChris Lattner static vector<Option*> Positional; 40331de23705a719514e37c211f327379688f81b0dChris Lattner return Positional; 41331de23705a719514e37c211f327379688f81b0dChris Lattner} 42331de23705a719514e37c211f327379688f81b0dChris Lattner 43dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattnerstatic void AddArgument(const string &ArgName, Option *Opt) { 44dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner if (getOpts().find(ArgName) != getOpts().end()) { 45dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner cerr << "CommandLine Error: Argument '" << ArgName 469c9be48b8396e7244e47d2af8890da8eec71c72dChris Lattner << "' defined more than once!\n"; 47dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner } else { 48f78032fe064bdd2b9a19b875261747b7d0a27a73Chris Lattner // Add argument to the argument map! 49697954c15da58bd8b186dbafdedd8b06db770201Chris Lattner getOpts().insert(std::make_pair(ArgName, Opt)); 50dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner } 51dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner} 52dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 53dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattnerstatic const char *ProgramName = 0; 54dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattnerstatic const char *ProgramOverview = 0; 55dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 56caccd761a6320d9068a44198b9e1b6c3659f8bb5Chris Lattnerstatic inline bool ProvideOption(Option *Handler, const char *ArgName, 57caccd761a6320d9068a44198b9e1b6c3659f8bb5Chris Lattner const char *Value, int argc, char **argv, 58caccd761a6320d9068a44198b9e1b6c3659f8bb5Chris Lattner int &i) { 59caccd761a6320d9068a44198b9e1b6c3659f8bb5Chris Lattner // Enforce value requirements 60caccd761a6320d9068a44198b9e1b6c3659f8bb5Chris Lattner switch (Handler->getValueExpectedFlag()) { 61caccd761a6320d9068a44198b9e1b6c3659f8bb5Chris Lattner case ValueRequired: 62caccd761a6320d9068a44198b9e1b6c3659f8bb5Chris Lattner if (Value == 0 || *Value == 0) { // No value specified? 63caccd761a6320d9068a44198b9e1b6c3659f8bb5Chris Lattner if (i+1 < argc) { // Steal the next argument, like for '-o filename' 64caccd761a6320d9068a44198b9e1b6c3659f8bb5Chris Lattner Value = argv[++i]; 65caccd761a6320d9068a44198b9e1b6c3659f8bb5Chris Lattner } else { 66caccd761a6320d9068a44198b9e1b6c3659f8bb5Chris Lattner return Handler->error(" requires a value!"); 67caccd761a6320d9068a44198b9e1b6c3659f8bb5Chris Lattner } 68caccd761a6320d9068a44198b9e1b6c3659f8bb5Chris Lattner } 69caccd761a6320d9068a44198b9e1b6c3659f8bb5Chris Lattner break; 70caccd761a6320d9068a44198b9e1b6c3659f8bb5Chris Lattner case ValueDisallowed: 71caccd761a6320d9068a44198b9e1b6c3659f8bb5Chris Lattner if (*Value != 0) 72caccd761a6320d9068a44198b9e1b6c3659f8bb5Chris Lattner return Handler->error(" does not allow a value! '" + 73caccd761a6320d9068a44198b9e1b6c3659f8bb5Chris Lattner string(Value) + "' specified."); 74caccd761a6320d9068a44198b9e1b6c3659f8bb5Chris Lattner break; 75caccd761a6320d9068a44198b9e1b6c3659f8bb5Chris Lattner case ValueOptional: break; 76caccd761a6320d9068a44198b9e1b6c3659f8bb5Chris Lattner default: cerr << "Bad ValueMask flag! CommandLine usage error:" 77697954c15da58bd8b186dbafdedd8b06db770201Chris Lattner << Handler->getValueExpectedFlag() << "\n"; abort(); 78caccd761a6320d9068a44198b9e1b6c3659f8bb5Chris Lattner } 79caccd761a6320d9068a44198b9e1b6c3659f8bb5Chris Lattner 80caccd761a6320d9068a44198b9e1b6c3659f8bb5Chris Lattner // Run the handler now! 81caccd761a6320d9068a44198b9e1b6c3659f8bb5Chris Lattner return Handler->addOccurance(ArgName, Value); 82caccd761a6320d9068a44198b9e1b6c3659f8bb5Chris Lattner} 83caccd761a6320d9068a44198b9e1b6c3659f8bb5Chris Lattner 84331de23705a719514e37c211f327379688f81b0dChris Lattnerstatic bool ProvidePositionalOption(Option *Handler, string &Arg) { 85331de23705a719514e37c211f327379688f81b0dChris Lattner int Dummy; 86331de23705a719514e37c211f327379688f81b0dChris Lattner return ProvideOption(Handler, "", Arg.c_str(), 0, 0, Dummy); 87331de23705a719514e37c211f327379688f81b0dChris Lattner} 88331de23705a719514e37c211f327379688f81b0dChris Lattner 89331de23705a719514e37c211f327379688f81b0dChris Lattner 90331de23705a719514e37c211f327379688f81b0dChris Lattner// Option predicates... 91331de23705a719514e37c211f327379688f81b0dChris Lattnerstatic inline bool isGrouping(const Option *O) { 92331de23705a719514e37c211f327379688f81b0dChris Lattner return O->getFormattingFlag() == cl::Grouping; 93331de23705a719514e37c211f327379688f81b0dChris Lattner} 94331de23705a719514e37c211f327379688f81b0dChris Lattnerstatic inline bool isPrefixedOrGrouping(const Option *O) { 95331de23705a719514e37c211f327379688f81b0dChris Lattner return isGrouping(O) || O->getFormattingFlag() == cl::Prefix; 96331de23705a719514e37c211f327379688f81b0dChris Lattner} 97331de23705a719514e37c211f327379688f81b0dChris Lattner 98331de23705a719514e37c211f327379688f81b0dChris Lattner// getOptionPred - Check to see if there are any options that satisfy the 99331de23705a719514e37c211f327379688f81b0dChris Lattner// specified predicate with names that are the prefixes in Name. This is 100331de23705a719514e37c211f327379688f81b0dChris Lattner// checked by progressively stripping characters off of the name, checking to 101331de23705a719514e37c211f327379688f81b0dChris Lattner// see if there options that satisfy the predicate. If we find one, return it, 102331de23705a719514e37c211f327379688f81b0dChris Lattner// otherwise return null. 103f78032fe064bdd2b9a19b875261747b7d0a27a73Chris Lattner// 104331de23705a719514e37c211f327379688f81b0dChris Lattnerstatic Option *getOptionPred(std::string Name, unsigned &Length, 105331de23705a719514e37c211f327379688f81b0dChris Lattner bool (*Pred)(const Option*)) { 106331de23705a719514e37c211f327379688f81b0dChris Lattner 107331de23705a719514e37c211f327379688f81b0dChris Lattner map<string, Option*>::iterator I = getOpts().find(Name); 108331de23705a719514e37c211f327379688f81b0dChris Lattner if (I != getOpts().end() && Pred(I->second)) { 109331de23705a719514e37c211f327379688f81b0dChris Lattner Length = Name.length(); 110331de23705a719514e37c211f327379688f81b0dChris Lattner return I->second; 111331de23705a719514e37c211f327379688f81b0dChris Lattner } 112f78032fe064bdd2b9a19b875261747b7d0a27a73Chris Lattner 113331de23705a719514e37c211f327379688f81b0dChris Lattner if (Name.size() == 1) return 0; 114331de23705a719514e37c211f327379688f81b0dChris Lattner do { 115331de23705a719514e37c211f327379688f81b0dChris Lattner Name.erase(Name.end()-1, Name.end()); // Chop off the last character... 116331de23705a719514e37c211f327379688f81b0dChris Lattner I = getOpts().find(Name); 117331de23705a719514e37c211f327379688f81b0dChris Lattner 118331de23705a719514e37c211f327379688f81b0dChris Lattner // Loop while we haven't found an option and Name still has at least two 119331de23705a719514e37c211f327379688f81b0dChris Lattner // characters in it (so that the next iteration will not be the empty 120331de23705a719514e37c211f327379688f81b0dChris Lattner // string... 121331de23705a719514e37c211f327379688f81b0dChris Lattner } while ((I == getOpts().end() || !Pred(I->second)) && Name.size() > 1); 122331de23705a719514e37c211f327379688f81b0dChris Lattner 123331de23705a719514e37c211f327379688f81b0dChris Lattner if (I != getOpts().end() && Pred(I->second)) { 124331de23705a719514e37c211f327379688f81b0dChris Lattner Length = Name.length(); 125331de23705a719514e37c211f327379688f81b0dChris Lattner return I->second; // Found one! 126f78032fe064bdd2b9a19b875261747b7d0a27a73Chris Lattner } 127331de23705a719514e37c211f327379688f81b0dChris Lattner return 0; // No option found! 128331de23705a719514e37c211f327379688f81b0dChris Lattner} 129f78032fe064bdd2b9a19b875261747b7d0a27a73Chris Lattner 130331de23705a719514e37c211f327379688f81b0dChris Lattnerstatic bool RequiresValue(const Option *O) { 131331de23705a719514e37c211f327379688f81b0dChris Lattner return O->getNumOccurancesFlag() == cl::Required || 132331de23705a719514e37c211f327379688f81b0dChris Lattner O->getNumOccurancesFlag() == cl::OneOrMore; 133331de23705a719514e37c211f327379688f81b0dChris Lattner} 134331de23705a719514e37c211f327379688f81b0dChris Lattner 135331de23705a719514e37c211f327379688f81b0dChris Lattnerstatic bool EatsUnboundedNumberOfValues(const Option *O) { 136331de23705a719514e37c211f327379688f81b0dChris Lattner return O->getNumOccurancesFlag() == cl::ZeroOrMore || 137331de23705a719514e37c211f327379688f81b0dChris Lattner O->getNumOccurancesFlag() == cl::OneOrMore; 138f78032fe064bdd2b9a19b875261747b7d0a27a73Chris Lattner} 139caccd761a6320d9068a44198b9e1b6c3659f8bb5Chris Lattner 140dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattnervoid cl::ParseCommandLineOptions(int &argc, char **argv, 1410c0edf8afc35a42b15a24ebb5fa5f3fc674290aeChris Lattner const char *Overview) { 142331de23705a719514e37c211f327379688f81b0dChris Lattner assert((!getOpts().empty() || !getPositionalOpts().empty()) && 143331de23705a719514e37c211f327379688f81b0dChris Lattner "No options specified, or ParseCommandLineOptions called more" 144331de23705a719514e37c211f327379688f81b0dChris Lattner " than once!"); 145dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner ProgramName = argv[0]; // Save this away safe and snug 146dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner ProgramOverview = Overview; 147dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner bool ErrorParsing = false; 148dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 149331de23705a719514e37c211f327379688f81b0dChris Lattner map<string, Option*> &Opts = getOpts(); 150331de23705a719514e37c211f327379688f81b0dChris Lattner vector<Option*> &PositionalOpts = getPositionalOpts(); 151331de23705a719514e37c211f327379688f81b0dChris Lattner 152331de23705a719514e37c211f327379688f81b0dChris Lattner // Check out the positional arguments to collect information about them. 153331de23705a719514e37c211f327379688f81b0dChris Lattner unsigned NumPositionalRequired = 0; 154331de23705a719514e37c211f327379688f81b0dChris Lattner Option *ConsumeAfterOpt = 0; 155331de23705a719514e37c211f327379688f81b0dChris Lattner if (!PositionalOpts.empty()) { 156331de23705a719514e37c211f327379688f81b0dChris Lattner if (PositionalOpts[0]->getNumOccurancesFlag() == cl::ConsumeAfter) { 157331de23705a719514e37c211f327379688f81b0dChris Lattner assert(PositionalOpts.size() > 1 && 158331de23705a719514e37c211f327379688f81b0dChris Lattner "Cannot specify cl::ConsumeAfter without a positional argument!"); 159331de23705a719514e37c211f327379688f81b0dChris Lattner ConsumeAfterOpt = PositionalOpts[0]; 160331de23705a719514e37c211f327379688f81b0dChris Lattner } 161331de23705a719514e37c211f327379688f81b0dChris Lattner 162331de23705a719514e37c211f327379688f81b0dChris Lattner // Calculate how many positional values are _required_. 163331de23705a719514e37c211f327379688f81b0dChris Lattner bool UnboundedFound = false; 164331de23705a719514e37c211f327379688f81b0dChris Lattner for (unsigned i = ConsumeAfterOpt != 0, e = PositionalOpts.size(); 165331de23705a719514e37c211f327379688f81b0dChris Lattner i != e; ++i) { 166331de23705a719514e37c211f327379688f81b0dChris Lattner Option *Opt = PositionalOpts[i]; 167331de23705a719514e37c211f327379688f81b0dChris Lattner if (RequiresValue(Opt)) 168331de23705a719514e37c211f327379688f81b0dChris Lattner ++NumPositionalRequired; 169331de23705a719514e37c211f327379688f81b0dChris Lattner else if (ConsumeAfterOpt) { 170331de23705a719514e37c211f327379688f81b0dChris Lattner // ConsumeAfter cannot be combined with "optional" positional options 17154ec7aed89e4a5d8cc11c36999d88012cbfcc18aChris Lattner // unless there is only one positional argument... 17254ec7aed89e4a5d8cc11c36999d88012cbfcc18aChris Lattner if (PositionalOpts.size() > 2) 17354ec7aed89e4a5d8cc11c36999d88012cbfcc18aChris Lattner ErrorParsing |= 17454ec7aed89e4a5d8cc11c36999d88012cbfcc18aChris Lattner Opt->error(" error - this positional option will never be matched, " 17554ec7aed89e4a5d8cc11c36999d88012cbfcc18aChris Lattner "because it does not Require a value, and a " 17654ec7aed89e4a5d8cc11c36999d88012cbfcc18aChris Lattner "cl::ConsumeAfter option is active!"); 177331de23705a719514e37c211f327379688f81b0dChris Lattner } else if (UnboundedFound) { // This option does not "require" a value... 178331de23705a719514e37c211f327379688f81b0dChris Lattner // Make sure this option is not specified after an option that eats all 179331de23705a719514e37c211f327379688f81b0dChris Lattner // extra arguments, or this one will never get any! 180331de23705a719514e37c211f327379688f81b0dChris Lattner // 181331de23705a719514e37c211f327379688f81b0dChris Lattner ErrorParsing |= Opt->error(" error - option can never match, because " 182331de23705a719514e37c211f327379688f81b0dChris Lattner "another positional argument will match an " 183331de23705a719514e37c211f327379688f81b0dChris Lattner "unbounded number of values, and this option" 184331de23705a719514e37c211f327379688f81b0dChris Lattner " does not require a value!"); 185331de23705a719514e37c211f327379688f81b0dChris Lattner } 186331de23705a719514e37c211f327379688f81b0dChris Lattner UnboundedFound |= EatsUnboundedNumberOfValues(Opt); 187331de23705a719514e37c211f327379688f81b0dChris Lattner } 188331de23705a719514e37c211f327379688f81b0dChris Lattner } 189331de23705a719514e37c211f327379688f81b0dChris Lattner 190331de23705a719514e37c211f327379688f81b0dChris Lattner // PositionalVals - A vector of "positional" arguments we accumulate into to 191331de23705a719514e37c211f327379688f81b0dChris Lattner // processes at the end... 192331de23705a719514e37c211f327379688f81b0dChris Lattner // 193331de23705a719514e37c211f327379688f81b0dChris Lattner vector<string> PositionalVals; 194331de23705a719514e37c211f327379688f81b0dChris Lattner 195dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner // Loop over all of the arguments... processing them. 196331de23705a719514e37c211f327379688f81b0dChris Lattner bool DashDashFound = false; // Have we read '--'? 197dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner for (int i = 1; i < argc; ++i) { 198dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner Option *Handler = 0; 199dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner const char *Value = ""; 200dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner const char *ArgName = ""; 201331de23705a719514e37c211f327379688f81b0dChris Lattner 202331de23705a719514e37c211f327379688f81b0dChris Lattner // Check to see if this is a positional argument. This argument is 203331de23705a719514e37c211f327379688f81b0dChris Lattner // considered to be positional if it doesn't start with '-', if it is "-" 204331de23705a719514e37c211f327379688f81b0dChris Lattner // itself, or if we have see "--" already. 205331de23705a719514e37c211f327379688f81b0dChris Lattner // 206331de23705a719514e37c211f327379688f81b0dChris Lattner if (argv[i][0] != '-' || argv[i][1] == 0 || DashDashFound) { 207331de23705a719514e37c211f327379688f81b0dChris Lattner // Positional argument! 208331de23705a719514e37c211f327379688f81b0dChris Lattner if (!PositionalOpts.empty()) { 209331de23705a719514e37c211f327379688f81b0dChris Lattner PositionalVals.push_back(argv[i]); 210331de23705a719514e37c211f327379688f81b0dChris Lattner 211331de23705a719514e37c211f327379688f81b0dChris Lattner // All of the positional arguments have been fulfulled, give the rest to 212331de23705a719514e37c211f327379688f81b0dChris Lattner // the consume after option... if it's specified... 213331de23705a719514e37c211f327379688f81b0dChris Lattner // 214331de23705a719514e37c211f327379688f81b0dChris Lattner if (PositionalVals.size() == NumPositionalRequired && 215331de23705a719514e37c211f327379688f81b0dChris Lattner ConsumeAfterOpt != 0) { 216331de23705a719514e37c211f327379688f81b0dChris Lattner for (++i; i < argc; ++i) 217331de23705a719514e37c211f327379688f81b0dChris Lattner PositionalVals.push_back(argv[i]); 218331de23705a719514e37c211f327379688f81b0dChris Lattner break; // Handle outside of the argument processing loop... 219331de23705a719514e37c211f327379688f81b0dChris Lattner } 220331de23705a719514e37c211f327379688f81b0dChris Lattner 221331de23705a719514e37c211f327379688f81b0dChris Lattner // Delay processing positional arguments until the end... 222331de23705a719514e37c211f327379688f81b0dChris Lattner continue; 223331de23705a719514e37c211f327379688f81b0dChris Lattner } 224331de23705a719514e37c211f327379688f81b0dChris Lattner } else { // We start with a '-', must be an argument... 225dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner ArgName = argv[i]+1; 226dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner while (*ArgName == '-') ++ArgName; // Eat leading dashes 227dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 228331de23705a719514e37c211f327379688f81b0dChris Lattner if (*ArgName == 0 && !DashDashFound) { // Is this the mythical "--"? 229331de23705a719514e37c211f327379688f81b0dChris Lattner DashDashFound = true; // Yup, take note of that fact... 230331de23705a719514e37c211f327379688f81b0dChris Lattner continue; // Don't try to process it as an argument iself. 231331de23705a719514e37c211f327379688f81b0dChris Lattner } 232331de23705a719514e37c211f327379688f81b0dChris Lattner 233dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner const char *ArgNameEnd = ArgName; 234f78032fe064bdd2b9a19b875261747b7d0a27a73Chris Lattner while (*ArgNameEnd && *ArgNameEnd != '=') 235f78032fe064bdd2b9a19b875261747b7d0a27a73Chris Lattner ++ArgNameEnd; // Scan till end of argument name... 236dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 237dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner Value = ArgNameEnd; 238dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner if (*Value) // If we have an equals sign... 239dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner ++Value; // Advance to value... 240dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 241dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner if (*ArgName != 0) { 242f78032fe064bdd2b9a19b875261747b7d0a27a73Chris Lattner string RealName(ArgName, ArgNameEnd); 2433805e4ccfa6b908c5035256ea6ee51e219f029dbChris Lattner // Extract arg name part 244331de23705a719514e37c211f327379688f81b0dChris Lattner map<string, Option*>::iterator I = Opts.find(RealName); 245331de23705a719514e37c211f327379688f81b0dChris Lattner 246331de23705a719514e37c211f327379688f81b0dChris Lattner if (I == Opts.end() && !*Value && RealName.size() > 1) { 247331de23705a719514e37c211f327379688f81b0dChris Lattner // Check to see if this "option" is really a prefixed or grouped 248331de23705a719514e37c211f327379688f81b0dChris Lattner // argument... 249331de23705a719514e37c211f327379688f81b0dChris Lattner // 250331de23705a719514e37c211f327379688f81b0dChris Lattner unsigned Length = 0; 251331de23705a719514e37c211f327379688f81b0dChris Lattner Option *PGOpt = getOptionPred(RealName, Length, isPrefixedOrGrouping); 252331de23705a719514e37c211f327379688f81b0dChris Lattner 253331de23705a719514e37c211f327379688f81b0dChris Lattner // If the option is a prefixed option, then the value is simply the 254331de23705a719514e37c211f327379688f81b0dChris Lattner // rest of the name... so fall through to later processing, by 255331de23705a719514e37c211f327379688f81b0dChris Lattner // setting up the argument name flags and value fields. 256331de23705a719514e37c211f327379688f81b0dChris Lattner // 257331de23705a719514e37c211f327379688f81b0dChris Lattner if (PGOpt && PGOpt->getFormattingFlag() == cl::Prefix) { 258331de23705a719514e37c211f327379688f81b0dChris Lattner ArgNameEnd = ArgName+Length; 259331de23705a719514e37c211f327379688f81b0dChris Lattner Value = ArgNameEnd; 260331de23705a719514e37c211f327379688f81b0dChris Lattner I = Opts.find(string(ArgName, ArgNameEnd)); 261331de23705a719514e37c211f327379688f81b0dChris Lattner assert(I->second == PGOpt); 262331de23705a719514e37c211f327379688f81b0dChris Lattner } else if (PGOpt) { 263331de23705a719514e37c211f327379688f81b0dChris Lattner // This must be a grouped option... handle all of them now... 264331de23705a719514e37c211f327379688f81b0dChris Lattner assert(isGrouping(PGOpt) && "Broken getOptionPred!"); 265331de23705a719514e37c211f327379688f81b0dChris Lattner 266331de23705a719514e37c211f327379688f81b0dChris Lattner do { 267331de23705a719514e37c211f327379688f81b0dChris Lattner // Move current arg name out of RealName into RealArgName... 268331de23705a719514e37c211f327379688f81b0dChris Lattner string RealArgName(RealName.begin(), RealName.begin()+Length); 269331de23705a719514e37c211f327379688f81b0dChris Lattner RealName.erase(RealName.begin(), RealName.begin()+Length); 270f78032fe064bdd2b9a19b875261747b7d0a27a73Chris Lattner 271f78032fe064bdd2b9a19b875261747b7d0a27a73Chris Lattner // Because ValueRequired is an invalid flag for grouped arguments, 272f78032fe064bdd2b9a19b875261747b7d0a27a73Chris Lattner // we don't need to pass argc/argv in... 273f78032fe064bdd2b9a19b875261747b7d0a27a73Chris Lattner // 274331de23705a719514e37c211f327379688f81b0dChris Lattner assert(PGOpt->getValueExpectedFlag() != cl::ValueRequired && 275331de23705a719514e37c211f327379688f81b0dChris Lattner "Option can not be cl::Grouping AND cl::ValueRequired!"); 276331de23705a719514e37c211f327379688f81b0dChris Lattner int Dummy; 277331de23705a719514e37c211f327379688f81b0dChris Lattner ErrorParsing |= ProvideOption(PGOpt, RealArgName.c_str(), "", 278331de23705a719514e37c211f327379688f81b0dChris Lattner 0, 0, Dummy); 279331de23705a719514e37c211f327379688f81b0dChris Lattner 280331de23705a719514e37c211f327379688f81b0dChris Lattner // Get the next grouping option... 281331de23705a719514e37c211f327379688f81b0dChris Lattner if (!RealName.empty()) 282331de23705a719514e37c211f327379688f81b0dChris Lattner PGOpt = getOptionPred(RealName, Length, isGrouping); 283331de23705a719514e37c211f327379688f81b0dChris Lattner } while (!RealName.empty() && PGOpt); 284331de23705a719514e37c211f327379688f81b0dChris Lattner 285331de23705a719514e37c211f327379688f81b0dChris Lattner if (RealName.empty()) // Processed all of the options, move on 286331de23705a719514e37c211f327379688f81b0dChris Lattner continue; // to the next argv[] value... 287331de23705a719514e37c211f327379688f81b0dChris Lattner 288331de23705a719514e37c211f327379688f81b0dChris Lattner // If RealName is not empty, that means we did not match one of the 289331de23705a719514e37c211f327379688f81b0dChris Lattner // options! This is an error. 290331de23705a719514e37c211f327379688f81b0dChris Lattner // 291331de23705a719514e37c211f327379688f81b0dChris Lattner I = Opts.end(); 292331de23705a719514e37c211f327379688f81b0dChris Lattner } 293f78032fe064bdd2b9a19b875261747b7d0a27a73Chris Lattner } 294f78032fe064bdd2b9a19b875261747b7d0a27a73Chris Lattner 295331de23705a719514e37c211f327379688f81b0dChris Lattner Handler = I != Opts.end() ? I->second : 0; 296dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner } 297dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner } 298dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 299dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner if (Handler == 0) { 300dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner cerr << "Unknown command line argument '" << argv[i] << "'. Try: " 301f038acbee21cfed998451aedd00a81901d299516Chris Lattner << argv[0] << " --help'\n"; 302dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner ErrorParsing = true; 303dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner continue; 304dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner } 305dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 306caccd761a6320d9068a44198b9e1b6c3659f8bb5Chris Lattner ErrorParsing |= ProvideOption(Handler, ArgName, Value, argc, argv, i); 307331de23705a719514e37c211f327379688f81b0dChris Lattner } 308dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 309331de23705a719514e37c211f327379688f81b0dChris Lattner // Check and handle positional arguments now... 310331de23705a719514e37c211f327379688f81b0dChris Lattner if (NumPositionalRequired > PositionalVals.size()) { 311331de23705a719514e37c211f327379688f81b0dChris Lattner cerr << "Not enough positional command line arguments specified!\n"; 312331de23705a719514e37c211f327379688f81b0dChris Lattner cerr << "Must specify at least " << NumPositionalRequired 313331de23705a719514e37c211f327379688f81b0dChris Lattner << " positional arguments: See: " << argv[0] << " --help\n"; 314331de23705a719514e37c211f327379688f81b0dChris Lattner ErrorParsing = true; 315331de23705a719514e37c211f327379688f81b0dChris Lattner 316331de23705a719514e37c211f327379688f81b0dChris Lattner 317331de23705a719514e37c211f327379688f81b0dChris Lattner } else if (ConsumeAfterOpt == 0) { 318331de23705a719514e37c211f327379688f81b0dChris Lattner // Positional args have already been handled if ConsumeAfter is specified... 319331de23705a719514e37c211f327379688f81b0dChris Lattner unsigned ValNo = 0, NumVals = PositionalVals.size(); 320331de23705a719514e37c211f327379688f81b0dChris Lattner for (unsigned i = 0, e = PositionalOpts.size(); i != e; ++i) { 321331de23705a719514e37c211f327379688f81b0dChris Lattner if (RequiresValue(PositionalOpts[i])) { 322331de23705a719514e37c211f327379688f81b0dChris Lattner ProvidePositionalOption(PositionalOpts[i], PositionalVals[ValNo++]); 323331de23705a719514e37c211f327379688f81b0dChris Lattner --NumPositionalRequired; // We fulfilled our duty... 324331de23705a719514e37c211f327379688f81b0dChris Lattner } 325331de23705a719514e37c211f327379688f81b0dChris Lattner 326331de23705a719514e37c211f327379688f81b0dChris Lattner // If we _can_ give this option more arguments, do so now, as long as we 327331de23705a719514e37c211f327379688f81b0dChris Lattner // do not give it values that others need. 'Done' controls whether the 328331de23705a719514e37c211f327379688f81b0dChris Lattner // option even _WANTS_ any more. 329331de23705a719514e37c211f327379688f81b0dChris Lattner // 330331de23705a719514e37c211f327379688f81b0dChris Lattner bool Done = PositionalOpts[i]->getNumOccurancesFlag() == cl::Required; 331331de23705a719514e37c211f327379688f81b0dChris Lattner while (NumVals-ValNo > NumPositionalRequired && !Done) { 332331de23705a719514e37c211f327379688f81b0dChris Lattner switch (PositionalOpts[i]->getNumOccurancesFlag()) { 333331de23705a719514e37c211f327379688f81b0dChris Lattner case cl::Optional: 334331de23705a719514e37c211f327379688f81b0dChris Lattner Done = true; // Optional arguments want _at most_ one value 335331de23705a719514e37c211f327379688f81b0dChris Lattner // FALL THROUGH 336331de23705a719514e37c211f327379688f81b0dChris Lattner case cl::ZeroOrMore: // Zero or more will take all they can get... 337331de23705a719514e37c211f327379688f81b0dChris Lattner case cl::OneOrMore: // One or more will take all they can get... 338331de23705a719514e37c211f327379688f81b0dChris Lattner ProvidePositionalOption(PositionalOpts[i], PositionalVals[ValNo++]); 339331de23705a719514e37c211f327379688f81b0dChris Lattner break; 340331de23705a719514e37c211f327379688f81b0dChris Lattner default: 341331de23705a719514e37c211f327379688f81b0dChris Lattner assert(0 && "Internal error, unexpected NumOccurances flag in " 342331de23705a719514e37c211f327379688f81b0dChris Lattner "positional argument processing!"); 343331de23705a719514e37c211f327379688f81b0dChris Lattner } 344331de23705a719514e37c211f327379688f81b0dChris Lattner } 345caccd761a6320d9068a44198b9e1b6c3659f8bb5Chris Lattner } 346331de23705a719514e37c211f327379688f81b0dChris Lattner } else { 347331de23705a719514e37c211f327379688f81b0dChris Lattner assert(ConsumeAfterOpt && NumPositionalRequired <= PositionalVals.size()); 348331de23705a719514e37c211f327379688f81b0dChris Lattner unsigned ValNo = 0; 349331de23705a719514e37c211f327379688f81b0dChris Lattner for (unsigned j = 1, e = PositionalOpts.size(); j != e; ++j) 350331de23705a719514e37c211f327379688f81b0dChris Lattner if (RequiresValue(PositionalOpts[j])) 351faba809472e36fbb28394da6ed907d2652ca8b83Chris Lattner ErrorParsing |= ProvidePositionalOption(PositionalOpts[j], 352faba809472e36fbb28394da6ed907d2652ca8b83Chris Lattner PositionalVals[ValNo++]); 353faba809472e36fbb28394da6ed907d2652ca8b83Chris Lattner 354faba809472e36fbb28394da6ed907d2652ca8b83Chris Lattner // Handle the case where there is just one positional option, and it's 355faba809472e36fbb28394da6ed907d2652ca8b83Chris Lattner // optional. In this case, we want to give JUST THE FIRST option to the 356faba809472e36fbb28394da6ed907d2652ca8b83Chris Lattner // positional option and keep the rest for the consume after. The above 357faba809472e36fbb28394da6ed907d2652ca8b83Chris Lattner // loop would have assigned no values to positional options in this case. 358faba809472e36fbb28394da6ed907d2652ca8b83Chris Lattner // 359faba809472e36fbb28394da6ed907d2652ca8b83Chris Lattner if (PositionalOpts.size() == 2 && ValNo == 0) 360faba809472e36fbb28394da6ed907d2652ca8b83Chris Lattner ErrorParsing |= ProvidePositionalOption(PositionalOpts[1], 361faba809472e36fbb28394da6ed907d2652ca8b83Chris Lattner PositionalVals[ValNo++]); 362331de23705a719514e37c211f327379688f81b0dChris Lattner 363331de23705a719514e37c211f327379688f81b0dChris Lattner // Handle over all of the rest of the arguments to the 364331de23705a719514e37c211f327379688f81b0dChris Lattner // cl::ConsumeAfter command line option... 365331de23705a719514e37c211f327379688f81b0dChris Lattner for (; ValNo != PositionalVals.size(); ++ValNo) 366331de23705a719514e37c211f327379688f81b0dChris Lattner ErrorParsing |= ProvidePositionalOption(ConsumeAfterOpt, 367331de23705a719514e37c211f327379688f81b0dChris Lattner PositionalVals[ValNo]); 368dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner } 369dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 370dc4693dbcf164ec404a3a91c67cf1dbe5f45a8e5Chris Lattner // Loop over args and make sure all required args are specified! 371331de23705a719514e37c211f327379688f81b0dChris Lattner for (map<string, Option*>::iterator I = Opts.begin(), 372331de23705a719514e37c211f327379688f81b0dChris Lattner E = Opts.end(); I != E; ++I) { 373dc4693dbcf164ec404a3a91c67cf1dbe5f45a8e5Chris Lattner switch (I->second->getNumOccurancesFlag()) { 374dc4693dbcf164ec404a3a91c67cf1dbe5f45a8e5Chris Lattner case Required: 375dc4693dbcf164ec404a3a91c67cf1dbe5f45a8e5Chris Lattner case OneOrMore: 376f038acbee21cfed998451aedd00a81901d299516Chris Lattner if (I->second->getNumOccurances() == 0) { 377dc4693dbcf164ec404a3a91c67cf1dbe5f45a8e5Chris Lattner I->second->error(" must be specified at least once!"); 378f038acbee21cfed998451aedd00a81901d299516Chris Lattner ErrorParsing = true; 379f038acbee21cfed998451aedd00a81901d299516Chris Lattner } 380dc4693dbcf164ec404a3a91c67cf1dbe5f45a8e5Chris Lattner // Fall through 381dc4693dbcf164ec404a3a91c67cf1dbe5f45a8e5Chris Lattner default: 382dc4693dbcf164ec404a3a91c67cf1dbe5f45a8e5Chris Lattner break; 383dc4693dbcf164ec404a3a91c67cf1dbe5f45a8e5Chris Lattner } 384dc4693dbcf164ec404a3a91c67cf1dbe5f45a8e5Chris Lattner } 385dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 386331de23705a719514e37c211f327379688f81b0dChris Lattner // Free all of the memory allocated to the map. Command line options may only 387331de23705a719514e37c211f327379688f81b0dChris Lattner // be processed once! 388331de23705a719514e37c211f327379688f81b0dChris Lattner Opts.clear(); 389331de23705a719514e37c211f327379688f81b0dChris Lattner PositionalOpts.clear(); 390dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 391dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner // If we had an error processing our arguments, don't let the program execute 392dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner if (ErrorParsing) exit(1); 393dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner} 394dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 395dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner//===----------------------------------------------------------------------===// 396dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner// Option Base class implementation 397dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner// 398dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 3990c0edf8afc35a42b15a24ebb5fa5f3fc674290aeChris Lattnerbool Option::error(string Message, const char *ArgName) { 400dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner if (ArgName == 0) ArgName = ArgStr; 401331de23705a719514e37c211f327379688f81b0dChris Lattner if (ArgName[0] == 0) 402331de23705a719514e37c211f327379688f81b0dChris Lattner cerr << HelpStr; // Be nice for positional arguments 403331de23705a719514e37c211f327379688f81b0dChris Lattner else 404331de23705a719514e37c211f327379688f81b0dChris Lattner cerr << "-" << ArgName; 405331de23705a719514e37c211f327379688f81b0dChris Lattner cerr << " option" << Message << "\n"; 406dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner return true; 407dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner} 408dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 409dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattnerbool Option::addOccurance(const char *ArgName, const string &Value) { 410dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner NumOccurances++; // Increment the number of times we have been seen 411dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 412dc4693dbcf164ec404a3a91c67cf1dbe5f45a8e5Chris Lattner switch (getNumOccurancesFlag()) { 413dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner case Optional: 414dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner if (NumOccurances > 1) 415dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner return error(": may only occur zero or one times!", ArgName); 416dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner break; 417dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner case Required: 418dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner if (NumOccurances > 1) 419dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner return error(": must occur exactly one time!", ArgName); 420dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner // Fall through 421dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner case OneOrMore: 422caccd761a6320d9068a44198b9e1b6c3659f8bb5Chris Lattner case ZeroOrMore: 423caccd761a6320d9068a44198b9e1b6c3659f8bb5Chris Lattner case ConsumeAfter: break; 424dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner default: return error(": bad num occurances flag value!"); 425dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner } 426dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 427dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner return handleOccurance(ArgName, Value); 428dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner} 429dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 430331de23705a719514e37c211f327379688f81b0dChris Lattner// addArgument - Tell the system that this Option subclass will handle all 431331de23705a719514e37c211f327379688f81b0dChris Lattner// occurances of -ArgStr on the command line. 432331de23705a719514e37c211f327379688f81b0dChris Lattner// 433331de23705a719514e37c211f327379688f81b0dChris Lattnervoid Option::addArgument(const char *ArgStr) { 434331de23705a719514e37c211f327379688f81b0dChris Lattner if (ArgStr[0]) 435331de23705a719514e37c211f327379688f81b0dChris Lattner AddArgument(ArgStr, this); 436331de23705a719514e37c211f327379688f81b0dChris Lattner else if (getFormattingFlag() == Positional) 437331de23705a719514e37c211f327379688f81b0dChris Lattner getPositionalOpts().push_back(this); 438331de23705a719514e37c211f327379688f81b0dChris Lattner else if (getNumOccurancesFlag() == ConsumeAfter) { 439331de23705a719514e37c211f327379688f81b0dChris Lattner assert((getPositionalOpts().empty() || 440331de23705a719514e37c211f327379688f81b0dChris Lattner getPositionalOpts().front()->getNumOccurancesFlag() != ConsumeAfter) 441331de23705a719514e37c211f327379688f81b0dChris Lattner && "Cannot specify more than one option with cl::ConsumeAfter " 442331de23705a719514e37c211f327379688f81b0dChris Lattner "specified!"); 443331de23705a719514e37c211f327379688f81b0dChris Lattner getPositionalOpts().insert(getPositionalOpts().begin(), this); 444331de23705a719514e37c211f327379688f81b0dChris Lattner } 445331de23705a719514e37c211f327379688f81b0dChris Lattner} 446331de23705a719514e37c211f327379688f81b0dChris Lattner 447aa852bbb503571d1198856fa4c6e099d7625e3b3Chris Lattnervoid Option::removeArgument(const char *ArgStr) { 448aa852bbb503571d1198856fa4c6e099d7625e3b3Chris Lattner if (ArgStr[0]) { 449aa852bbb503571d1198856fa4c6e099d7625e3b3Chris Lattner assert(getOpts()[ArgStr] == this && "Arg not in map!"); 450aa852bbb503571d1198856fa4c6e099d7625e3b3Chris Lattner getOpts().erase(ArgStr); 451aa852bbb503571d1198856fa4c6e099d7625e3b3Chris Lattner } else if (getFormattingFlag() == Positional) { 452aa852bbb503571d1198856fa4c6e099d7625e3b3Chris Lattner vector<Option*>::iterator I = 453aa852bbb503571d1198856fa4c6e099d7625e3b3Chris Lattner std::find(getPositionalOpts().begin(), getPositionalOpts().end(), this); 454aa852bbb503571d1198856fa4c6e099d7625e3b3Chris Lattner assert(I != getPositionalOpts().end() && "Arg not registered!"); 455aa852bbb503571d1198856fa4c6e099d7625e3b3Chris Lattner getPositionalOpts().erase(I); 456aa852bbb503571d1198856fa4c6e099d7625e3b3Chris Lattner } else if (getNumOccurancesFlag() == ConsumeAfter) { 457aa852bbb503571d1198856fa4c6e099d7625e3b3Chris Lattner assert(!getPositionalOpts().empty() && getPositionalOpts()[0] == this && 458aa852bbb503571d1198856fa4c6e099d7625e3b3Chris Lattner "Arg not registered correctly!"); 459aa852bbb503571d1198856fa4c6e099d7625e3b3Chris Lattner getPositionalOpts().erase(getPositionalOpts().begin()); 460aa852bbb503571d1198856fa4c6e099d7625e3b3Chris Lattner } 461aa852bbb503571d1198856fa4c6e099d7625e3b3Chris Lattner} 462aa852bbb503571d1198856fa4c6e099d7625e3b3Chris Lattner 463331de23705a719514e37c211f327379688f81b0dChris Lattner 464331de23705a719514e37c211f327379688f81b0dChris Lattner// getValueStr - Get the value description string, using "DefaultMsg" if nothing 465331de23705a719514e37c211f327379688f81b0dChris Lattner// has been specified yet. 466331de23705a719514e37c211f327379688f81b0dChris Lattner// 467331de23705a719514e37c211f327379688f81b0dChris Lattnerstatic const char *getValueStr(const Option &O, const char *DefaultMsg) { 468331de23705a719514e37c211f327379688f81b0dChris Lattner if (O.ValueStr[0] == 0) return DefaultMsg; 469331de23705a719514e37c211f327379688f81b0dChris Lattner return O.ValueStr; 470331de23705a719514e37c211f327379688f81b0dChris Lattner} 471331de23705a719514e37c211f327379688f81b0dChris Lattner 472331de23705a719514e37c211f327379688f81b0dChris Lattner//===----------------------------------------------------------------------===// 473331de23705a719514e37c211f327379688f81b0dChris Lattner// cl::alias class implementation 474331de23705a719514e37c211f327379688f81b0dChris Lattner// 475331de23705a719514e37c211f327379688f81b0dChris Lattner 476dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner// Return the width of the option tag for printing... 477331de23705a719514e37c211f327379688f81b0dChris Lattnerunsigned alias::getOptionWidth() const { 478dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner return std::strlen(ArgStr)+6; 479dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner} 480dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 481331de23705a719514e37c211f327379688f81b0dChris Lattner// Print out the option for the alias... 482331de23705a719514e37c211f327379688f81b0dChris Lattnervoid alias::printOptionInfo(unsigned GlobalWidth) const { 483dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner unsigned L = std::strlen(ArgStr); 484dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner cerr << " -" << ArgStr << string(GlobalWidth-L-6, ' ') << " - " 485697954c15da58bd8b186dbafdedd8b06db770201Chris Lattner << HelpStr << "\n"; 486dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner} 487dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 488dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 489331de23705a719514e37c211f327379688f81b0dChris Lattner 490dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner//===----------------------------------------------------------------------===// 491331de23705a719514e37c211f327379688f81b0dChris Lattner// Parser Implementation code... 492dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner// 493dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 494331de23705a719514e37c211f327379688f81b0dChris Lattner// parser<bool> implementation 495331de23705a719514e37c211f327379688f81b0dChris Lattner// 496331de23705a719514e37c211f327379688f81b0dChris Lattnerbool parser<bool>::parseImpl(Option &O, const string &Arg, bool &Value) { 497dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner if (Arg == "" || Arg == "true" || Arg == "TRUE" || Arg == "True" || 498dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner Arg == "1") { 499dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner Value = true; 500dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner } else if (Arg == "false" || Arg == "FALSE" || Arg == "False" || Arg == "0") { 501dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner Value = false; 502dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner } else { 503331de23705a719514e37c211f327379688f81b0dChris Lattner return O.error(": '" + Arg + 504331de23705a719514e37c211f327379688f81b0dChris Lattner "' is invalid value for boolean argument! Try 0 or 1"); 505dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner } 506dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner return false; 507dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner} 508dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 509331de23705a719514e37c211f327379688f81b0dChris Lattner// Return the width of the option tag for printing... 510331de23705a719514e37c211f327379688f81b0dChris Lattnerunsigned parser<bool>::getOptionWidth(const Option &O) const { 511331de23705a719514e37c211f327379688f81b0dChris Lattner return std::strlen(O.ArgStr)+6; 512dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner} 513dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 514331de23705a719514e37c211f327379688f81b0dChris Lattner// printOptionInfo - Print out information about this option. The 515331de23705a719514e37c211f327379688f81b0dChris Lattner// to-be-maintained width is specified. 516dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner// 517331de23705a719514e37c211f327379688f81b0dChris Lattnervoid parser<bool>::printOptionInfo(const Option &O, unsigned GlobalWidth) const{ 518331de23705a719514e37c211f327379688f81b0dChris Lattner unsigned L = std::strlen(O.ArgStr); 519331de23705a719514e37c211f327379688f81b0dChris Lattner cerr << " -" << O.ArgStr << string(GlobalWidth-L-6, ' ') << " - " 520331de23705a719514e37c211f327379688f81b0dChris Lattner << O.HelpStr << "\n"; 521dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner} 522dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 523d215fd1f5610033fbe704c975805790530262d26Chris Lattner 524331de23705a719514e37c211f327379688f81b0dChris Lattner 525331de23705a719514e37c211f327379688f81b0dChris Lattner// parser<int> implementation 526dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner// 527331de23705a719514e37c211f327379688f81b0dChris Lattnerbool parser<int>::parseImpl(Option &O, const string &Arg, int &Value) { 528331de23705a719514e37c211f327379688f81b0dChris Lattner const char *ArgStart = Arg.c_str(); 529331de23705a719514e37c211f327379688f81b0dChris Lattner char *End; 530331de23705a719514e37c211f327379688f81b0dChris Lattner Value = (int)strtol(ArgStart, &End, 0); 531331de23705a719514e37c211f327379688f81b0dChris Lattner if (*End != 0) 532331de23705a719514e37c211f327379688f81b0dChris Lattner return O.error(": '" + Arg + "' value invalid for integer argument!"); 533331de23705a719514e37c211f327379688f81b0dChris Lattner return false; 534dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner} 535dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 536331de23705a719514e37c211f327379688f81b0dChris Lattner// Return the width of the option tag for printing... 537331de23705a719514e37c211f327379688f81b0dChris Lattnerunsigned parser<int>::getOptionWidth(const Option &O) const { 538331de23705a719514e37c211f327379688f81b0dChris Lattner return std::strlen(O.ArgStr)+std::strlen(getValueStr(O, "int"))+9; 539dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner} 540dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 541331de23705a719514e37c211f327379688f81b0dChris Lattner// printOptionInfo - Print out information about this option. The 542331de23705a719514e37c211f327379688f81b0dChris Lattner// to-be-maintained width is specified. 543331de23705a719514e37c211f327379688f81b0dChris Lattner// 544331de23705a719514e37c211f327379688f81b0dChris Lattnervoid parser<int>::printOptionInfo(const Option &O, unsigned GlobalWidth) const{ 545331de23705a719514e37c211f327379688f81b0dChris Lattner cerr << " -" << O.ArgStr << "=<" << getValueStr(O, "int") << ">" 546331de23705a719514e37c211f327379688f81b0dChris Lattner << string(GlobalWidth-getOptionWidth(O), ' ') << " - " 547331de23705a719514e37c211f327379688f81b0dChris Lattner << O.HelpStr << "\n"; 548dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner} 549dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 550dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 551331de23705a719514e37c211f327379688f81b0dChris Lattner// parser<double> implementation 552331de23705a719514e37c211f327379688f81b0dChris Lattner// 553331de23705a719514e37c211f327379688f81b0dChris Lattnerbool parser<double>::parseImpl(Option &O, const string &Arg, double &Value) { 554331de23705a719514e37c211f327379688f81b0dChris Lattner const char *ArgStart = Arg.c_str(); 555331de23705a719514e37c211f327379688f81b0dChris Lattner char *End; 556331de23705a719514e37c211f327379688f81b0dChris Lattner Value = strtod(ArgStart, &End); 557331de23705a719514e37c211f327379688f81b0dChris Lattner if (*End != 0) 558331de23705a719514e37c211f327379688f81b0dChris Lattner return O.error(": '" +Arg+ "' value invalid for floating point argument!"); 559dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner return false; 560dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner} 561dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 562dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner// Return the width of the option tag for printing... 563331de23705a719514e37c211f327379688f81b0dChris Lattnerunsigned parser<double>::getOptionWidth(const Option &O) const { 564331de23705a719514e37c211f327379688f81b0dChris Lattner return std::strlen(O.ArgStr)+std::strlen(getValueStr(O, "number"))+9; 565dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner} 566dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 567dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner// printOptionInfo - Print out information about this option. The 568dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner// to-be-maintained width is specified. 569dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner// 570331de23705a719514e37c211f327379688f81b0dChris Lattnervoid parser<double>::printOptionInfo(const Option &O, 571331de23705a719514e37c211f327379688f81b0dChris Lattner unsigned GlobalWidth) const{ 572331de23705a719514e37c211f327379688f81b0dChris Lattner cerr << " -" << O.ArgStr << "=<" << getValueStr(O, "number") << ">" 573331de23705a719514e37c211f327379688f81b0dChris Lattner << string(GlobalWidth-getOptionWidth(O), ' ') 574331de23705a719514e37c211f327379688f81b0dChris Lattner << " - " << O.HelpStr << "\n"; 575dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner} 576dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 577dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 578331de23705a719514e37c211f327379688f81b0dChris Lattner// parser<string> implementation 579331de23705a719514e37c211f327379688f81b0dChris Lattner// 580dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 581331de23705a719514e37c211f327379688f81b0dChris Lattner// Return the width of the option tag for printing... 582331de23705a719514e37c211f327379688f81b0dChris Lattnerunsigned parser<string>::getOptionWidth(const Option &O) const { 583331de23705a719514e37c211f327379688f81b0dChris Lattner return std::strlen(O.ArgStr)+std::strlen(getValueStr(O, "string"))+9; 584dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner} 585dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 586331de23705a719514e37c211f327379688f81b0dChris Lattner// printOptionInfo - Print out information about this option. The 587331de23705a719514e37c211f327379688f81b0dChris Lattner// to-be-maintained width is specified. 588331de23705a719514e37c211f327379688f81b0dChris Lattner// 589331de23705a719514e37c211f327379688f81b0dChris Lattnervoid parser<string>::printOptionInfo(const Option &O, 590331de23705a719514e37c211f327379688f81b0dChris Lattner unsigned GlobalWidth) const{ 591331de23705a719514e37c211f327379688f81b0dChris Lattner cerr << " -" << O.ArgStr << " <" << getValueStr(O, "string") << ">" 592331de23705a719514e37c211f327379688f81b0dChris Lattner << string(GlobalWidth-getOptionWidth(O), ' ') 593331de23705a719514e37c211f327379688f81b0dChris Lattner << " - " << O.HelpStr << "\n"; 594dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner} 595dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 596331de23705a719514e37c211f327379688f81b0dChris Lattner// generic_parser_base implementation 597dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner// 598dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 599aa852bbb503571d1198856fa4c6e099d7625e3b3Chris Lattner// findOption - Return the option number corresponding to the specified 600aa852bbb503571d1198856fa4c6e099d7625e3b3Chris Lattner// argument string. If the option is not found, getNumOptions() is returned. 601aa852bbb503571d1198856fa4c6e099d7625e3b3Chris Lattner// 602aa852bbb503571d1198856fa4c6e099d7625e3b3Chris Lattnerunsigned generic_parser_base::findOption(const char *Name) { 603aa852bbb503571d1198856fa4c6e099d7625e3b3Chris Lattner unsigned i = 0, e = getNumOptions(); 604aa852bbb503571d1198856fa4c6e099d7625e3b3Chris Lattner string N(Name); 605aa852bbb503571d1198856fa4c6e099d7625e3b3Chris Lattner 606aa852bbb503571d1198856fa4c6e099d7625e3b3Chris Lattner while (i != e) 607aa852bbb503571d1198856fa4c6e099d7625e3b3Chris Lattner if (getOption(i) == N) 608aa852bbb503571d1198856fa4c6e099d7625e3b3Chris Lattner return i; 609aa852bbb503571d1198856fa4c6e099d7625e3b3Chris Lattner else 610aa852bbb503571d1198856fa4c6e099d7625e3b3Chris Lattner ++i; 611aa852bbb503571d1198856fa4c6e099d7625e3b3Chris Lattner return e; 612aa852bbb503571d1198856fa4c6e099d7625e3b3Chris Lattner} 613aa852bbb503571d1198856fa4c6e099d7625e3b3Chris Lattner 614aa852bbb503571d1198856fa4c6e099d7625e3b3Chris Lattner 615dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner// Return the width of the option tag for printing... 616331de23705a719514e37c211f327379688f81b0dChris Lattnerunsigned generic_parser_base::getOptionWidth(const Option &O) const { 617331de23705a719514e37c211f327379688f81b0dChris Lattner if (O.hasArgStr()) { 618331de23705a719514e37c211f327379688f81b0dChris Lattner unsigned Size = std::strlen(O.ArgStr)+6; 619331de23705a719514e37c211f327379688f81b0dChris Lattner for (unsigned i = 0, e = getNumOptions(); i != e; ++i) 620331de23705a719514e37c211f327379688f81b0dChris Lattner Size = std::max(Size, (unsigned)std::strlen(getOption(i))+8); 621331de23705a719514e37c211f327379688f81b0dChris Lattner return Size; 622331de23705a719514e37c211f327379688f81b0dChris Lattner } else { 623331de23705a719514e37c211f327379688f81b0dChris Lattner unsigned BaseSize = 0; 624331de23705a719514e37c211f327379688f81b0dChris Lattner for (unsigned i = 0, e = getNumOptions(); i != e; ++i) 625331de23705a719514e37c211f327379688f81b0dChris Lattner BaseSize = std::max(BaseSize, (unsigned)std::strlen(getOption(i))+8); 626331de23705a719514e37c211f327379688f81b0dChris Lattner return BaseSize; 627331de23705a719514e37c211f327379688f81b0dChris Lattner } 628dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner} 629dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 630dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner// printOptionInfo - Print out information about this option. The 631dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner// to-be-maintained width is specified. 632dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner// 633331de23705a719514e37c211f327379688f81b0dChris Lattnervoid generic_parser_base::printOptionInfo(const Option &O, 634331de23705a719514e37c211f327379688f81b0dChris Lattner unsigned GlobalWidth) const { 635331de23705a719514e37c211f327379688f81b0dChris Lattner if (O.hasArgStr()) { 636331de23705a719514e37c211f327379688f81b0dChris Lattner unsigned L = std::strlen(O.ArgStr); 637331de23705a719514e37c211f327379688f81b0dChris Lattner cerr << " -" << O.ArgStr << string(GlobalWidth-L-6, ' ') 638331de23705a719514e37c211f327379688f81b0dChris Lattner << " - " << O.HelpStr << "\n"; 639331de23705a719514e37c211f327379688f81b0dChris Lattner 640331de23705a719514e37c211f327379688f81b0dChris Lattner for (unsigned i = 0, e = getNumOptions(); i != e; ++i) { 641331de23705a719514e37c211f327379688f81b0dChris Lattner unsigned NumSpaces = GlobalWidth-strlen(getOption(i))-8; 642331de23705a719514e37c211f327379688f81b0dChris Lattner cerr << " =" << getOption(i) << string(NumSpaces, ' ') << " - " 643331de23705a719514e37c211f327379688f81b0dChris Lattner << getDescription(i) << "\n"; 644331de23705a719514e37c211f327379688f81b0dChris Lattner } 645331de23705a719514e37c211f327379688f81b0dChris Lattner } else { 646331de23705a719514e37c211f327379688f81b0dChris Lattner if (O.HelpStr[0]) 647331de23705a719514e37c211f327379688f81b0dChris Lattner cerr << " " << O.HelpStr << "\n"; 648331de23705a719514e37c211f327379688f81b0dChris Lattner for (unsigned i = 0, e = getNumOptions(); i != e; ++i) { 649331de23705a719514e37c211f327379688f81b0dChris Lattner unsigned L = std::strlen(getOption(i)); 650331de23705a719514e37c211f327379688f81b0dChris Lattner cerr << " -" << getOption(i) << string(GlobalWidth-L-8, ' ') << " - " 651331de23705a719514e37c211f327379688f81b0dChris Lattner << getDescription(i) << "\n"; 652331de23705a719514e37c211f327379688f81b0dChris Lattner } 653dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner } 654dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner} 655dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 656dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 657dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner//===----------------------------------------------------------------------===// 658331de23705a719514e37c211f327379688f81b0dChris Lattner// --help and --help-hidden option implementation 659dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner// 660dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattnernamespace { 661dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 662331de23705a719514e37c211f327379688f81b0dChris Lattnerclass HelpPrinter { 663dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner unsigned MaxArgLen; 664dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner const Option *EmptyArg; 665dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner const bool ShowHidden; 666dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 667331de23705a719514e37c211f327379688f81b0dChris Lattner // isHidden/isReallyHidden - Predicates to be used to filter down arg lists. 668331de23705a719514e37c211f327379688f81b0dChris Lattner inline static bool isHidden(pair<string, Option *> &OptPair) { 669331de23705a719514e37c211f327379688f81b0dChris Lattner return OptPair.second->getOptionHiddenFlag() >= Hidden; 670331de23705a719514e37c211f327379688f81b0dChris Lattner } 671331de23705a719514e37c211f327379688f81b0dChris Lattner inline static bool isReallyHidden(pair<string, Option *> &OptPair) { 672331de23705a719514e37c211f327379688f81b0dChris Lattner return OptPair.second->getOptionHiddenFlag() == ReallyHidden; 673331de23705a719514e37c211f327379688f81b0dChris Lattner } 674331de23705a719514e37c211f327379688f81b0dChris Lattner 675331de23705a719514e37c211f327379688f81b0dChris Lattnerpublic: 676331de23705a719514e37c211f327379688f81b0dChris Lattner HelpPrinter(bool showHidden) : ShowHidden(showHidden) { 677331de23705a719514e37c211f327379688f81b0dChris Lattner EmptyArg = 0; 678331de23705a719514e37c211f327379688f81b0dChris Lattner } 679331de23705a719514e37c211f327379688f81b0dChris Lattner 680331de23705a719514e37c211f327379688f81b0dChris Lattner void operator=(bool Value) { 681331de23705a719514e37c211f327379688f81b0dChris Lattner if (Value == false) return; 682331de23705a719514e37c211f327379688f81b0dChris Lattner 683dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner // Copy Options into a vector so we can sort them as we like... 684dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner vector<pair<string, Option*> > Options; 685697954c15da58bd8b186dbafdedd8b06db770201Chris Lattner copy(getOpts().begin(), getOpts().end(), std::back_inserter(Options)); 686dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 687dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner // Eliminate Hidden or ReallyHidden arguments, depending on ShowHidden 688331de23705a719514e37c211f327379688f81b0dChris Lattner Options.erase(std::remove_if(Options.begin(), Options.end(), 689331de23705a719514e37c211f327379688f81b0dChris Lattner std::ptr_fun(ShowHidden ? isReallyHidden : isHidden)), 690dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner Options.end()); 691dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 692dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner // Eliminate duplicate entries in table (from enum flags options, f.e.) 693331de23705a719514e37c211f327379688f81b0dChris Lattner { // Give OptionSet a scope 694331de23705a719514e37c211f327379688f81b0dChris Lattner std::set<Option*> OptionSet; 695331de23705a719514e37c211f327379688f81b0dChris Lattner for (unsigned i = 0; i != Options.size(); ++i) 696331de23705a719514e37c211f327379688f81b0dChris Lattner if (OptionSet.count(Options[i].second) == 0) 697331de23705a719514e37c211f327379688f81b0dChris Lattner OptionSet.insert(Options[i].second); // Add new entry to set 698331de23705a719514e37c211f327379688f81b0dChris Lattner else 699331de23705a719514e37c211f327379688f81b0dChris Lattner Options.erase(Options.begin()+i--); // Erase duplicate 700331de23705a719514e37c211f327379688f81b0dChris Lattner } 701dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 702dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner if (ProgramOverview) 703697954c15da58bd8b186dbafdedd8b06db770201Chris Lattner cerr << "OVERVIEW:" << ProgramOverview << "\n"; 704dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 705331de23705a719514e37c211f327379688f81b0dChris Lattner cerr << "USAGE: " << ProgramName << " [options]"; 706331de23705a719514e37c211f327379688f81b0dChris Lattner 707331de23705a719514e37c211f327379688f81b0dChris Lattner // Print out the positional options... 708331de23705a719514e37c211f327379688f81b0dChris Lattner vector<Option*> &PosOpts = getPositionalOpts(); 709331de23705a719514e37c211f327379688f81b0dChris Lattner Option *CAOpt = 0; // The cl::ConsumeAfter option, if it exists... 710331de23705a719514e37c211f327379688f81b0dChris Lattner if (!PosOpts.empty() && PosOpts[0]->getNumOccurancesFlag() == ConsumeAfter) 711331de23705a719514e37c211f327379688f81b0dChris Lattner CAOpt = PosOpts[0]; 712331de23705a719514e37c211f327379688f81b0dChris Lattner 713331de23705a719514e37c211f327379688f81b0dChris Lattner for (unsigned i = CAOpt != 0, e = PosOpts.size(); i != e; ++i) { 714331de23705a719514e37c211f327379688f81b0dChris Lattner cerr << " " << PosOpts[i]->HelpStr; 715331de23705a719514e37c211f327379688f81b0dChris Lattner switch (PosOpts[i]->getNumOccurancesFlag()) { 716331de23705a719514e37c211f327379688f81b0dChris Lattner case Optional: cerr << "?"; break; 717331de23705a719514e37c211f327379688f81b0dChris Lattner case ZeroOrMore: cerr << "*"; break; 718331de23705a719514e37c211f327379688f81b0dChris Lattner case Required: break; 719331de23705a719514e37c211f327379688f81b0dChris Lattner case OneOrMore: cerr << "+"; break; 720331de23705a719514e37c211f327379688f81b0dChris Lattner case ConsumeAfter: 721331de23705a719514e37c211f327379688f81b0dChris Lattner default: 722331de23705a719514e37c211f327379688f81b0dChris Lattner assert(0 && "Unknown NumOccurances Flag Value!"); 723331de23705a719514e37c211f327379688f81b0dChris Lattner } 724331de23705a719514e37c211f327379688f81b0dChris Lattner } 725331de23705a719514e37c211f327379688f81b0dChris Lattner 726331de23705a719514e37c211f327379688f81b0dChris Lattner // Print the consume after option info if it exists... 727331de23705a719514e37c211f327379688f81b0dChris Lattner if (CAOpt) cerr << " " << CAOpt->HelpStr; 728331de23705a719514e37c211f327379688f81b0dChris Lattner 729331de23705a719514e37c211f327379688f81b0dChris Lattner cerr << "\n\n"; 730dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 731dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner // Compute the maximum argument length... 732dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner MaxArgLen = 0; 733331de23705a719514e37c211f327379688f81b0dChris Lattner for (unsigned i = 0, e = Options.size(); i != e; ++i) 734331de23705a719514e37c211f327379688f81b0dChris Lattner MaxArgLen = std::max(MaxArgLen, Options[i].second->getOptionWidth()); 735dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 736dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner cerr << "OPTIONS:\n"; 737331de23705a719514e37c211f327379688f81b0dChris Lattner for (unsigned i = 0, e = Options.size(); i != e; ++i) 738331de23705a719514e37c211f327379688f81b0dChris Lattner Options[i].second->printOptionInfo(MaxArgLen); 739dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 740331de23705a719514e37c211f327379688f81b0dChris Lattner // Halt the program if help information is printed 741331de23705a719514e37c211f327379688f81b0dChris Lattner exit(1); 742dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner } 743331de23705a719514e37c211f327379688f81b0dChris Lattner}; 744dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 745dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 746dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 747331de23705a719514e37c211f327379688f81b0dChris Lattner// Define the two HelpPrinter instances that are used to print out help, or 748331de23705a719514e37c211f327379688f81b0dChris Lattner// help-hidden... 749331de23705a719514e37c211f327379688f81b0dChris Lattner// 750331de23705a719514e37c211f327379688f81b0dChris LattnerHelpPrinter NormalPrinter(false); 751331de23705a719514e37c211f327379688f81b0dChris LattnerHelpPrinter HiddenPrinter(true); 752331de23705a719514e37c211f327379688f81b0dChris Lattner 753331de23705a719514e37c211f327379688f81b0dChris Lattnercl::opt<HelpPrinter, true, parser<bool> > 754331de23705a719514e37c211f327379688f81b0dChris LattnerHOp("help", cl::desc("display available options (--help-hidden for more)"), 755331de23705a719514e37c211f327379688f81b0dChris Lattner cl::location(NormalPrinter)); 756dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 757331de23705a719514e37c211f327379688f81b0dChris Lattnercl::opt<HelpPrinter, true, parser<bool> > 758331de23705a719514e37c211f327379688f81b0dChris LattnerHHOp("help-hidden", cl::desc("display all available options"), 759331de23705a719514e37c211f327379688f81b0dChris Lattner cl::location(HiddenPrinter), cl::Hidden); 760dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 761dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner} // End anonymous namespace 762