Add opposite_of and inverse_opt to support -fno- style options. This

is necessary for eventual gcc commmand line compatibility.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@63384 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Mike Stump 2009-01-30 08:19:46 +00:00
parent e0ffc92508
commit d6f175b3ec
2 changed files with 54 additions and 1 deletions

View File

@ -302,6 +302,12 @@ struct LocationClass {
template<class Ty>
LocationClass<Ty> location(Ty &L) { return LocationClass<Ty>(L); }
// opposite_of - Allow the user to specify which other option this
// option is the opposite of.
//
template<class Ty>
LocationClass<bool> opposite_of(Ty &O) { return location(O.getValue()); }
//===----------------------------------------------------------------------===//
// Enum valued command line option
@ -576,6 +582,30 @@ public:
EXTERN_TEMPLATE_INSTANTIATION(class basic_parser<boolOrDefault>);
//--------------------------------------------------
// parser<boolInverse>
class boolInverse { };
template<>
class parser<boolInverse> : public basic_parser<bool> {
public:
typedef bool parser_data_type;
// parse - Return true on error.
bool parse(Option &O, const char *ArgName, const std::string &Arg,
bool &Val);
enum ValueExpected getValueExpectedFlagDefault() const {
return ValueOptional;
}
// getValueName - Do not print =<value> at all.
virtual const char *getValueName() const { return 0; }
// An out-of-line virtual method to provide a 'home' for this class.
virtual void anchor();
};
EXTERN_TEMPLATE_INSTANTIATION(class basic_parser<bool>);
//--------------------------------------------------
// parser<int>
//
@ -917,6 +947,9 @@ EXTERN_TEMPLATE_INSTANTIATION(class opt<int>);
EXTERN_TEMPLATE_INSTANTIATION(class opt<std::string>);
EXTERN_TEMPLATE_INSTANTIATION(class opt<bool>);
class boolInverse;
typedef opt<bool, true, parser<boolInverse> > inverse_opt;
//===----------------------------------------------------------------------===//
// list_storage class

View File

@ -40,6 +40,7 @@ using namespace cl;
//
TEMPLATE_INSTANTIATION(class basic_parser<bool>);
TEMPLATE_INSTANTIATION(class basic_parser<boolOrDefault>);
TEMPLATE_INSTANTIATION(class basic_parser<boolInverse>);
TEMPLATE_INSTANTIATION(class basic_parser<int>);
TEMPLATE_INSTANTIATION(class basic_parser<unsigned>);
TEMPLATE_INSTANTIATION(class basic_parser<double>);
@ -55,6 +56,7 @@ void Option::anchor() {}
void basic_parser_impl::anchor() {}
void parser<bool>::anchor() {}
void parser<boolOrDefault>::anchor() {}
void parser<boolInverse>::anchor() {}
void parser<int>::anchor() {}
void parser<unsigned>::anchor() {}
void parser<double>::anchor() {}
@ -882,7 +884,8 @@ bool parser<boolOrDefault>::parse(Option &O, const char *ArgName,
if (Arg == "" || Arg == "true" || Arg == "TRUE" || Arg == "True" ||
Arg == "1") {
Value = BOU_TRUE;
} else if (Arg == "false" || Arg == "FALSE" || Arg == "False" || Arg == "0") {
} else if (Arg == "false" || Arg == "FALSE"
|| Arg == "False" || Arg == "0") {
Value = BOU_FALSE;
} else {
return O.error(": '" + Arg +
@ -891,6 +894,23 @@ bool parser<boolOrDefault>::parse(Option &O, const char *ArgName,
return false;
}
// parser<boolInverse> implementation
//
bool parser<boolInverse>::parse(Option &O, const char *ArgName,
const std::string &Arg, bool &Value) {
if (Arg == "" || Arg == "true" || Arg == "TRUE" || Arg == "True" ||
Arg == "1") {
Value = false;
} else if (Arg == "false" || Arg == "FALSE"
|| Arg == "False" || Arg == "0") {
Value = true;
} else {
return O.error(": '" + Arg +
"' is invalid value for boolean argument! Try 0 or 1");
}
return false;
}
// parser<int> implementation
//
bool parser<int>::parse(Option &O, const char *ArgName,