2 //***************************************************************************
8 // General options processing for any program.
11 // 08/08/95 - adve - created in the dHPF compiler
12 // 10/10/96 - mpal, dbaker - converted to const member functions.
13 // 11/26/96 - adve - fixed to handle options that consume 0+ arguments
14 // 07/15/01 - vadve - Copied to LLVM system and modified
16 //**************************************************************************/
18 //************************** System Include Files **************************/
27 #define MAXINT ((1 << sizeof(int)-1) - 1)
30 //*************************** User Include Files ***************************/
32 #include "llvm/Support/ProgramOptions.h"
33 #include "llvm/Support/ProgramOption.h"
34 #include "llvm/Support/StringUtils.h"
37 //************************** Method Definitions ****************************/
39 ProgramOptions::ProgramOptions(int _argc,
50 ProgramOptions::StringOptionValue(const char* optString) const
52 const StringOption* handler = (const StringOption*) OptionHandler(optString);
53 return (handler == NULL) ? NULL : handler->Value();
57 ProgramOptions::FlagOptionValue(const char* optString) const
59 const FlagOption* handler = (const FlagOption*) OptionHandler(optString);
60 return (handler == NULL) ? false : handler->Value();
64 ProgramOptions::RealOptionValue(const char* optString) const
66 const RealValuedOption* handler =
67 (const RealValuedOption*) OptionHandler(optString);
68 return (handler == NULL) ? MAXFLOAT : handler->Value();
72 ProgramOptions::IntOptionValue(const char* optString) const
74 const IntegerValuedOption* handler =
75 (const IntegerValuedOption*) OptionHandler(optString);
76 return (handler == NULL) ? MAXINT : handler->Value();
80 ProgramOptions::OptionSpecified(const char* optString) const
82 const ProgramOption* handler = OptionHandler(optString);
83 return handler->OptionSpecified();
87 ProgramOptions::ProgramName() const
93 ProgramOptions::NumberOfOtherOptions() const
95 return argc - argsConsumed;
99 ProgramOptions::OtherOption(int i) const
102 assert(i >= 0 && i < argc);
107 ProgramOptions::GetOriginalArgs() const
113 ProgramOptions::GetDescription() const
115 vector<char*> optDesc;
117 if (optDesc.size() < (unsigned) argc)
119 for (StringMap<ProgramOption*>::const_iterator iter=optionRegistry.begin();
120 ! (iter == optionRegistry.end());
123 const ProgramOption* handler = (*iter).second;
124 optDesc.push_back(strdup(handler->ArgString())); // 1st
125 optDesc.push_back(strdup(handler->HelpMesg())); // 2nd
126 optDesc.push_back(handler->GetTextValue()); // 3rd
134 ProgramOptions::Register(ProgramOption* option)
136 optionRegistry[option->ArgString()] = option;
139 //----------------------------------------------------------------------
140 // function ProgramOptions::ParseArgs
142 // Parse command-line options until you run out of options or see
143 // an unrecognized option. `getopt' is a standard package to do this,
144 // but incredibly, it limited to single-letter options.
146 // -- Each option can consume zero or one additional arguments of argv
147 // -- "--" can be used to mark the end of options
148 // so that a program argument can also start with "-".
149 //---------------------------------------------------------------------/
152 ProgramOptions::ParseArgs(int argc,
159 // consume the program name
162 while (argsConsumed < argc)
164 const char* arg = argv[argsConsumed];
167 if (strcmp(arg, "--") == 0) { // "--" marks end of options
168 argsConsumed++; // consume and
169 break; // discontinue the for loop
171 ProgramOption* handler = OptionHandler(arg+1);
172 if (handler == NULL) {
173 cerr << "Unrecognized option: " << arg+1 << endl;
177 if (argc - argsConsumed < handler->MinExpectedArgs()) {
178 cerr << "Option " << (char*) arg+1 << " needs "
179 << handler->MinExpectedArgs() << " arguments" << endl;
183 argsConsumed++; // consumed the option
185 const char* nextArg = (argsConsumed < argc)? argv[argsConsumed]
187 int numAdditionalArgsConsumed = handler->EvalOpt(nextArg);
188 if (numAdditionalArgsConsumed < 0)
190 argsConsumed += numAdditionalArgsConsumed;
194 break; // quit the while loop
202 ProgramOptions::PrintArgs(ostream& stream) const
204 for (int i = 0; i < argc; i++) {
205 stream << argv[i] << " ";
212 ProgramOptions::PrintOptions(ostream& stream) const
214 stream << "OPTIONS:" << endl;
215 stream << "\tUse argument 0 to turn OFF a flag option: "
216 << "-<flag_opt> 0" << endl << endl;
218 for (StringMap<ProgramOption*>::const_iterator iter=optionRegistry.begin();
219 ! (iter == optionRegistry.end());
222 const ProgramOption* handler = (*iter).second;
224 stream << "\t-" << handler->ArgString();
226 const char* const showarg = " <arg>";
228 for (i=1; i <= handler->MinExpectedArgs(); i++)
231 int numCharsPrinted = 1 + strlen(handler->ArgString())
232 + strlen(showarg) * handler->MinExpectedArgs();
233 for (i=1; i > numCharsPrinted / 8; i--)
236 stream << "\t" << handler->HelpMesg()
242 ProgramOptions::Usage() const
249 //**************************************************************************/