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