From 84a061ca4ea1ff037d6965eff5bb90c80b77e733 Mon Sep 17 00:00:00 2001 From: mes5k Date: Tue, 10 Feb 2004 03:54:19 +0000 Subject: [PATCH] allowing blank flags --- src/Arg.cpp | 54 ++++++++++++++++++++++++++++++++++++++--------- src/CmdLine.cpp | 3 ++- src/SwitchArg.cpp | 5 +++-- 3 files changed, 49 insertions(+), 13 deletions(-) diff --git a/src/Arg.cpp b/src/Arg.cpp index 45e6ecd..8f38181 100644 --- a/src/Arg.cpp +++ b/src/Arg.cpp @@ -31,6 +31,7 @@ const char Arg::blankChar = '*'; const char Arg::flagStartChar = '-'; const string Arg::flagStartString = "-"; const string Arg::nameStartString = "--"; +const string Arg::ignoreNameString = "ignore_rest"; Arg::Arg( const string& flag, const string& name, @@ -53,6 +54,24 @@ Arg::Arg( const string& flag, if ( _flag.length() > 1 ) throw(ArgException("Argument flag can only be one character long", toString() ) ); + + if ( _name != ignoreNameString && + ( _flag == Arg::flagStartString || + _flag == Arg::nameStartString || + _flag == " " ) ) + throw(ArgException("Argument flag cannot be either '" + + Arg::flagStartString + "' or '" + + Arg::nameStartString + "' or a space.", + toString() ) ); + + if ( ( _name.find( Arg::flagStartString, 0 ) != string::npos ) || + ( _name.find( Arg::nameStartString, 0 ) != string::npos ) || + ( _name.find( " ", 0 ) != string::npos ) ) + throw(ArgException("Argument name cannot contain either '" + + Arg::flagStartString + "' or '" + + Arg::nameStartString + "' or space.", + toString() ) ); + }; Arg::Arg() @@ -107,7 +126,10 @@ string Arg::shortID( const string& valueId ) const { string id = ""; - id = Arg::flagStartString + _flag; + if ( _flag != "" ) + id = Arg::flagStartString + _flag; + else + id = Arg::nameStartString + _name; string delim = " "; delim[0] = Arg::_delimiter; // ugly!!! @@ -125,13 +147,17 @@ string Arg::longID( const string& valueId ) const { string id = ""; - id = Arg::flagStartString + _flag; + if ( _flag != "" ) + { + id += Arg::flagStartString + _flag; - if ( _valueRequired ) - id += " <" + valueId + ">"; + if ( _valueRequired ) + id += " <" + valueId + ">"; + + id += ", "; + } - - id += ", " + Arg::nameStartString + _name; + id += Arg::nameStartString + _name; if ( _valueRequired ) id += " <" + valueId + ">"; @@ -142,7 +168,7 @@ string Arg::longID( const string& valueId ) const bool Arg::operator==(const Arg& a) { - if ( _flag == a._flag || + if ( ( _flag != "" && _flag == a._flag ) || _name == a._name || _description == a._description ) return true; @@ -157,8 +183,6 @@ bool Arg::processArg(int* i, vector& args) return false; } -const string& Arg::getName() const { return _name; } ; - string Arg::getDescription() const { string desc = ""; @@ -173,7 +197,11 @@ string Arg::getDescription() const }; const string& Arg::getFlag() const { return _flag; }; + +const string& Arg::getName() const { return _name; } ; + bool Arg::isRequired() const { return _required; } + bool Arg::isValueRequired() const { return _valueRequired; } bool Arg::isSet() const @@ -202,7 +230,13 @@ bool Arg::argMatches( const string& argFlag ) const string Arg::toString() const { - string s = Arg::flagStartString + _flag + " (" + Arg::nameStartString + _name + ")"; + string s = ""; + + if ( _flag != "" ) + s += Arg::flagStartString + _flag + " "; + + s += "(" + Arg::nameStartString + _name + ")"; + return s; } diff --git a/src/CmdLine.cpp b/src/CmdLine.cpp index 1fe1391..bf82f09 100644 --- a/src/CmdLine.cpp +++ b/src/CmdLine.cpp @@ -58,7 +58,8 @@ void CmdLine::_constructor() false, new VersionVisitor( this ) ); add( *vers ); - SwitchArg* ignore = new SwitchArg(Arg::flagStartString,"ignore_rest", + SwitchArg* ignore = new SwitchArg(Arg::flagStartString, + Arg::ignoreNameString, "Ignores the rest of the labeled arguments following this flag.", false, new IgnoreRestVisitor() ); add( *ignore ); diff --git a/src/SwitchArg.cpp b/src/SwitchArg.cpp index 092a4fa..c66cb0f 100644 --- a/src/SwitchArg.cpp +++ b/src/SwitchArg.cpp @@ -43,11 +43,12 @@ bool SwitchArg::getValue() { return _value; }; bool SwitchArg::combinedSwitchesMatch(string& combinedSwitches ) { // make sure this is actually a combined switch - if ( combinedSwitches[0] != '-' ) + if ( combinedSwitches[0] != Arg::flagStartString[0] ) return false; // make sure it isn't a long name - if ( combinedSwitches[1] == '-' ) + if ( combinedSwitches.substr( 0, Arg::nameStartString.length() ) == + Arg::nameStartString ) return false; // ok, we're not specifying a ValueArg, so we know that we have