mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-14 11:32:34 +00:00
Provide option to enable eating of all arguments following a specific one
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@986 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
e43db88b2d
commit
caccd761a6
@ -37,6 +37,35 @@ static void AddArgument(const string &ArgName, Option *Opt) {
|
|||||||
static const char *ProgramName = 0;
|
static const char *ProgramName = 0;
|
||||||
static const char *ProgramOverview = 0;
|
static const char *ProgramOverview = 0;
|
||||||
|
|
||||||
|
static inline bool ProvideOption(Option *Handler, const char *ArgName,
|
||||||
|
const char *Value, int argc, char **argv,
|
||||||
|
int &i) {
|
||||||
|
// Enforce value requirements
|
||||||
|
switch (Handler->getValueExpectedFlag()) {
|
||||||
|
case ValueRequired:
|
||||||
|
if (Value == 0 || *Value == 0) { // No value specified?
|
||||||
|
if (i+1 < argc) { // Steal the next argument, like for '-o filename'
|
||||||
|
Value = argv[++i];
|
||||||
|
} else {
|
||||||
|
return Handler->error(" requires a value!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case ValueDisallowed:
|
||||||
|
if (*Value != 0)
|
||||||
|
return Handler->error(" does not allow a value! '" +
|
||||||
|
string(Value) + "' specified.");
|
||||||
|
break;
|
||||||
|
case ValueOptional: break;
|
||||||
|
default: cerr << "Bad ValueMask flag! CommandLine usage error:"
|
||||||
|
<< Handler->getValueExpectedFlag() << endl; abort();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Run the handler now!
|
||||||
|
return Handler->addOccurance(ArgName, Value);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void cl::ParseCommandLineOptions(int &argc, char **argv,
|
void cl::ParseCommandLineOptions(int &argc, char **argv,
|
||||||
const char *Overview = 0) {
|
const char *Overview = 0) {
|
||||||
ProgramName = argv[0]; // Save this away safe and snug
|
ProgramName = argv[0]; // Save this away safe and snug
|
||||||
@ -59,6 +88,7 @@ void cl::ParseCommandLineOptions(int &argc, char **argv,
|
|||||||
const char *ArgNameEnd = ArgName;
|
const char *ArgNameEnd = ArgName;
|
||||||
while (*ArgNameEnd && *ArgNameEnd != '=' &&
|
while (*ArgNameEnd && *ArgNameEnd != '=' &&
|
||||||
*ArgNameEnd != '/') ++ArgNameEnd; // Scan till end
|
*ArgNameEnd != '/') ++ArgNameEnd; // Scan till end
|
||||||
|
// TODO: Remove '/' case. Implement single letter args properly!
|
||||||
|
|
||||||
Value = ArgNameEnd;
|
Value = ArgNameEnd;
|
||||||
if (*Value) // If we have an equals sign...
|
if (*Value) // If we have an equals sign...
|
||||||
@ -66,7 +96,8 @@ void cl::ParseCommandLineOptions(int &argc, char **argv,
|
|||||||
|
|
||||||
if (*ArgName != 0) {
|
if (*ArgName != 0) {
|
||||||
// Extract arg name part
|
// Extract arg name part
|
||||||
map<string, Option*>::iterator I = getOpts().find(string(ArgName, ArgNameEnd));
|
map<string, Option*>::iterator I =
|
||||||
|
getOpts().find(string(ArgName, ArgNameEnd));
|
||||||
Handler = I != getOpts().end() ? I->second : 0;
|
Handler = I != getOpts().end() ? I->second : 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -78,32 +109,13 @@ void cl::ParseCommandLineOptions(int &argc, char **argv,
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Enforce value requirements
|
ErrorParsing |= ProvideOption(Handler, ArgName, Value, argc, argv, i);
|
||||||
switch (Handler->getValueExpectedFlag()) {
|
|
||||||
case ValueRequired:
|
|
||||||
if (Value == 0 || *Value == 0) { // No value specified?
|
|
||||||
if (i+1 < argc) { // Steal the next argument, like for '-o filename'
|
|
||||||
Value = argv[++i];
|
|
||||||
} else {
|
|
||||||
ErrorParsing = Handler->error(" requires a value!");
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case ValueDisallowed:
|
|
||||||
if (*Value != 0) {
|
|
||||||
ErrorParsing = Handler->error(" does not allow a value! '" +
|
|
||||||
string(Value) + "' specified.");
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case ValueOptional: break;
|
|
||||||
default: cerr << "Bad ValueMask flag! CommandLine usage error:"
|
|
||||||
<< Handler->getValueExpectedFlag() << endl; abort();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Run the handler now!
|
// If this option should consume all arguments that come after it...
|
||||||
ErrorParsing |= Handler->addOccurance(ArgName, Value);
|
if (Handler->getNumOccurancesFlag() == ConsumeAfter) {
|
||||||
|
for (++i; i < argc; ++i)
|
||||||
|
ErrorParsing |= ProvideOption(Handler, ArgName, argv[i], argc, argv, i);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Loop over args and make sure all required args are specified!
|
// Loop over args and make sure all required args are specified!
|
||||||
@ -157,7 +169,8 @@ bool Option::addOccurance(const char *ArgName, const string &Value) {
|
|||||||
return error(": must occur exactly one time!", ArgName);
|
return error(": must occur exactly one time!", ArgName);
|
||||||
// Fall through
|
// Fall through
|
||||||
case OneOrMore:
|
case OneOrMore:
|
||||||
case ZeroOrMore: break;
|
case ZeroOrMore:
|
||||||
|
case ConsumeAfter: break;
|
||||||
default: return error(": bad num occurances flag value!");
|
default: return error(": bad num occurances flag value!");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -219,7 +232,7 @@ bool String::handleOccurance(const char *ArgName, const string &Arg) {
|
|||||||
// StringList valued command line option implementation
|
// StringList valued command line option implementation
|
||||||
//
|
//
|
||||||
bool StringList::handleOccurance(const char *ArgName, const string &Arg) {
|
bool StringList::handleOccurance(const char *ArgName, const string &Arg) {
|
||||||
Values.push_back(Arg);
|
push_back(Arg);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -37,6 +37,35 @@ static void AddArgument(const string &ArgName, Option *Opt) {
|
|||||||
static const char *ProgramName = 0;
|
static const char *ProgramName = 0;
|
||||||
static const char *ProgramOverview = 0;
|
static const char *ProgramOverview = 0;
|
||||||
|
|
||||||
|
static inline bool ProvideOption(Option *Handler, const char *ArgName,
|
||||||
|
const char *Value, int argc, char **argv,
|
||||||
|
int &i) {
|
||||||
|
// Enforce value requirements
|
||||||
|
switch (Handler->getValueExpectedFlag()) {
|
||||||
|
case ValueRequired:
|
||||||
|
if (Value == 0 || *Value == 0) { // No value specified?
|
||||||
|
if (i+1 < argc) { // Steal the next argument, like for '-o filename'
|
||||||
|
Value = argv[++i];
|
||||||
|
} else {
|
||||||
|
return Handler->error(" requires a value!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case ValueDisallowed:
|
||||||
|
if (*Value != 0)
|
||||||
|
return Handler->error(" does not allow a value! '" +
|
||||||
|
string(Value) + "' specified.");
|
||||||
|
break;
|
||||||
|
case ValueOptional: break;
|
||||||
|
default: cerr << "Bad ValueMask flag! CommandLine usage error:"
|
||||||
|
<< Handler->getValueExpectedFlag() << endl; abort();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Run the handler now!
|
||||||
|
return Handler->addOccurance(ArgName, Value);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void cl::ParseCommandLineOptions(int &argc, char **argv,
|
void cl::ParseCommandLineOptions(int &argc, char **argv,
|
||||||
const char *Overview = 0) {
|
const char *Overview = 0) {
|
||||||
ProgramName = argv[0]; // Save this away safe and snug
|
ProgramName = argv[0]; // Save this away safe and snug
|
||||||
@ -59,6 +88,7 @@ void cl::ParseCommandLineOptions(int &argc, char **argv,
|
|||||||
const char *ArgNameEnd = ArgName;
|
const char *ArgNameEnd = ArgName;
|
||||||
while (*ArgNameEnd && *ArgNameEnd != '=' &&
|
while (*ArgNameEnd && *ArgNameEnd != '=' &&
|
||||||
*ArgNameEnd != '/') ++ArgNameEnd; // Scan till end
|
*ArgNameEnd != '/') ++ArgNameEnd; // Scan till end
|
||||||
|
// TODO: Remove '/' case. Implement single letter args properly!
|
||||||
|
|
||||||
Value = ArgNameEnd;
|
Value = ArgNameEnd;
|
||||||
if (*Value) // If we have an equals sign...
|
if (*Value) // If we have an equals sign...
|
||||||
@ -66,7 +96,8 @@ void cl::ParseCommandLineOptions(int &argc, char **argv,
|
|||||||
|
|
||||||
if (*ArgName != 0) {
|
if (*ArgName != 0) {
|
||||||
// Extract arg name part
|
// Extract arg name part
|
||||||
map<string, Option*>::iterator I = getOpts().find(string(ArgName, ArgNameEnd));
|
map<string, Option*>::iterator I =
|
||||||
|
getOpts().find(string(ArgName, ArgNameEnd));
|
||||||
Handler = I != getOpts().end() ? I->second : 0;
|
Handler = I != getOpts().end() ? I->second : 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -78,32 +109,13 @@ void cl::ParseCommandLineOptions(int &argc, char **argv,
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Enforce value requirements
|
ErrorParsing |= ProvideOption(Handler, ArgName, Value, argc, argv, i);
|
||||||
switch (Handler->getValueExpectedFlag()) {
|
|
||||||
case ValueRequired:
|
|
||||||
if (Value == 0 || *Value == 0) { // No value specified?
|
|
||||||
if (i+1 < argc) { // Steal the next argument, like for '-o filename'
|
|
||||||
Value = argv[++i];
|
|
||||||
} else {
|
|
||||||
ErrorParsing = Handler->error(" requires a value!");
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case ValueDisallowed:
|
|
||||||
if (*Value != 0) {
|
|
||||||
ErrorParsing = Handler->error(" does not allow a value! '" +
|
|
||||||
string(Value) + "' specified.");
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case ValueOptional: break;
|
|
||||||
default: cerr << "Bad ValueMask flag! CommandLine usage error:"
|
|
||||||
<< Handler->getValueExpectedFlag() << endl; abort();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Run the handler now!
|
// If this option should consume all arguments that come after it...
|
||||||
ErrorParsing |= Handler->addOccurance(ArgName, Value);
|
if (Handler->getNumOccurancesFlag() == ConsumeAfter) {
|
||||||
|
for (++i; i < argc; ++i)
|
||||||
|
ErrorParsing |= ProvideOption(Handler, ArgName, argv[i], argc, argv, i);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Loop over args and make sure all required args are specified!
|
// Loop over args and make sure all required args are specified!
|
||||||
@ -157,7 +169,8 @@ bool Option::addOccurance(const char *ArgName, const string &Value) {
|
|||||||
return error(": must occur exactly one time!", ArgName);
|
return error(": must occur exactly one time!", ArgName);
|
||||||
// Fall through
|
// Fall through
|
||||||
case OneOrMore:
|
case OneOrMore:
|
||||||
case ZeroOrMore: break;
|
case ZeroOrMore:
|
||||||
|
case ConsumeAfter: break;
|
||||||
default: return error(": bad num occurances flag value!");
|
default: return error(": bad num occurances flag value!");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -219,7 +232,7 @@ bool String::handleOccurance(const char *ArgName, const string &Arg) {
|
|||||||
// StringList valued command line option implementation
|
// StringList valued command line option implementation
|
||||||
//
|
//
|
||||||
bool StringList::handleOccurance(const char *ArgName, const string &Arg) {
|
bool StringList::handleOccurance(const char *ArgName, const string &Arg) {
|
||||||
Values.push_back(Arg);
|
push_back(Arg);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user