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