CommandLine.cpp revision d16714b5ed076d0c1d14543098c1e9b90fd92a38
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" 13dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner#include <algorithm> 14dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner#include <map> 15dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner#include <set> 16697954c15da58bd8b186dbafdedd8b06db770201Chris Lattner#include <iostream> 177f1576f0424542d6162c1cedc14629e4cbc3e80aChris Lattner 18dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattnerusing namespace cl; 19697954c15da58bd8b186dbafdedd8b06db770201Chris Lattnerusing std::map; 20697954c15da58bd8b186dbafdedd8b06db770201Chris Lattnerusing std::pair; 21697954c15da58bd8b186dbafdedd8b06db770201Chris Lattnerusing std::vector; 22697954c15da58bd8b186dbafdedd8b06db770201Chris Lattnerusing std::string; 23697954c15da58bd8b186dbafdedd8b06db770201Chris Lattnerusing std::cerr; 24dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 25331de23705a719514e37c211f327379688f81b0dChris Lattner//===----------------------------------------------------------------------===// 26331de23705a719514e37c211f327379688f81b0dChris Lattner// Basic, shared command line option processing machinery... 27331de23705a719514e37c211f327379688f81b0dChris Lattner// 28331de23705a719514e37c211f327379688f81b0dChris Lattner 29dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner// Return the global command line option vector. Making it a function scoped 30f78032fe064bdd2b9a19b875261747b7d0a27a73Chris Lattner// static ensures that it will be initialized correctly before its first use. 31dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner// 32e8e258b1a7e54a77c802e8b309d0a60a62d1a00dChris Lattnerstatic map<string,Option*> *CommandLineOptions = 0; 33dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattnerstatic map<string, Option*> &getOpts() { 34e8e258b1a7e54a77c802e8b309d0a60a62d1a00dChris Lattner if (CommandLineOptions == 0) CommandLineOptions = new map<string,Option*>(); 35e8e258b1a7e54a77c802e8b309d0a60a62d1a00dChris Lattner return *CommandLineOptions; 36e8e258b1a7e54a77c802e8b309d0a60a62d1a00dChris Lattner} 37e8e258b1a7e54a77c802e8b309d0a60a62d1a00dChris Lattner 38e8e258b1a7e54a77c802e8b309d0a60a62d1a00dChris Lattnerstatic Option *getOption(const string &Str) { 39e8e258b1a7e54a77c802e8b309d0a60a62d1a00dChris Lattner if (CommandLineOptions == 0) return 0; 40e8e258b1a7e54a77c802e8b309d0a60a62d1a00dChris Lattner map<string,Option*>::iterator I = CommandLineOptions->find(Str); 41e8e258b1a7e54a77c802e8b309d0a60a62d1a00dChris Lattner return I != CommandLineOptions->end() ? I->second : 0; 42dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner} 43dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 44331de23705a719514e37c211f327379688f81b0dChris Lattnerstatic vector<Option*> &getPositionalOpts() { 45331de23705a719514e37c211f327379688f81b0dChris Lattner static vector<Option*> Positional; 46331de23705a719514e37c211f327379688f81b0dChris Lattner return Positional; 47331de23705a719514e37c211f327379688f81b0dChris Lattner} 48331de23705a719514e37c211f327379688f81b0dChris Lattner 49e8e258b1a7e54a77c802e8b309d0a60a62d1a00dChris Lattnerstatic void AddArgument(const char *ArgName, Option *Opt) { 50e8e258b1a7e54a77c802e8b309d0a60a62d1a00dChris Lattner if (getOption(ArgName)) { 51dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner cerr << "CommandLine Error: Argument '" << ArgName 529c9be48b8396e7244e47d2af8890da8eec71c72dChris Lattner << "' defined more than once!\n"; 53dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner } else { 54f78032fe064bdd2b9a19b875261747b7d0a27a73Chris Lattner // Add argument to the argument map! 55e8e258b1a7e54a77c802e8b309d0a60a62d1a00dChris Lattner getOpts()[ArgName] = Opt; 56e8e258b1a7e54a77c802e8b309d0a60a62d1a00dChris Lattner } 57e8e258b1a7e54a77c802e8b309d0a60a62d1a00dChris Lattner} 58e8e258b1a7e54a77c802e8b309d0a60a62d1a00dChris Lattner 59e8e258b1a7e54a77c802e8b309d0a60a62d1a00dChris Lattner// RemoveArgument - It's possible that the argument is no longer in the map if 60e8e258b1a7e54a77c802e8b309d0a60a62d1a00dChris Lattner// options have already been processed and the map has been deleted! 61e8e258b1a7e54a77c802e8b309d0a60a62d1a00dChris Lattner// 62e8e258b1a7e54a77c802e8b309d0a60a62d1a00dChris Lattnerstatic void RemoveArgument(const char *ArgName, Option *Opt) { 63e8e258b1a7e54a77c802e8b309d0a60a62d1a00dChris Lattner if (CommandLineOptions == 0) return; 64e8e258b1a7e54a77c802e8b309d0a60a62d1a00dChris Lattner assert(getOption(ArgName) == Opt && "Arg not in map!"); 65e8e258b1a7e54a77c802e8b309d0a60a62d1a00dChris Lattner CommandLineOptions->erase(ArgName); 66e8e258b1a7e54a77c802e8b309d0a60a62d1a00dChris Lattner if (CommandLineOptions->empty()) { 67e8e258b1a7e54a77c802e8b309d0a60a62d1a00dChris Lattner delete CommandLineOptions; 68e8e258b1a7e54a77c802e8b309d0a60a62d1a00dChris Lattner CommandLineOptions = 0; 69dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner } 70dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner} 71dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 72dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattnerstatic const char *ProgramName = 0; 73dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattnerstatic const char *ProgramOverview = 0; 74dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 75caccd761a6320d9068a44198b9e1b6c3659f8bb5Chris Lattnerstatic inline bool ProvideOption(Option *Handler, const char *ArgName, 76caccd761a6320d9068a44198b9e1b6c3659f8bb5Chris Lattner const char *Value, int argc, char **argv, 77caccd761a6320d9068a44198b9e1b6c3659f8bb5Chris Lattner int &i) { 78caccd761a6320d9068a44198b9e1b6c3659f8bb5Chris Lattner // Enforce value requirements 79caccd761a6320d9068a44198b9e1b6c3659f8bb5Chris Lattner switch (Handler->getValueExpectedFlag()) { 80caccd761a6320d9068a44198b9e1b6c3659f8bb5Chris Lattner case ValueRequired: 81caccd761a6320d9068a44198b9e1b6c3659f8bb5Chris Lattner if (Value == 0 || *Value == 0) { // No value specified? 82caccd761a6320d9068a44198b9e1b6c3659f8bb5Chris Lattner if (i+1 < argc) { // Steal the next argument, like for '-o filename' 83caccd761a6320d9068a44198b9e1b6c3659f8bb5Chris Lattner Value = argv[++i]; 84caccd761a6320d9068a44198b9e1b6c3659f8bb5Chris Lattner } else { 85caccd761a6320d9068a44198b9e1b6c3659f8bb5Chris Lattner return Handler->error(" requires a value!"); 86caccd761a6320d9068a44198b9e1b6c3659f8bb5Chris Lattner } 87caccd761a6320d9068a44198b9e1b6c3659f8bb5Chris Lattner } 88caccd761a6320d9068a44198b9e1b6c3659f8bb5Chris Lattner break; 89caccd761a6320d9068a44198b9e1b6c3659f8bb5Chris Lattner case ValueDisallowed: 90caccd761a6320d9068a44198b9e1b6c3659f8bb5Chris Lattner if (*Value != 0) 91caccd761a6320d9068a44198b9e1b6c3659f8bb5Chris Lattner return Handler->error(" does not allow a value! '" + 92caccd761a6320d9068a44198b9e1b6c3659f8bb5Chris Lattner string(Value) + "' specified."); 93caccd761a6320d9068a44198b9e1b6c3659f8bb5Chris Lattner break; 94caccd761a6320d9068a44198b9e1b6c3659f8bb5Chris Lattner case ValueOptional: break; 95caccd761a6320d9068a44198b9e1b6c3659f8bb5Chris Lattner default: cerr << "Bad ValueMask flag! CommandLine usage error:" 96697954c15da58bd8b186dbafdedd8b06db770201Chris Lattner << Handler->getValueExpectedFlag() << "\n"; abort(); 97caccd761a6320d9068a44198b9e1b6c3659f8bb5Chris Lattner } 98caccd761a6320d9068a44198b9e1b6c3659f8bb5Chris Lattner 99caccd761a6320d9068a44198b9e1b6c3659f8bb5Chris Lattner // Run the handler now! 100caccd761a6320d9068a44198b9e1b6c3659f8bb5Chris Lattner return Handler->addOccurance(ArgName, Value); 101caccd761a6320d9068a44198b9e1b6c3659f8bb5Chris Lattner} 102caccd761a6320d9068a44198b9e1b6c3659f8bb5Chris Lattner 103331de23705a719514e37c211f327379688f81b0dChris Lattnerstatic bool ProvidePositionalOption(Option *Handler, string &Arg) { 104331de23705a719514e37c211f327379688f81b0dChris Lattner int Dummy; 105331de23705a719514e37c211f327379688f81b0dChris Lattner return ProvideOption(Handler, "", Arg.c_str(), 0, 0, Dummy); 106331de23705a719514e37c211f327379688f81b0dChris Lattner} 107331de23705a719514e37c211f327379688f81b0dChris Lattner 108331de23705a719514e37c211f327379688f81b0dChris Lattner 109331de23705a719514e37c211f327379688f81b0dChris Lattner// Option predicates... 110331de23705a719514e37c211f327379688f81b0dChris Lattnerstatic inline bool isGrouping(const Option *O) { 111331de23705a719514e37c211f327379688f81b0dChris Lattner return O->getFormattingFlag() == cl::Grouping; 112331de23705a719514e37c211f327379688f81b0dChris Lattner} 113331de23705a719514e37c211f327379688f81b0dChris Lattnerstatic inline bool isPrefixedOrGrouping(const Option *O) { 114331de23705a719514e37c211f327379688f81b0dChris Lattner return isGrouping(O) || O->getFormattingFlag() == cl::Prefix; 115331de23705a719514e37c211f327379688f81b0dChris Lattner} 116331de23705a719514e37c211f327379688f81b0dChris Lattner 117331de23705a719514e37c211f327379688f81b0dChris Lattner// getOptionPred - Check to see if there are any options that satisfy the 118331de23705a719514e37c211f327379688f81b0dChris Lattner// specified predicate with names that are the prefixes in Name. This is 119331de23705a719514e37c211f327379688f81b0dChris Lattner// checked by progressively stripping characters off of the name, checking to 120331de23705a719514e37c211f327379688f81b0dChris Lattner// see if there options that satisfy the predicate. If we find one, return it, 121331de23705a719514e37c211f327379688f81b0dChris Lattner// otherwise return null. 122f78032fe064bdd2b9a19b875261747b7d0a27a73Chris Lattner// 123331de23705a719514e37c211f327379688f81b0dChris Lattnerstatic Option *getOptionPred(std::string Name, unsigned &Length, 124331de23705a719514e37c211f327379688f81b0dChris Lattner bool (*Pred)(const Option*)) { 125331de23705a719514e37c211f327379688f81b0dChris Lattner 126e8e258b1a7e54a77c802e8b309d0a60a62d1a00dChris Lattner Option *Op = getOption(Name); 127e8e258b1a7e54a77c802e8b309d0a60a62d1a00dChris Lattner if (Op && Pred(Op)) { 128331de23705a719514e37c211f327379688f81b0dChris Lattner Length = Name.length(); 129e8e258b1a7e54a77c802e8b309d0a60a62d1a00dChris Lattner return Op; 130331de23705a719514e37c211f327379688f81b0dChris Lattner } 131f78032fe064bdd2b9a19b875261747b7d0a27a73Chris Lattner 132331de23705a719514e37c211f327379688f81b0dChris Lattner if (Name.size() == 1) return 0; 133331de23705a719514e37c211f327379688f81b0dChris Lattner do { 134331de23705a719514e37c211f327379688f81b0dChris Lattner Name.erase(Name.end()-1, Name.end()); // Chop off the last character... 135e8e258b1a7e54a77c802e8b309d0a60a62d1a00dChris Lattner Op = getOption(Name); 136331de23705a719514e37c211f327379688f81b0dChris Lattner 137331de23705a719514e37c211f327379688f81b0dChris Lattner // Loop while we haven't found an option and Name still has at least two 138331de23705a719514e37c211f327379688f81b0dChris Lattner // characters in it (so that the next iteration will not be the empty 139331de23705a719514e37c211f327379688f81b0dChris Lattner // string... 140e8e258b1a7e54a77c802e8b309d0a60a62d1a00dChris Lattner } while ((Op == 0 || !Pred(Op)) && Name.size() > 1); 141331de23705a719514e37c211f327379688f81b0dChris Lattner 142e8e258b1a7e54a77c802e8b309d0a60a62d1a00dChris Lattner if (Op && Pred(Op)) { 143331de23705a719514e37c211f327379688f81b0dChris Lattner Length = Name.length(); 144e8e258b1a7e54a77c802e8b309d0a60a62d1a00dChris Lattner return Op; // Found one! 145f78032fe064bdd2b9a19b875261747b7d0a27a73Chris Lattner } 146331de23705a719514e37c211f327379688f81b0dChris Lattner return 0; // No option found! 147331de23705a719514e37c211f327379688f81b0dChris Lattner} 148f78032fe064bdd2b9a19b875261747b7d0a27a73Chris Lattner 149331de23705a719514e37c211f327379688f81b0dChris Lattnerstatic bool RequiresValue(const Option *O) { 150331de23705a719514e37c211f327379688f81b0dChris Lattner return O->getNumOccurancesFlag() == cl::Required || 151331de23705a719514e37c211f327379688f81b0dChris Lattner O->getNumOccurancesFlag() == cl::OneOrMore; 152331de23705a719514e37c211f327379688f81b0dChris Lattner} 153331de23705a719514e37c211f327379688f81b0dChris Lattner 154331de23705a719514e37c211f327379688f81b0dChris Lattnerstatic bool EatsUnboundedNumberOfValues(const Option *O) { 155331de23705a719514e37c211f327379688f81b0dChris Lattner return O->getNumOccurancesFlag() == cl::ZeroOrMore || 156331de23705a719514e37c211f327379688f81b0dChris Lattner O->getNumOccurancesFlag() == cl::OneOrMore; 157f78032fe064bdd2b9a19b875261747b7d0a27a73Chris Lattner} 158caccd761a6320d9068a44198b9e1b6c3659f8bb5Chris Lattner 159dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattnervoid cl::ParseCommandLineOptions(int &argc, char **argv, 1600c0edf8afc35a42b15a24ebb5fa5f3fc674290aeChris Lattner const char *Overview) { 161331de23705a719514e37c211f327379688f81b0dChris Lattner assert((!getOpts().empty() || !getPositionalOpts().empty()) && 162331de23705a719514e37c211f327379688f81b0dChris Lattner "No options specified, or ParseCommandLineOptions called more" 163331de23705a719514e37c211f327379688f81b0dChris Lattner " than once!"); 164dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner ProgramName = argv[0]; // Save this away safe and snug 165dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner ProgramOverview = Overview; 166dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner bool ErrorParsing = false; 167dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 168331de23705a719514e37c211f327379688f81b0dChris Lattner map<string, Option*> &Opts = getOpts(); 169331de23705a719514e37c211f327379688f81b0dChris Lattner vector<Option*> &PositionalOpts = getPositionalOpts(); 170331de23705a719514e37c211f327379688f81b0dChris Lattner 171331de23705a719514e37c211f327379688f81b0dChris Lattner // Check out the positional arguments to collect information about them. 172331de23705a719514e37c211f327379688f81b0dChris Lattner unsigned NumPositionalRequired = 0; 173331de23705a719514e37c211f327379688f81b0dChris Lattner Option *ConsumeAfterOpt = 0; 174331de23705a719514e37c211f327379688f81b0dChris Lattner if (!PositionalOpts.empty()) { 175331de23705a719514e37c211f327379688f81b0dChris Lattner if (PositionalOpts[0]->getNumOccurancesFlag() == cl::ConsumeAfter) { 176331de23705a719514e37c211f327379688f81b0dChris Lattner assert(PositionalOpts.size() > 1 && 177331de23705a719514e37c211f327379688f81b0dChris Lattner "Cannot specify cl::ConsumeAfter without a positional argument!"); 178331de23705a719514e37c211f327379688f81b0dChris Lattner ConsumeAfterOpt = PositionalOpts[0]; 179331de23705a719514e37c211f327379688f81b0dChris Lattner } 180331de23705a719514e37c211f327379688f81b0dChris Lattner 181331de23705a719514e37c211f327379688f81b0dChris Lattner // Calculate how many positional values are _required_. 182331de23705a719514e37c211f327379688f81b0dChris Lattner bool UnboundedFound = false; 183331de23705a719514e37c211f327379688f81b0dChris Lattner for (unsigned i = ConsumeAfterOpt != 0, e = PositionalOpts.size(); 184331de23705a719514e37c211f327379688f81b0dChris Lattner i != e; ++i) { 185331de23705a719514e37c211f327379688f81b0dChris Lattner Option *Opt = PositionalOpts[i]; 186331de23705a719514e37c211f327379688f81b0dChris Lattner if (RequiresValue(Opt)) 187331de23705a719514e37c211f327379688f81b0dChris Lattner ++NumPositionalRequired; 188331de23705a719514e37c211f327379688f81b0dChris Lattner else if (ConsumeAfterOpt) { 189331de23705a719514e37c211f327379688f81b0dChris Lattner // ConsumeAfter cannot be combined with "optional" positional options 19054ec7aed89e4a5d8cc11c36999d88012cbfcc18aChris Lattner // unless there is only one positional argument... 19154ec7aed89e4a5d8cc11c36999d88012cbfcc18aChris Lattner if (PositionalOpts.size() > 2) 19254ec7aed89e4a5d8cc11c36999d88012cbfcc18aChris Lattner ErrorParsing |= 19354ec7aed89e4a5d8cc11c36999d88012cbfcc18aChris Lattner Opt->error(" error - this positional option will never be matched, " 19454ec7aed89e4a5d8cc11c36999d88012cbfcc18aChris Lattner "because it does not Require a value, and a " 19554ec7aed89e4a5d8cc11c36999d88012cbfcc18aChris Lattner "cl::ConsumeAfter option is active!"); 196331de23705a719514e37c211f327379688f81b0dChris Lattner } else if (UnboundedFound) { // This option does not "require" a value... 197331de23705a719514e37c211f327379688f81b0dChris Lattner // Make sure this option is not specified after an option that eats all 198331de23705a719514e37c211f327379688f81b0dChris Lattner // extra arguments, or this one will never get any! 199331de23705a719514e37c211f327379688f81b0dChris Lattner // 200331de23705a719514e37c211f327379688f81b0dChris Lattner ErrorParsing |= Opt->error(" error - option can never match, because " 201331de23705a719514e37c211f327379688f81b0dChris Lattner "another positional argument will match an " 202331de23705a719514e37c211f327379688f81b0dChris Lattner "unbounded number of values, and this option" 203331de23705a719514e37c211f327379688f81b0dChris Lattner " does not require a value!"); 204331de23705a719514e37c211f327379688f81b0dChris Lattner } 205331de23705a719514e37c211f327379688f81b0dChris Lattner UnboundedFound |= EatsUnboundedNumberOfValues(Opt); 206331de23705a719514e37c211f327379688f81b0dChris Lattner } 207331de23705a719514e37c211f327379688f81b0dChris Lattner } 208331de23705a719514e37c211f327379688f81b0dChris Lattner 209331de23705a719514e37c211f327379688f81b0dChris Lattner // PositionalVals - A vector of "positional" arguments we accumulate into to 210331de23705a719514e37c211f327379688f81b0dChris Lattner // processes at the end... 211331de23705a719514e37c211f327379688f81b0dChris Lattner // 212331de23705a719514e37c211f327379688f81b0dChris Lattner vector<string> PositionalVals; 213331de23705a719514e37c211f327379688f81b0dChris Lattner 214dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner // Loop over all of the arguments... processing them. 215331de23705a719514e37c211f327379688f81b0dChris Lattner bool DashDashFound = false; // Have we read '--'? 216dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner for (int i = 1; i < argc; ++i) { 217dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner Option *Handler = 0; 218dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner const char *Value = ""; 219dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner const char *ArgName = ""; 220331de23705a719514e37c211f327379688f81b0dChris Lattner 221331de23705a719514e37c211f327379688f81b0dChris Lattner // Check to see if this is a positional argument. This argument is 222331de23705a719514e37c211f327379688f81b0dChris Lattner // considered to be positional if it doesn't start with '-', if it is "-" 223331de23705a719514e37c211f327379688f81b0dChris Lattner // itself, or if we have see "--" already. 224331de23705a719514e37c211f327379688f81b0dChris Lattner // 225331de23705a719514e37c211f327379688f81b0dChris Lattner if (argv[i][0] != '-' || argv[i][1] == 0 || DashDashFound) { 226331de23705a719514e37c211f327379688f81b0dChris Lattner // Positional argument! 227331de23705a719514e37c211f327379688f81b0dChris Lattner if (!PositionalOpts.empty()) { 228331de23705a719514e37c211f327379688f81b0dChris Lattner PositionalVals.push_back(argv[i]); 229331de23705a719514e37c211f327379688f81b0dChris Lattner 230331de23705a719514e37c211f327379688f81b0dChris Lattner // All of the positional arguments have been fulfulled, give the rest to 231331de23705a719514e37c211f327379688f81b0dChris Lattner // the consume after option... if it's specified... 232331de23705a719514e37c211f327379688f81b0dChris Lattner // 233d16714b5ed076d0c1d14543098c1e9b90fd92a38Chris Lattner if (PositionalVals.size() >= NumPositionalRequired && 234331de23705a719514e37c211f327379688f81b0dChris Lattner ConsumeAfterOpt != 0) { 235331de23705a719514e37c211f327379688f81b0dChris Lattner for (++i; i < argc; ++i) 236331de23705a719514e37c211f327379688f81b0dChris Lattner PositionalVals.push_back(argv[i]); 237331de23705a719514e37c211f327379688f81b0dChris Lattner break; // Handle outside of the argument processing loop... 238331de23705a719514e37c211f327379688f81b0dChris Lattner } 239331de23705a719514e37c211f327379688f81b0dChris Lattner 240331de23705a719514e37c211f327379688f81b0dChris Lattner // Delay processing positional arguments until the end... 241331de23705a719514e37c211f327379688f81b0dChris Lattner continue; 242331de23705a719514e37c211f327379688f81b0dChris Lattner } 243331de23705a719514e37c211f327379688f81b0dChris Lattner } else { // We start with a '-', must be an argument... 244dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner ArgName = argv[i]+1; 245dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner while (*ArgName == '-') ++ArgName; // Eat leading dashes 246dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 247331de23705a719514e37c211f327379688f81b0dChris Lattner if (*ArgName == 0 && !DashDashFound) { // Is this the mythical "--"? 248331de23705a719514e37c211f327379688f81b0dChris Lattner DashDashFound = true; // Yup, take note of that fact... 249331de23705a719514e37c211f327379688f81b0dChris Lattner continue; // Don't try to process it as an argument iself. 250331de23705a719514e37c211f327379688f81b0dChris Lattner } 251331de23705a719514e37c211f327379688f81b0dChris Lattner 252dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner const char *ArgNameEnd = ArgName; 253f78032fe064bdd2b9a19b875261747b7d0a27a73Chris Lattner while (*ArgNameEnd && *ArgNameEnd != '=') 254f78032fe064bdd2b9a19b875261747b7d0a27a73Chris Lattner ++ArgNameEnd; // Scan till end of argument name... 255dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 256dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner Value = ArgNameEnd; 257dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner if (*Value) // If we have an equals sign... 258dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner ++Value; // Advance to value... 259dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 260dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner if (*ArgName != 0) { 261f78032fe064bdd2b9a19b875261747b7d0a27a73Chris Lattner string RealName(ArgName, ArgNameEnd); 2623805e4ccfa6b908c5035256ea6ee51e219f029dbChris Lattner // Extract arg name part 263331de23705a719514e37c211f327379688f81b0dChris Lattner map<string, Option*>::iterator I = Opts.find(RealName); 264331de23705a719514e37c211f327379688f81b0dChris Lattner 265331de23705a719514e37c211f327379688f81b0dChris Lattner if (I == Opts.end() && !*Value && RealName.size() > 1) { 266331de23705a719514e37c211f327379688f81b0dChris Lattner // Check to see if this "option" is really a prefixed or grouped 267331de23705a719514e37c211f327379688f81b0dChris Lattner // argument... 268331de23705a719514e37c211f327379688f81b0dChris Lattner // 269331de23705a719514e37c211f327379688f81b0dChris Lattner unsigned Length = 0; 270331de23705a719514e37c211f327379688f81b0dChris Lattner Option *PGOpt = getOptionPred(RealName, Length, isPrefixedOrGrouping); 271331de23705a719514e37c211f327379688f81b0dChris Lattner 272331de23705a719514e37c211f327379688f81b0dChris Lattner // If the option is a prefixed option, then the value is simply the 273331de23705a719514e37c211f327379688f81b0dChris Lattner // rest of the name... so fall through to later processing, by 274331de23705a719514e37c211f327379688f81b0dChris Lattner // setting up the argument name flags and value fields. 275331de23705a719514e37c211f327379688f81b0dChris Lattner // 276331de23705a719514e37c211f327379688f81b0dChris Lattner if (PGOpt && PGOpt->getFormattingFlag() == cl::Prefix) { 277331de23705a719514e37c211f327379688f81b0dChris Lattner ArgNameEnd = ArgName+Length; 278331de23705a719514e37c211f327379688f81b0dChris Lattner Value = ArgNameEnd; 279331de23705a719514e37c211f327379688f81b0dChris Lattner I = Opts.find(string(ArgName, ArgNameEnd)); 280331de23705a719514e37c211f327379688f81b0dChris Lattner assert(I->second == PGOpt); 281331de23705a719514e37c211f327379688f81b0dChris Lattner } else if (PGOpt) { 282331de23705a719514e37c211f327379688f81b0dChris Lattner // This must be a grouped option... handle all of them now... 283331de23705a719514e37c211f327379688f81b0dChris Lattner assert(isGrouping(PGOpt) && "Broken getOptionPred!"); 284331de23705a719514e37c211f327379688f81b0dChris Lattner 285331de23705a719514e37c211f327379688f81b0dChris Lattner do { 286331de23705a719514e37c211f327379688f81b0dChris Lattner // Move current arg name out of RealName into RealArgName... 287331de23705a719514e37c211f327379688f81b0dChris Lattner string RealArgName(RealName.begin(), RealName.begin()+Length); 288331de23705a719514e37c211f327379688f81b0dChris Lattner RealName.erase(RealName.begin(), RealName.begin()+Length); 289f78032fe064bdd2b9a19b875261747b7d0a27a73Chris Lattner 290f78032fe064bdd2b9a19b875261747b7d0a27a73Chris Lattner // Because ValueRequired is an invalid flag for grouped arguments, 291f78032fe064bdd2b9a19b875261747b7d0a27a73Chris Lattner // we don't need to pass argc/argv in... 292f78032fe064bdd2b9a19b875261747b7d0a27a73Chris Lattner // 293331de23705a719514e37c211f327379688f81b0dChris Lattner assert(PGOpt->getValueExpectedFlag() != cl::ValueRequired && 294331de23705a719514e37c211f327379688f81b0dChris Lattner "Option can not be cl::Grouping AND cl::ValueRequired!"); 295331de23705a719514e37c211f327379688f81b0dChris Lattner int Dummy; 296331de23705a719514e37c211f327379688f81b0dChris Lattner ErrorParsing |= ProvideOption(PGOpt, RealArgName.c_str(), "", 297331de23705a719514e37c211f327379688f81b0dChris Lattner 0, 0, Dummy); 298331de23705a719514e37c211f327379688f81b0dChris Lattner 299331de23705a719514e37c211f327379688f81b0dChris Lattner // Get the next grouping option... 300331de23705a719514e37c211f327379688f81b0dChris Lattner if (!RealName.empty()) 301331de23705a719514e37c211f327379688f81b0dChris Lattner PGOpt = getOptionPred(RealName, Length, isGrouping); 302331de23705a719514e37c211f327379688f81b0dChris Lattner } while (!RealName.empty() && PGOpt); 303331de23705a719514e37c211f327379688f81b0dChris Lattner 304331de23705a719514e37c211f327379688f81b0dChris Lattner if (RealName.empty()) // Processed all of the options, move on 305331de23705a719514e37c211f327379688f81b0dChris Lattner continue; // to the next argv[] value... 306331de23705a719514e37c211f327379688f81b0dChris Lattner 307331de23705a719514e37c211f327379688f81b0dChris Lattner // If RealName is not empty, that means we did not match one of the 308331de23705a719514e37c211f327379688f81b0dChris Lattner // options! This is an error. 309331de23705a719514e37c211f327379688f81b0dChris Lattner // 310331de23705a719514e37c211f327379688f81b0dChris Lattner I = Opts.end(); 311331de23705a719514e37c211f327379688f81b0dChris Lattner } 312f78032fe064bdd2b9a19b875261747b7d0a27a73Chris Lattner } 313f78032fe064bdd2b9a19b875261747b7d0a27a73Chris Lattner 314331de23705a719514e37c211f327379688f81b0dChris Lattner Handler = I != Opts.end() ? I->second : 0; 315dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner } 316dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner } 317dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 318dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner if (Handler == 0) { 319dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner cerr << "Unknown command line argument '" << argv[i] << "'. Try: " 320f038acbee21cfed998451aedd00a81901d299516Chris Lattner << argv[0] << " --help'\n"; 321dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner ErrorParsing = true; 322dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner continue; 323dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner } 324dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 325caccd761a6320d9068a44198b9e1b6c3659f8bb5Chris Lattner ErrorParsing |= ProvideOption(Handler, ArgName, Value, argc, argv, i); 326331de23705a719514e37c211f327379688f81b0dChris Lattner } 327dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 328331de23705a719514e37c211f327379688f81b0dChris Lattner // Check and handle positional arguments now... 329331de23705a719514e37c211f327379688f81b0dChris Lattner if (NumPositionalRequired > PositionalVals.size()) { 330331de23705a719514e37c211f327379688f81b0dChris Lattner cerr << "Not enough positional command line arguments specified!\n"; 331331de23705a719514e37c211f327379688f81b0dChris Lattner cerr << "Must specify at least " << NumPositionalRequired 332331de23705a719514e37c211f327379688f81b0dChris Lattner << " positional arguments: See: " << argv[0] << " --help\n"; 333331de23705a719514e37c211f327379688f81b0dChris Lattner ErrorParsing = true; 334331de23705a719514e37c211f327379688f81b0dChris Lattner 335331de23705a719514e37c211f327379688f81b0dChris Lattner 336331de23705a719514e37c211f327379688f81b0dChris Lattner } else if (ConsumeAfterOpt == 0) { 337331de23705a719514e37c211f327379688f81b0dChris Lattner // Positional args have already been handled if ConsumeAfter is specified... 338331de23705a719514e37c211f327379688f81b0dChris Lattner unsigned ValNo = 0, NumVals = PositionalVals.size(); 339331de23705a719514e37c211f327379688f81b0dChris Lattner for (unsigned i = 0, e = PositionalOpts.size(); i != e; ++i) { 340331de23705a719514e37c211f327379688f81b0dChris Lattner if (RequiresValue(PositionalOpts[i])) { 341331de23705a719514e37c211f327379688f81b0dChris Lattner ProvidePositionalOption(PositionalOpts[i], PositionalVals[ValNo++]); 342331de23705a719514e37c211f327379688f81b0dChris Lattner --NumPositionalRequired; // We fulfilled our duty... 343331de23705a719514e37c211f327379688f81b0dChris Lattner } 344331de23705a719514e37c211f327379688f81b0dChris Lattner 345331de23705a719514e37c211f327379688f81b0dChris Lattner // If we _can_ give this option more arguments, do so now, as long as we 346331de23705a719514e37c211f327379688f81b0dChris Lattner // do not give it values that others need. 'Done' controls whether the 347331de23705a719514e37c211f327379688f81b0dChris Lattner // option even _WANTS_ any more. 348331de23705a719514e37c211f327379688f81b0dChris Lattner // 349331de23705a719514e37c211f327379688f81b0dChris Lattner bool Done = PositionalOpts[i]->getNumOccurancesFlag() == cl::Required; 350331de23705a719514e37c211f327379688f81b0dChris Lattner while (NumVals-ValNo > NumPositionalRequired && !Done) { 351331de23705a719514e37c211f327379688f81b0dChris Lattner switch (PositionalOpts[i]->getNumOccurancesFlag()) { 352331de23705a719514e37c211f327379688f81b0dChris Lattner case cl::Optional: 353331de23705a719514e37c211f327379688f81b0dChris Lattner Done = true; // Optional arguments want _at most_ one value 354331de23705a719514e37c211f327379688f81b0dChris Lattner // FALL THROUGH 355331de23705a719514e37c211f327379688f81b0dChris Lattner case cl::ZeroOrMore: // Zero or more will take all they can get... 356331de23705a719514e37c211f327379688f81b0dChris Lattner case cl::OneOrMore: // One or more will take all they can get... 357331de23705a719514e37c211f327379688f81b0dChris Lattner ProvidePositionalOption(PositionalOpts[i], PositionalVals[ValNo++]); 358331de23705a719514e37c211f327379688f81b0dChris Lattner break; 359331de23705a719514e37c211f327379688f81b0dChris Lattner default: 360331de23705a719514e37c211f327379688f81b0dChris Lattner assert(0 && "Internal error, unexpected NumOccurances flag in " 361331de23705a719514e37c211f327379688f81b0dChris Lattner "positional argument processing!"); 362331de23705a719514e37c211f327379688f81b0dChris Lattner } 363331de23705a719514e37c211f327379688f81b0dChris Lattner } 364caccd761a6320d9068a44198b9e1b6c3659f8bb5Chris Lattner } 365331de23705a719514e37c211f327379688f81b0dChris Lattner } else { 366331de23705a719514e37c211f327379688f81b0dChris Lattner assert(ConsumeAfterOpt && NumPositionalRequired <= PositionalVals.size()); 367331de23705a719514e37c211f327379688f81b0dChris Lattner unsigned ValNo = 0; 368331de23705a719514e37c211f327379688f81b0dChris Lattner for (unsigned j = 1, e = PositionalOpts.size(); j != e; ++j) 369331de23705a719514e37c211f327379688f81b0dChris Lattner if (RequiresValue(PositionalOpts[j])) 370faba809472e36fbb28394da6ed907d2652ca8b83Chris Lattner ErrorParsing |= ProvidePositionalOption(PositionalOpts[j], 371faba809472e36fbb28394da6ed907d2652ca8b83Chris Lattner PositionalVals[ValNo++]); 372faba809472e36fbb28394da6ed907d2652ca8b83Chris Lattner 373faba809472e36fbb28394da6ed907d2652ca8b83Chris Lattner // Handle the case where there is just one positional option, and it's 374faba809472e36fbb28394da6ed907d2652ca8b83Chris Lattner // optional. In this case, we want to give JUST THE FIRST option to the 375faba809472e36fbb28394da6ed907d2652ca8b83Chris Lattner // positional option and keep the rest for the consume after. The above 376faba809472e36fbb28394da6ed907d2652ca8b83Chris Lattner // loop would have assigned no values to positional options in this case. 377faba809472e36fbb28394da6ed907d2652ca8b83Chris Lattner // 378faba809472e36fbb28394da6ed907d2652ca8b83Chris Lattner if (PositionalOpts.size() == 2 && ValNo == 0) 379faba809472e36fbb28394da6ed907d2652ca8b83Chris Lattner ErrorParsing |= ProvidePositionalOption(PositionalOpts[1], 380faba809472e36fbb28394da6ed907d2652ca8b83Chris Lattner PositionalVals[ValNo++]); 381331de23705a719514e37c211f327379688f81b0dChris Lattner 382331de23705a719514e37c211f327379688f81b0dChris Lattner // Handle over all of the rest of the arguments to the 383331de23705a719514e37c211f327379688f81b0dChris Lattner // cl::ConsumeAfter command line option... 384331de23705a719514e37c211f327379688f81b0dChris Lattner for (; ValNo != PositionalVals.size(); ++ValNo) 385331de23705a719514e37c211f327379688f81b0dChris Lattner ErrorParsing |= ProvidePositionalOption(ConsumeAfterOpt, 386331de23705a719514e37c211f327379688f81b0dChris Lattner PositionalVals[ValNo]); 387dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner } 388dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 389dc4693dbcf164ec404a3a91c67cf1dbe5f45a8e5Chris Lattner // Loop over args and make sure all required args are specified! 390331de23705a719514e37c211f327379688f81b0dChris Lattner for (map<string, Option*>::iterator I = Opts.begin(), 391331de23705a719514e37c211f327379688f81b0dChris Lattner E = Opts.end(); I != E; ++I) { 392dc4693dbcf164ec404a3a91c67cf1dbe5f45a8e5Chris Lattner switch (I->second->getNumOccurancesFlag()) { 393dc4693dbcf164ec404a3a91c67cf1dbe5f45a8e5Chris Lattner case Required: 394dc4693dbcf164ec404a3a91c67cf1dbe5f45a8e5Chris Lattner case OneOrMore: 395f038acbee21cfed998451aedd00a81901d299516Chris Lattner if (I->second->getNumOccurances() == 0) { 396dc4693dbcf164ec404a3a91c67cf1dbe5f45a8e5Chris Lattner I->second->error(" must be specified at least once!"); 397f038acbee21cfed998451aedd00a81901d299516Chris Lattner ErrorParsing = true; 398f038acbee21cfed998451aedd00a81901d299516Chris Lattner } 399dc4693dbcf164ec404a3a91c67cf1dbe5f45a8e5Chris Lattner // Fall through 400dc4693dbcf164ec404a3a91c67cf1dbe5f45a8e5Chris Lattner default: 401dc4693dbcf164ec404a3a91c67cf1dbe5f45a8e5Chris Lattner break; 402dc4693dbcf164ec404a3a91c67cf1dbe5f45a8e5Chris Lattner } 403dc4693dbcf164ec404a3a91c67cf1dbe5f45a8e5Chris Lattner } 404dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 405331de23705a719514e37c211f327379688f81b0dChris Lattner // Free all of the memory allocated to the map. Command line options may only 406331de23705a719514e37c211f327379688f81b0dChris Lattner // be processed once! 407e8e258b1a7e54a77c802e8b309d0a60a62d1a00dChris Lattner delete CommandLineOptions; 408e8e258b1a7e54a77c802e8b309d0a60a62d1a00dChris Lattner CommandLineOptions = 0; 409331de23705a719514e37c211f327379688f81b0dChris Lattner PositionalOpts.clear(); 410dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 411dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner // If we had an error processing our arguments, don't let the program execute 412dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner if (ErrorParsing) exit(1); 413dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner} 414dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 415dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner//===----------------------------------------------------------------------===// 416dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner// Option Base class implementation 417dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner// 418dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 4190c0edf8afc35a42b15a24ebb5fa5f3fc674290aeChris Lattnerbool Option::error(string Message, const char *ArgName) { 420dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner if (ArgName == 0) ArgName = ArgStr; 421331de23705a719514e37c211f327379688f81b0dChris Lattner if (ArgName[0] == 0) 422331de23705a719514e37c211f327379688f81b0dChris Lattner cerr << HelpStr; // Be nice for positional arguments 423331de23705a719514e37c211f327379688f81b0dChris Lattner else 424331de23705a719514e37c211f327379688f81b0dChris Lattner cerr << "-" << ArgName; 425331de23705a719514e37c211f327379688f81b0dChris Lattner cerr << " option" << Message << "\n"; 426dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner return true; 427dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner} 428dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 429dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattnerbool Option::addOccurance(const char *ArgName, const string &Value) { 430dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner NumOccurances++; // Increment the number of times we have been seen 431dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 432dc4693dbcf164ec404a3a91c67cf1dbe5f45a8e5Chris Lattner switch (getNumOccurancesFlag()) { 433dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner case Optional: 434dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner if (NumOccurances > 1) 435dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner return error(": may only occur zero or one times!", ArgName); 436dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner break; 437dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner case Required: 438dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner if (NumOccurances > 1) 439dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner return error(": must occur exactly one time!", ArgName); 440dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner // Fall through 441dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner case OneOrMore: 442caccd761a6320d9068a44198b9e1b6c3659f8bb5Chris Lattner case ZeroOrMore: 443caccd761a6320d9068a44198b9e1b6c3659f8bb5Chris Lattner case ConsumeAfter: break; 444dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner default: return error(": bad num occurances flag value!"); 445dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner } 446dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 447dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner return handleOccurance(ArgName, Value); 448dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner} 449dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 450331de23705a719514e37c211f327379688f81b0dChris Lattner// addArgument - Tell the system that this Option subclass will handle all 451331de23705a719514e37c211f327379688f81b0dChris Lattner// occurances of -ArgStr on the command line. 452331de23705a719514e37c211f327379688f81b0dChris Lattner// 453331de23705a719514e37c211f327379688f81b0dChris Lattnervoid Option::addArgument(const char *ArgStr) { 454331de23705a719514e37c211f327379688f81b0dChris Lattner if (ArgStr[0]) 455331de23705a719514e37c211f327379688f81b0dChris Lattner AddArgument(ArgStr, this); 456331de23705a719514e37c211f327379688f81b0dChris Lattner else if (getFormattingFlag() == Positional) 457331de23705a719514e37c211f327379688f81b0dChris Lattner getPositionalOpts().push_back(this); 458331de23705a719514e37c211f327379688f81b0dChris Lattner else if (getNumOccurancesFlag() == ConsumeAfter) { 459331de23705a719514e37c211f327379688f81b0dChris Lattner assert((getPositionalOpts().empty() || 460331de23705a719514e37c211f327379688f81b0dChris Lattner getPositionalOpts().front()->getNumOccurancesFlag() != ConsumeAfter) 461331de23705a719514e37c211f327379688f81b0dChris Lattner && "Cannot specify more than one option with cl::ConsumeAfter " 462331de23705a719514e37c211f327379688f81b0dChris Lattner "specified!"); 463331de23705a719514e37c211f327379688f81b0dChris Lattner getPositionalOpts().insert(getPositionalOpts().begin(), this); 464331de23705a719514e37c211f327379688f81b0dChris Lattner } 465331de23705a719514e37c211f327379688f81b0dChris Lattner} 466331de23705a719514e37c211f327379688f81b0dChris Lattner 467aa852bbb503571d1198856fa4c6e099d7625e3b3Chris Lattnervoid Option::removeArgument(const char *ArgStr) { 468aa852bbb503571d1198856fa4c6e099d7625e3b3Chris Lattner if (ArgStr[0]) { 469e8e258b1a7e54a77c802e8b309d0a60a62d1a00dChris Lattner RemoveArgument(ArgStr, this); 470aa852bbb503571d1198856fa4c6e099d7625e3b3Chris Lattner } else if (getFormattingFlag() == Positional) { 471aa852bbb503571d1198856fa4c6e099d7625e3b3Chris Lattner vector<Option*>::iterator I = 472aa852bbb503571d1198856fa4c6e099d7625e3b3Chris Lattner std::find(getPositionalOpts().begin(), getPositionalOpts().end(), this); 473aa852bbb503571d1198856fa4c6e099d7625e3b3Chris Lattner assert(I != getPositionalOpts().end() && "Arg not registered!"); 474aa852bbb503571d1198856fa4c6e099d7625e3b3Chris Lattner getPositionalOpts().erase(I); 475aa852bbb503571d1198856fa4c6e099d7625e3b3Chris Lattner } else if (getNumOccurancesFlag() == ConsumeAfter) { 476aa852bbb503571d1198856fa4c6e099d7625e3b3Chris Lattner assert(!getPositionalOpts().empty() && getPositionalOpts()[0] == this && 477aa852bbb503571d1198856fa4c6e099d7625e3b3Chris Lattner "Arg not registered correctly!"); 478aa852bbb503571d1198856fa4c6e099d7625e3b3Chris Lattner getPositionalOpts().erase(getPositionalOpts().begin()); 479aa852bbb503571d1198856fa4c6e099d7625e3b3Chris Lattner } 480aa852bbb503571d1198856fa4c6e099d7625e3b3Chris Lattner} 481aa852bbb503571d1198856fa4c6e099d7625e3b3Chris Lattner 482331de23705a719514e37c211f327379688f81b0dChris Lattner 483331de23705a719514e37c211f327379688f81b0dChris Lattner// getValueStr - Get the value description string, using "DefaultMsg" if nothing 484331de23705a719514e37c211f327379688f81b0dChris Lattner// has been specified yet. 485331de23705a719514e37c211f327379688f81b0dChris Lattner// 486331de23705a719514e37c211f327379688f81b0dChris Lattnerstatic const char *getValueStr(const Option &O, const char *DefaultMsg) { 487331de23705a719514e37c211f327379688f81b0dChris Lattner if (O.ValueStr[0] == 0) return DefaultMsg; 488331de23705a719514e37c211f327379688f81b0dChris Lattner return O.ValueStr; 489331de23705a719514e37c211f327379688f81b0dChris Lattner} 490331de23705a719514e37c211f327379688f81b0dChris Lattner 491331de23705a719514e37c211f327379688f81b0dChris Lattner//===----------------------------------------------------------------------===// 492331de23705a719514e37c211f327379688f81b0dChris Lattner// cl::alias class implementation 493331de23705a719514e37c211f327379688f81b0dChris Lattner// 494331de23705a719514e37c211f327379688f81b0dChris Lattner 495dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner// Return the width of the option tag for printing... 496331de23705a719514e37c211f327379688f81b0dChris Lattnerunsigned alias::getOptionWidth() const { 497dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner return std::strlen(ArgStr)+6; 498dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner} 499dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 500331de23705a719514e37c211f327379688f81b0dChris Lattner// Print out the option for the alias... 501331de23705a719514e37c211f327379688f81b0dChris Lattnervoid alias::printOptionInfo(unsigned GlobalWidth) const { 502dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner unsigned L = std::strlen(ArgStr); 503dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner cerr << " -" << ArgStr << string(GlobalWidth-L-6, ' ') << " - " 504697954c15da58bd8b186dbafdedd8b06db770201Chris Lattner << HelpStr << "\n"; 505dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner} 506dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 507dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 508331de23705a719514e37c211f327379688f81b0dChris Lattner 509dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner//===----------------------------------------------------------------------===// 510331de23705a719514e37c211f327379688f81b0dChris Lattner// Parser Implementation code... 511dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner// 512dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 513331de23705a719514e37c211f327379688f81b0dChris Lattner// parser<bool> implementation 514331de23705a719514e37c211f327379688f81b0dChris Lattner// 515331de23705a719514e37c211f327379688f81b0dChris Lattnerbool parser<bool>::parseImpl(Option &O, const string &Arg, bool &Value) { 516dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner if (Arg == "" || Arg == "true" || Arg == "TRUE" || Arg == "True" || 517dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner Arg == "1") { 518dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner Value = true; 519dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner } else if (Arg == "false" || Arg == "FALSE" || Arg == "False" || Arg == "0") { 520dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner Value = false; 521dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner } else { 522331de23705a719514e37c211f327379688f81b0dChris Lattner return O.error(": '" + Arg + 523331de23705a719514e37c211f327379688f81b0dChris Lattner "' is invalid value for boolean argument! Try 0 or 1"); 524dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner } 525dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner return false; 526dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner} 527dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 528331de23705a719514e37c211f327379688f81b0dChris Lattner// Return the width of the option tag for printing... 529331de23705a719514e37c211f327379688f81b0dChris Lattnerunsigned parser<bool>::getOptionWidth(const Option &O) const { 530331de23705a719514e37c211f327379688f81b0dChris Lattner return std::strlen(O.ArgStr)+6; 531dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner} 532dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 533331de23705a719514e37c211f327379688f81b0dChris Lattner// printOptionInfo - Print out information about this option. The 534331de23705a719514e37c211f327379688f81b0dChris Lattner// to-be-maintained width is specified. 535dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner// 536331de23705a719514e37c211f327379688f81b0dChris Lattnervoid parser<bool>::printOptionInfo(const Option &O, unsigned GlobalWidth) const{ 537331de23705a719514e37c211f327379688f81b0dChris Lattner unsigned L = std::strlen(O.ArgStr); 538331de23705a719514e37c211f327379688f81b0dChris Lattner cerr << " -" << O.ArgStr << string(GlobalWidth-L-6, ' ') << " - " 539331de23705a719514e37c211f327379688f81b0dChris Lattner << O.HelpStr << "\n"; 540dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner} 541dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 542d215fd1f5610033fbe704c975805790530262d26Chris Lattner 543331de23705a719514e37c211f327379688f81b0dChris Lattner 544331de23705a719514e37c211f327379688f81b0dChris Lattner// parser<int> implementation 545dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner// 546331de23705a719514e37c211f327379688f81b0dChris Lattnerbool parser<int>::parseImpl(Option &O, const string &Arg, int &Value) { 547331de23705a719514e37c211f327379688f81b0dChris Lattner const char *ArgStart = Arg.c_str(); 548331de23705a719514e37c211f327379688f81b0dChris Lattner char *End; 549331de23705a719514e37c211f327379688f81b0dChris Lattner Value = (int)strtol(ArgStart, &End, 0); 550331de23705a719514e37c211f327379688f81b0dChris Lattner if (*End != 0) 551331de23705a719514e37c211f327379688f81b0dChris Lattner return O.error(": '" + Arg + "' value invalid for integer argument!"); 552331de23705a719514e37c211f327379688f81b0dChris Lattner return false; 553dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner} 554dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 555331de23705a719514e37c211f327379688f81b0dChris Lattner// Return the width of the option tag for printing... 556331de23705a719514e37c211f327379688f81b0dChris Lattnerunsigned parser<int>::getOptionWidth(const Option &O) const { 557331de23705a719514e37c211f327379688f81b0dChris Lattner return std::strlen(O.ArgStr)+std::strlen(getValueStr(O, "int"))+9; 558dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner} 559dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 560331de23705a719514e37c211f327379688f81b0dChris Lattner// printOptionInfo - Print out information about this option. The 561331de23705a719514e37c211f327379688f81b0dChris Lattner// to-be-maintained width is specified. 562331de23705a719514e37c211f327379688f81b0dChris Lattner// 563331de23705a719514e37c211f327379688f81b0dChris Lattnervoid parser<int>::printOptionInfo(const Option &O, unsigned GlobalWidth) const{ 564331de23705a719514e37c211f327379688f81b0dChris Lattner cerr << " -" << O.ArgStr << "=<" << getValueStr(O, "int") << ">" 565331de23705a719514e37c211f327379688f81b0dChris Lattner << string(GlobalWidth-getOptionWidth(O), ' ') << " - " 566331de23705a719514e37c211f327379688f81b0dChris Lattner << O.HelpStr << "\n"; 567dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner} 568dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 569dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 570331de23705a719514e37c211f327379688f81b0dChris Lattner// parser<double> implementation 571331de23705a719514e37c211f327379688f81b0dChris Lattner// 572331de23705a719514e37c211f327379688f81b0dChris Lattnerbool parser<double>::parseImpl(Option &O, const string &Arg, double &Value) { 573331de23705a719514e37c211f327379688f81b0dChris Lattner const char *ArgStart = Arg.c_str(); 574331de23705a719514e37c211f327379688f81b0dChris Lattner char *End; 575331de23705a719514e37c211f327379688f81b0dChris Lattner Value = strtod(ArgStart, &End); 576331de23705a719514e37c211f327379688f81b0dChris Lattner if (*End != 0) 577331de23705a719514e37c211f327379688f81b0dChris Lattner return O.error(": '" +Arg+ "' value invalid for floating point argument!"); 578dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner return false; 579dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner} 580dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 581dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner// Return the width of the option tag for printing... 582331de23705a719514e37c211f327379688f81b0dChris Lattnerunsigned parser<double>::getOptionWidth(const Option &O) const { 583331de23705a719514e37c211f327379688f81b0dChris Lattner return std::strlen(O.ArgStr)+std::strlen(getValueStr(O, "number"))+9; 584dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner} 585dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 586dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner// printOptionInfo - Print out information about this option. The 587dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner// to-be-maintained width is specified. 588dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner// 589331de23705a719514e37c211f327379688f81b0dChris Lattnervoid parser<double>::printOptionInfo(const Option &O, 590331de23705a719514e37c211f327379688f81b0dChris Lattner unsigned GlobalWidth) const{ 591331de23705a719514e37c211f327379688f81b0dChris Lattner cerr << " -" << O.ArgStr << "=<" << getValueStr(O, "number") << ">" 592331de23705a719514e37c211f327379688f81b0dChris Lattner << string(GlobalWidth-getOptionWidth(O), ' ') 593331de23705a719514e37c211f327379688f81b0dChris Lattner << " - " << O.HelpStr << "\n"; 594dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner} 595dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 596dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 597331de23705a719514e37c211f327379688f81b0dChris Lattner// parser<string> implementation 598331de23705a719514e37c211f327379688f81b0dChris Lattner// 599dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 600331de23705a719514e37c211f327379688f81b0dChris Lattner// Return the width of the option tag for printing... 601331de23705a719514e37c211f327379688f81b0dChris Lattnerunsigned parser<string>::getOptionWidth(const Option &O) const { 602331de23705a719514e37c211f327379688f81b0dChris Lattner return std::strlen(O.ArgStr)+std::strlen(getValueStr(O, "string"))+9; 603dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner} 604dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 605331de23705a719514e37c211f327379688f81b0dChris Lattner// printOptionInfo - Print out information about this option. The 606331de23705a719514e37c211f327379688f81b0dChris Lattner// to-be-maintained width is specified. 607331de23705a719514e37c211f327379688f81b0dChris Lattner// 608331de23705a719514e37c211f327379688f81b0dChris Lattnervoid parser<string>::printOptionInfo(const Option &O, 609331de23705a719514e37c211f327379688f81b0dChris Lattner unsigned GlobalWidth) const{ 610331de23705a719514e37c211f327379688f81b0dChris Lattner cerr << " -" << O.ArgStr << " <" << getValueStr(O, "string") << ">" 611331de23705a719514e37c211f327379688f81b0dChris Lattner << string(GlobalWidth-getOptionWidth(O), ' ') 612331de23705a719514e37c211f327379688f81b0dChris Lattner << " - " << O.HelpStr << "\n"; 613dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner} 614dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 615331de23705a719514e37c211f327379688f81b0dChris Lattner// generic_parser_base implementation 616dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner// 617dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 618aa852bbb503571d1198856fa4c6e099d7625e3b3Chris Lattner// findOption - Return the option number corresponding to the specified 619aa852bbb503571d1198856fa4c6e099d7625e3b3Chris Lattner// argument string. If the option is not found, getNumOptions() is returned. 620aa852bbb503571d1198856fa4c6e099d7625e3b3Chris Lattner// 621aa852bbb503571d1198856fa4c6e099d7625e3b3Chris Lattnerunsigned generic_parser_base::findOption(const char *Name) { 622aa852bbb503571d1198856fa4c6e099d7625e3b3Chris Lattner unsigned i = 0, e = getNumOptions(); 623aa852bbb503571d1198856fa4c6e099d7625e3b3Chris Lattner string N(Name); 624aa852bbb503571d1198856fa4c6e099d7625e3b3Chris Lattner 625aa852bbb503571d1198856fa4c6e099d7625e3b3Chris Lattner while (i != e) 626aa852bbb503571d1198856fa4c6e099d7625e3b3Chris Lattner if (getOption(i) == N) 627aa852bbb503571d1198856fa4c6e099d7625e3b3Chris Lattner return i; 628aa852bbb503571d1198856fa4c6e099d7625e3b3Chris Lattner else 629aa852bbb503571d1198856fa4c6e099d7625e3b3Chris Lattner ++i; 630aa852bbb503571d1198856fa4c6e099d7625e3b3Chris Lattner return e; 631aa852bbb503571d1198856fa4c6e099d7625e3b3Chris Lattner} 632aa852bbb503571d1198856fa4c6e099d7625e3b3Chris Lattner 633aa852bbb503571d1198856fa4c6e099d7625e3b3Chris Lattner 634dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner// Return the width of the option tag for printing... 635331de23705a719514e37c211f327379688f81b0dChris Lattnerunsigned generic_parser_base::getOptionWidth(const Option &O) const { 636331de23705a719514e37c211f327379688f81b0dChris Lattner if (O.hasArgStr()) { 637331de23705a719514e37c211f327379688f81b0dChris Lattner unsigned Size = std::strlen(O.ArgStr)+6; 638331de23705a719514e37c211f327379688f81b0dChris Lattner for (unsigned i = 0, e = getNumOptions(); i != e; ++i) 639331de23705a719514e37c211f327379688f81b0dChris Lattner Size = std::max(Size, (unsigned)std::strlen(getOption(i))+8); 640331de23705a719514e37c211f327379688f81b0dChris Lattner return Size; 641331de23705a719514e37c211f327379688f81b0dChris Lattner } else { 642331de23705a719514e37c211f327379688f81b0dChris Lattner unsigned BaseSize = 0; 643331de23705a719514e37c211f327379688f81b0dChris Lattner for (unsigned i = 0, e = getNumOptions(); i != e; ++i) 644331de23705a719514e37c211f327379688f81b0dChris Lattner BaseSize = std::max(BaseSize, (unsigned)std::strlen(getOption(i))+8); 645331de23705a719514e37c211f327379688f81b0dChris Lattner return BaseSize; 646331de23705a719514e37c211f327379688f81b0dChris Lattner } 647dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner} 648dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 649dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner// printOptionInfo - Print out information about this option. The 650dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner// to-be-maintained width is specified. 651dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner// 652331de23705a719514e37c211f327379688f81b0dChris Lattnervoid generic_parser_base::printOptionInfo(const Option &O, 653331de23705a719514e37c211f327379688f81b0dChris Lattner unsigned GlobalWidth) const { 654331de23705a719514e37c211f327379688f81b0dChris Lattner if (O.hasArgStr()) { 655331de23705a719514e37c211f327379688f81b0dChris Lattner unsigned L = std::strlen(O.ArgStr); 656331de23705a719514e37c211f327379688f81b0dChris Lattner cerr << " -" << O.ArgStr << string(GlobalWidth-L-6, ' ') 657331de23705a719514e37c211f327379688f81b0dChris Lattner << " - " << O.HelpStr << "\n"; 658331de23705a719514e37c211f327379688f81b0dChris Lattner 659331de23705a719514e37c211f327379688f81b0dChris Lattner for (unsigned i = 0, e = getNumOptions(); i != e; ++i) { 660331de23705a719514e37c211f327379688f81b0dChris Lattner unsigned NumSpaces = GlobalWidth-strlen(getOption(i))-8; 661331de23705a719514e37c211f327379688f81b0dChris Lattner cerr << " =" << getOption(i) << string(NumSpaces, ' ') << " - " 662331de23705a719514e37c211f327379688f81b0dChris Lattner << getDescription(i) << "\n"; 663331de23705a719514e37c211f327379688f81b0dChris Lattner } 664331de23705a719514e37c211f327379688f81b0dChris Lattner } else { 665331de23705a719514e37c211f327379688f81b0dChris Lattner if (O.HelpStr[0]) 666331de23705a719514e37c211f327379688f81b0dChris Lattner cerr << " " << O.HelpStr << "\n"; 667331de23705a719514e37c211f327379688f81b0dChris Lattner for (unsigned i = 0, e = getNumOptions(); i != e; ++i) { 668331de23705a719514e37c211f327379688f81b0dChris Lattner unsigned L = std::strlen(getOption(i)); 669331de23705a719514e37c211f327379688f81b0dChris Lattner cerr << " -" << getOption(i) << string(GlobalWidth-L-8, ' ') << " - " 670331de23705a719514e37c211f327379688f81b0dChris Lattner << getDescription(i) << "\n"; 671331de23705a719514e37c211f327379688f81b0dChris Lattner } 672dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner } 673dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner} 674dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 675dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 676dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner//===----------------------------------------------------------------------===// 677331de23705a719514e37c211f327379688f81b0dChris Lattner// --help and --help-hidden option implementation 678dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner// 679dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattnernamespace { 680dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 681331de23705a719514e37c211f327379688f81b0dChris Lattnerclass HelpPrinter { 682dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner unsigned MaxArgLen; 683dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner const Option *EmptyArg; 684dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner const bool ShowHidden; 685dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 686331de23705a719514e37c211f327379688f81b0dChris Lattner // isHidden/isReallyHidden - Predicates to be used to filter down arg lists. 687331de23705a719514e37c211f327379688f81b0dChris Lattner inline static bool isHidden(pair<string, Option *> &OptPair) { 688331de23705a719514e37c211f327379688f81b0dChris Lattner return OptPair.second->getOptionHiddenFlag() >= Hidden; 689331de23705a719514e37c211f327379688f81b0dChris Lattner } 690331de23705a719514e37c211f327379688f81b0dChris Lattner inline static bool isReallyHidden(pair<string, Option *> &OptPair) { 691331de23705a719514e37c211f327379688f81b0dChris Lattner return OptPair.second->getOptionHiddenFlag() == ReallyHidden; 692331de23705a719514e37c211f327379688f81b0dChris Lattner } 693331de23705a719514e37c211f327379688f81b0dChris Lattner 694331de23705a719514e37c211f327379688f81b0dChris Lattnerpublic: 695331de23705a719514e37c211f327379688f81b0dChris Lattner HelpPrinter(bool showHidden) : ShowHidden(showHidden) { 696331de23705a719514e37c211f327379688f81b0dChris Lattner EmptyArg = 0; 697331de23705a719514e37c211f327379688f81b0dChris Lattner } 698331de23705a719514e37c211f327379688f81b0dChris Lattner 699331de23705a719514e37c211f327379688f81b0dChris Lattner void operator=(bool Value) { 700331de23705a719514e37c211f327379688f81b0dChris Lattner if (Value == false) return; 701331de23705a719514e37c211f327379688f81b0dChris Lattner 702dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner // Copy Options into a vector so we can sort them as we like... 703dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner vector<pair<string, Option*> > Options; 704697954c15da58bd8b186dbafdedd8b06db770201Chris Lattner copy(getOpts().begin(), getOpts().end(), std::back_inserter(Options)); 705dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 706dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner // Eliminate Hidden or ReallyHidden arguments, depending on ShowHidden 707331de23705a719514e37c211f327379688f81b0dChris Lattner Options.erase(std::remove_if(Options.begin(), Options.end(), 708331de23705a719514e37c211f327379688f81b0dChris Lattner std::ptr_fun(ShowHidden ? isReallyHidden : isHidden)), 709dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner Options.end()); 710dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 711dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner // Eliminate duplicate entries in table (from enum flags options, f.e.) 712331de23705a719514e37c211f327379688f81b0dChris Lattner { // Give OptionSet a scope 713331de23705a719514e37c211f327379688f81b0dChris Lattner std::set<Option*> OptionSet; 714331de23705a719514e37c211f327379688f81b0dChris Lattner for (unsigned i = 0; i != Options.size(); ++i) 715331de23705a719514e37c211f327379688f81b0dChris Lattner if (OptionSet.count(Options[i].second) == 0) 716331de23705a719514e37c211f327379688f81b0dChris Lattner OptionSet.insert(Options[i].second); // Add new entry to set 717331de23705a719514e37c211f327379688f81b0dChris Lattner else 718331de23705a719514e37c211f327379688f81b0dChris Lattner Options.erase(Options.begin()+i--); // Erase duplicate 719331de23705a719514e37c211f327379688f81b0dChris Lattner } 720dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 721dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner if (ProgramOverview) 722697954c15da58bd8b186dbafdedd8b06db770201Chris Lattner cerr << "OVERVIEW:" << ProgramOverview << "\n"; 723dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 724331de23705a719514e37c211f327379688f81b0dChris Lattner cerr << "USAGE: " << ProgramName << " [options]"; 725331de23705a719514e37c211f327379688f81b0dChris Lattner 726331de23705a719514e37c211f327379688f81b0dChris Lattner // Print out the positional options... 727331de23705a719514e37c211f327379688f81b0dChris Lattner vector<Option*> &PosOpts = getPositionalOpts(); 728331de23705a719514e37c211f327379688f81b0dChris Lattner Option *CAOpt = 0; // The cl::ConsumeAfter option, if it exists... 729331de23705a719514e37c211f327379688f81b0dChris Lattner if (!PosOpts.empty() && PosOpts[0]->getNumOccurancesFlag() == ConsumeAfter) 730331de23705a719514e37c211f327379688f81b0dChris Lattner CAOpt = PosOpts[0]; 731331de23705a719514e37c211f327379688f81b0dChris Lattner 732331de23705a719514e37c211f327379688f81b0dChris Lattner for (unsigned i = CAOpt != 0, e = PosOpts.size(); i != e; ++i) { 733331de23705a719514e37c211f327379688f81b0dChris Lattner cerr << " " << PosOpts[i]->HelpStr; 734331de23705a719514e37c211f327379688f81b0dChris Lattner switch (PosOpts[i]->getNumOccurancesFlag()) { 735331de23705a719514e37c211f327379688f81b0dChris Lattner case Optional: cerr << "?"; break; 736331de23705a719514e37c211f327379688f81b0dChris Lattner case ZeroOrMore: cerr << "*"; break; 737331de23705a719514e37c211f327379688f81b0dChris Lattner case Required: break; 738331de23705a719514e37c211f327379688f81b0dChris Lattner case OneOrMore: cerr << "+"; break; 739331de23705a719514e37c211f327379688f81b0dChris Lattner case ConsumeAfter: 740331de23705a719514e37c211f327379688f81b0dChris Lattner default: 741331de23705a719514e37c211f327379688f81b0dChris Lattner assert(0 && "Unknown NumOccurances Flag Value!"); 742331de23705a719514e37c211f327379688f81b0dChris Lattner } 743331de23705a719514e37c211f327379688f81b0dChris Lattner } 744331de23705a719514e37c211f327379688f81b0dChris Lattner 745331de23705a719514e37c211f327379688f81b0dChris Lattner // Print the consume after option info if it exists... 746331de23705a719514e37c211f327379688f81b0dChris Lattner if (CAOpt) cerr << " " << CAOpt->HelpStr; 747331de23705a719514e37c211f327379688f81b0dChris Lattner 748331de23705a719514e37c211f327379688f81b0dChris Lattner cerr << "\n\n"; 749dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 750dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner // Compute the maximum argument length... 751dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner MaxArgLen = 0; 752331de23705a719514e37c211f327379688f81b0dChris Lattner for (unsigned i = 0, e = Options.size(); i != e; ++i) 753331de23705a719514e37c211f327379688f81b0dChris Lattner MaxArgLen = std::max(MaxArgLen, Options[i].second->getOptionWidth()); 754dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 755dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner cerr << "OPTIONS:\n"; 756331de23705a719514e37c211f327379688f81b0dChris Lattner for (unsigned i = 0, e = Options.size(); i != e; ++i) 757331de23705a719514e37c211f327379688f81b0dChris Lattner Options[i].second->printOptionInfo(MaxArgLen); 758dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 759331de23705a719514e37c211f327379688f81b0dChris Lattner // Halt the program if help information is printed 760331de23705a719514e37c211f327379688f81b0dChris Lattner exit(1); 761dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner } 762331de23705a719514e37c211f327379688f81b0dChris Lattner}; 763dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 764dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 765dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 766331de23705a719514e37c211f327379688f81b0dChris Lattner// Define the two HelpPrinter instances that are used to print out help, or 767331de23705a719514e37c211f327379688f81b0dChris Lattner// help-hidden... 768331de23705a719514e37c211f327379688f81b0dChris Lattner// 769331de23705a719514e37c211f327379688f81b0dChris LattnerHelpPrinter NormalPrinter(false); 770331de23705a719514e37c211f327379688f81b0dChris LattnerHelpPrinter HiddenPrinter(true); 771331de23705a719514e37c211f327379688f81b0dChris Lattner 772331de23705a719514e37c211f327379688f81b0dChris Lattnercl::opt<HelpPrinter, true, parser<bool> > 773331de23705a719514e37c211f327379688f81b0dChris LattnerHOp("help", cl::desc("display available options (--help-hidden for more)"), 774331de23705a719514e37c211f327379688f81b0dChris Lattner cl::location(NormalPrinter)); 775dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 776331de23705a719514e37c211f327379688f81b0dChris Lattnercl::opt<HelpPrinter, true, parser<bool> > 777331de23705a719514e37c211f327379688f81b0dChris LattnerHHOp("help-hidden", cl::desc("display all available options"), 778331de23705a719514e37c211f327379688f81b0dChris Lattner cl::location(HiddenPrinter), cl::Hidden); 779dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner 780dbab15a2c9accc0242109881e1632137cb97dbc9Chris Lattner} // End anonymous namespace 781