1 //===- Support/CommandLine.h - Flexible Command line parser ------*- C++ -*--=//
3 // This class implements a command line argument processor that is useful when
4 // creating a tool. It provides a simple, minimalistic interface that is easily
5 // extensible and supports nonlocal (library) command line options.
7 // Note that rather than trying to figure out what this code does, you could try
8 // reading the library documentation located in docs/CommandLine.html
10 //===----------------------------------------------------------------------===//
12 #ifndef LLVM_SUPPORT_COMMANDLINE_H
13 #define LLVM_SUPPORT_COMMANDLINE_H
20 namespace cl { // Short namespace to make usage concise
22 //===----------------------------------------------------------------------===//
23 // ParseCommandLineOptions - Minimalistic command line option processing entry
25 void cl::ParseCommandLineOptions(int &argc, char **argv,
26 const char *Overview = 0,
29 // ParserOptions - This set of option is use to control global behavior of the
30 // command line processor.
33 // DisableSingleLetterArgGrouping - With this option enabled, multiple letter
34 // options are allowed to bunch together with only a single hyphen for the
35 // whole group. This allows emulation of the behavior that ls uses for
36 // example: ls -la === ls -l -a Providing this option, disables this.
38 DisableSingleLetterArgGrouping = 0x0001,
40 // EnableSingleLetterArgValue - This option allows arguments that are
41 // otherwise unrecognized to match single letter flags that take a value.
42 // This is useful for cases like a linker, where options are typically of the
43 // form '-lfoo' or '-L../../include' where -l or -L are the actual flags.
45 EnableSingleLetterArgValue = 0x0002,
49 //===----------------------------------------------------------------------===//
50 // Global flags permitted to be passed to command line arguments
53 NoFlags = 0x00, // Marker to make explicit that we have no flags
54 Default = 0x00, // Equally, marker to use the default flags
59 enum NumOccurances { // Flags for the number of occurances allowed...
60 Optional = 0x01, // Zero or One occurance
61 ZeroOrMore = 0x02, // Zero or more occurances allowed
62 Required = 0x03, // One occurance required
63 OneOrMore = 0x04, // One or more occurances required
65 // ConsumeAfter - Marker for a null ("") flag that can be used to indicate
66 // that anything that matches the null marker starts a sequence of options
67 // that all get sent to the null marker. Thus, for example, all arguments
68 // to LLI are processed until a filename is found. Once a filename is found,
69 // all of the succeeding arguments are passed, unprocessed, to the null flag.
73 OccurancesMask = 0x07,
76 enum ValueExpected { // Is a value required for the option?
77 ValueOptional = 0x08, // The value can oppear... or not
78 ValueRequired = 0x10, // The value is required to appear!
79 ValueDisallowed = 0x18, // A value may not be specified (for flags)
83 enum OptionHidden { // Control whether -help shows this option
84 NotHidden = 0x20, // Option included in --help & --help-hidden
85 Hidden = 0x40, // -help doesn't, but --help-hidden does
86 ReallyHidden = 0x60, // Neither --help nor --help-hidden show this arg
91 //===----------------------------------------------------------------------===//
96 friend void cl::ParseCommandLineOptions(int &, char **, const char *, int);
99 // handleOccurances - Overriden by subclasses to handle the value passed into
100 // an argument. Should return true if there was an error processing the
101 // argument and the program should exit.
103 virtual bool handleOccurance(const char *ArgName, const std::string &Arg) = 0;
105 virtual enum NumOccurances getNumOccurancesFlagDefault() const {
108 virtual enum ValueExpected getValueExpectedFlagDefault() const {
109 return ValueOptional;
111 virtual enum OptionHidden getOptionHiddenFlagDefault() const {
115 int NumOccurances; // The number of times specified
116 const int Flags; // Flags for the argument
118 const char * const ArgStr; // The argument string itself (ex: "help", "o")
119 const char * const HelpStr; // The descriptive text message for --help
121 inline enum NumOccurances getNumOccurancesFlag() const {
122 int NO = Flags & OccurancesMask;
123 return NO ? (enum NumOccurances)NO : getNumOccurancesFlagDefault();
125 inline enum ValueExpected getValueExpectedFlag() const {
126 int VE = Flags & ValueMask;
127 return VE ? (enum ValueExpected)VE : getValueExpectedFlagDefault();
129 inline enum OptionHidden getOptionHiddenFlag() const {
130 int OH = Flags & HiddenMask;
131 return OH ? (enum OptionHidden)OH : getOptionHiddenFlagDefault();
135 Option(const char *ArgStr, const char *Message, int Flags);
136 Option(int flags) : NumOccurances(0), Flags(flags), ArgStr(""), HelpStr("") {}
139 // Return the width of the option tag for printing...
140 virtual unsigned getOptionWidth() const;
142 // printOptionInfo - Print out information about this option. The
143 // to-be-maintained width is specified.
145 virtual void printOptionInfo(unsigned GlobalWidth) const;
147 // addOccurance - Wrapper around handleOccurance that enforces Flags
149 bool addOccurance(const char *ArgName, const std::string &Value);
151 // Prints option name followed by message. Always returns true.
152 bool error(std::string Message, const char *ArgName = 0);
155 inline int getNumOccurances() const { return NumOccurances; }
160 //===----------------------------------------------------------------------===//
161 // Aliased command line option (alias this name to a preexisting name)
163 class Alias : public Option {
165 virtual bool handleOccurance(const char *ArgName, const std::string &Arg) {
166 return AliasFor.handleOccurance(AliasFor.ArgStr, Arg);
168 virtual enum OptionHidden getOptionHiddenFlagDefault() const {return Hidden;}
170 inline Alias(const char *ArgStr, const char *Message, int Flags,
171 Option &aliasFor) : Option(ArgStr, Message, Flags),
172 AliasFor(aliasFor) {}
175 //===----------------------------------------------------------------------===//
176 // Boolean/flag command line option
178 class Flag : public Option {
181 virtual bool handleOccurance(const char *ArgName, const std::string &Arg);
183 inline Flag(const char *ArgStr, const char *Message, int Flags = 0,
184 bool DefaultVal = false)
185 : Option(ArgStr, Message, Flags), Value(DValue) {
189 inline Flag(bool &UpdateVal, const char *ArgStr, const char *Message,
190 int Flags = 0, bool DefaultVal = false)
191 : Option(ArgStr, Message, Flags), Value(UpdateVal) {
195 operator const bool() const { return Value; }
196 inline bool operator=(bool Val) { Value = Val; return Val; }
201 //===----------------------------------------------------------------------===//
202 // Integer valued command line option
204 class Int : public Option {
206 virtual bool handleOccurance(const char *ArgName, const std::string &Arg);
207 virtual enum ValueExpected getValueExpectedFlagDefault() const {
208 return ValueRequired;
211 inline Int(const char *ArgStr, const char *Help, int Flags = 0,
212 int DefaultVal = 0) : Option(ArgStr, Help, Flags),
214 inline operator int() const { return Value; }
215 inline int operator=(int Val) { Value = Val; return Val; }
219 //===----------------------------------------------------------------------===//
220 // String valued command line option
222 class String : public Option, public std::string {
223 virtual bool handleOccurance(const char *ArgName, const std::string &Arg);
224 virtual enum ValueExpected getValueExpectedFlagDefault() const {
225 return ValueRequired;
228 inline String(const char *ArgStr, const char *Help, int Flags = 0,
229 const char *DefaultVal = "")
230 : Option(ArgStr, Help, Flags), std::string(DefaultVal) {}
232 inline const std::string &operator=(const std::string &Val) {
233 return std::string::operator=(Val);
238 //===----------------------------------------------------------------------===//
239 // String list command line option
241 class StringList : public Option, public std::vector<std::string> {
243 virtual enum NumOccurances getNumOccurancesFlagDefault() const {
246 virtual enum ValueExpected getValueExpectedFlagDefault() const {
247 return ValueRequired;
249 virtual bool handleOccurance(const char *ArgName, const std::string &Arg);
252 inline StringList(const char *ArgStr, const char *Help, int Flags = 0)
253 : Option(ArgStr, Help, Flags) {}
257 //===----------------------------------------------------------------------===//
258 // Enum valued command line option
260 #define clEnumVal(ENUMVAL, DESC) #ENUMVAL, ENUMVAL, DESC
261 #define clEnumValN(ENUMVAL, FLAGNAME, DESC) FLAGNAME, ENUMVAL, DESC
263 // EnumBase - Base class for all enum/varargs related argument types...
264 class EnumBase : public Option {
266 // Use a vector instead of a map, because the lists should be short,
267 // the overhead is less, and most importantly, it keeps them in the order
268 // inserted so we can print our option out nicely.
269 std::vector<std::pair<const char *, std::pair<int, const char *> > > ValueMap;
271 inline EnumBase(const char *ArgStr, const char *Help, int Flags)
272 : Option(ArgStr, Help, Flags) {}
273 inline EnumBase(int Flags) : Option(Flags) {}
275 // processValues - Incorporate the specifed varargs arglist into the
278 void processValues(va_list Vals);
280 // registerArgs - notify the system about these new arguments
284 // Turn an enum into the arg name that activates it
285 const char *getArgName(int ID) const;
286 const char *getArgDescription(int ID) const;
289 class EnumValueBase : public EnumBase {
291 inline EnumValueBase(const char *ArgStr, const char *Help, int Flags)
292 : EnumBase(ArgStr, Help, Flags) {}
293 inline EnumValueBase(int Flags) : EnumBase(Flags) {}
295 // handleOccurance - Set Value to the enum value specified by Arg
296 virtual bool handleOccurance(const char *ArgName, const std::string &Arg);
298 // Return the width of the option tag for printing...
299 virtual unsigned getOptionWidth() const;
301 // printOptionInfo - Print out information about this option. The
302 // to-be-maintained width is specified.
304 virtual void printOptionInfo(unsigned GlobalWidth) const;
306 // setValue - Subclasses override this when they need to receive a new value
307 virtual void setValue(int Val) = 0;
310 template <class E> // The enum we are representing
311 class Enum : public EnumValueBase {
312 virtual enum ValueExpected getValueExpectedFlagDefault() const {
313 return ValueRequired;
318 // setValue - Subclasses override this when they need to receive a new value
319 virtual void setValue(int Val) { Value = (E)Val; }
321 inline Enum(const char *ArgStr, int Flags, const char *Help, ...)
322 : EnumValueBase(ArgStr, Help, Flags), Value(DVal) {
324 va_start(Values, Help);
325 processValues(Values);
327 Value = (E)ValueMap.front().second.first; // Grab default value
330 inline Enum(E &EUpdate, const char *ArgStr, int Flags, const char *Help, ...)
331 : EnumValueBase(ArgStr, Help, Flags), Value(EUpdate) {
333 va_start(Values, Help);
334 processValues(Values);
336 Value = (E)ValueMap.front().second.first; // Grab default value
339 inline operator E() const { return Value; }
340 inline E operator=(E Val) { Value = Val; return Val; }
344 //===----------------------------------------------------------------------===//
345 // Enum flags command line option
347 class EnumFlagsBase : public EnumValueBase {
348 virtual enum ValueExpected getValueExpectedFlagDefault() const {
349 return ValueDisallowed;
352 virtual bool handleOccurance(const char *ArgName, const std::string &Arg);
353 inline EnumFlagsBase(int Flags) : EnumValueBase(Flags) {}
355 // Return the width of the option tag for printing...
356 virtual unsigned getOptionWidth() const;
358 // printOptionInfo - Print out information about this option. The
359 // to-be-maintained width is specified.
361 virtual void printOptionInfo(unsigned GlobalWidth) const;
364 template <class E> // The enum we are representing
365 class EnumFlags : public EnumFlagsBase {
369 // setValue - Subclasses override this when they need to receive a new value
370 virtual void setValue(int Val) { Value = (E)Val; }
372 inline EnumFlags(int Flags, ...) : EnumFlagsBase(Flags), Value(DVal) {
374 va_start(Values, Flags);
375 processValues(Values);
378 Value = (E)ValueMap.front().second.first; // Grab default value
380 inline EnumFlags(E &RV, int Flags, ...) : EnumFlagsBase(Flags), Value(RV) {
382 va_start(Values, Flags);
383 processValues(Values);
386 Value = (E)ValueMap.front().second.first; // Grab default value
389 inline operator E() const { return (E)Value; }
390 inline E operator=(E Val) { Value = Val; return Val; }
394 //===----------------------------------------------------------------------===//
395 // Enum list command line option
397 class EnumListBase : public EnumBase {
398 virtual enum NumOccurances getNumOccurancesFlagDefault() const {
401 virtual enum ValueExpected getValueExpectedFlagDefault() const {
402 return ValueDisallowed;
405 std::vector<int> Values; // The options specified so far.
407 inline EnumListBase(int Flags)
409 virtual bool handleOccurance(const char *ArgName, const std::string &Arg);
411 // Return the width of the option tag for printing...
412 virtual unsigned getOptionWidth() const;
414 // printOptionInfo - Print out information about this option. The
415 // to-be-maintained width is specified.
417 virtual void printOptionInfo(unsigned GlobalWidth) const;
419 inline unsigned size() { return Values.size(); }
422 template <class E> // The enum we are representing
423 class EnumList : public EnumListBase {
425 inline EnumList(int Flags, ...) : EnumListBase(Flags) {
427 va_start(Values, Flags);
428 processValues(Values);
432 inline E operator[](unsigned i) const { return (E)Values[i]; }
433 inline E &operator[](unsigned i) { return (E&)Values[i]; }
436 } // End namespace cl