mirror of
https://github.com/cuberite/TCLAP.git
synced 2025-09-08 03:40:21 -04:00
Implementation now in header files
This commit is contained in:
parent
35aa53232d
commit
4fcee3ee11
257
src/Arg.cpp
257
src/Arg.cpp
@ -1,257 +0,0 @@
|
||||
|
||||
/******************************************************************************
|
||||
*
|
||||
* file: Arg.cpp
|
||||
*
|
||||
* Copyright (c) 2003, Michael E. Smoot .
|
||||
* All rights reverved.
|
||||
*
|
||||
* See the file COPYING in the top directory of this distribution for
|
||||
* more information.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED _AS IS_, WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
|
||||
#include <tclap/Arg.h>
|
||||
#include <tclap/CommandLine.h>
|
||||
|
||||
using namespace std;
|
||||
|
||||
namespace TCLAP {
|
||||
|
||||
// defaults
|
||||
bool Arg::_ignoreRest = false;
|
||||
char Arg::_delimiter = ' ';
|
||||
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 std::string& flag,
|
||||
const std::string& name,
|
||||
const std::string& desc,
|
||||
bool req,
|
||||
bool valreq,
|
||||
Visitor* v) :
|
||||
_flag(flag),
|
||||
_name(name),
|
||||
_description(desc),
|
||||
_required(req),
|
||||
_requireLabel("required"),
|
||||
_valueRequired(valreq),
|
||||
_alreadySet(false),
|
||||
_visitor( v ),
|
||||
_ignoreable(true),
|
||||
_xorSet(false)
|
||||
{
|
||||
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() { }
|
||||
|
||||
string Arg::shortID( const string& valueId ) const
|
||||
{
|
||||
string id = "";
|
||||
|
||||
if ( _flag != "" )
|
||||
id = Arg::flagStartString + _flag;
|
||||
else
|
||||
id = Arg::nameStartString + _name;
|
||||
|
||||
string delim = " ";
|
||||
delim[0] = Arg::_delimiter; // ugly!!!
|
||||
|
||||
if ( _valueRequired )
|
||||
id += delim + "<" + valueId + ">";
|
||||
|
||||
if ( !_required )
|
||||
id = "[" + id + "]";
|
||||
|
||||
return id;
|
||||
}
|
||||
|
||||
string Arg::longID( const string& valueId ) const
|
||||
{
|
||||
string id = "";
|
||||
|
||||
if ( _flag != "" )
|
||||
{
|
||||
id += Arg::flagStartString + _flag;
|
||||
|
||||
if ( _valueRequired )
|
||||
id += " <" + valueId + ">";
|
||||
|
||||
id += ", ";
|
||||
}
|
||||
|
||||
id += Arg::nameStartString + _name;
|
||||
|
||||
if ( _valueRequired )
|
||||
id += " <" + valueId + ">";
|
||||
|
||||
return id;
|
||||
|
||||
}
|
||||
|
||||
bool Arg::operator==(const Arg& a)
|
||||
{
|
||||
if ( ( _flag != "" && _flag == a._flag ) ||
|
||||
_name == a._name ||
|
||||
_description == a._description )
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
// should be overridden
|
||||
bool Arg::processArg(int* i, vector<string>& args)
|
||||
{
|
||||
cerr << "WARNING: Ignoring unknown argument: " << args[*i] << endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
string Arg::getDescription() const
|
||||
{
|
||||
string desc = "";
|
||||
if ( _required )
|
||||
desc = "(" + _requireLabel + ") ";
|
||||
|
||||
if ( _valueRequired )
|
||||
desc += "(value required) ";
|
||||
|
||||
desc += _description;
|
||||
return desc;
|
||||
}
|
||||
|
||||
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
|
||||
{
|
||||
if ( _alreadySet && !_xorSet )
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
bool Arg::isIgnoreable() const { return _ignoreable; }
|
||||
|
||||
void Arg::setRequireLabel( const string& s)
|
||||
{
|
||||
_requireLabel = s;
|
||||
}
|
||||
|
||||
bool Arg::argMatches( const string& argFlag ) const
|
||||
{
|
||||
if ( argFlag == Arg::flagStartString + _flag ||
|
||||
argFlag == Arg::nameStartString + _name )
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
string Arg::toString() const
|
||||
{
|
||||
string s = "";
|
||||
|
||||
if ( _flag != "" )
|
||||
s += Arg::flagStartString + _flag + " ";
|
||||
|
||||
s += "(" + Arg::nameStartString + _name + ")";
|
||||
|
||||
return s;
|
||||
}
|
||||
|
||||
void Arg::_checkWithVisitor() const
|
||||
{
|
||||
if ( _visitor != NULL )
|
||||
_visitor->visit();
|
||||
}
|
||||
|
||||
/**
|
||||
* Implementation of trimFlag.
|
||||
*/
|
||||
void Arg::trimFlag(string& flag, string& value) const
|
||||
{
|
||||
int stop = 0;
|
||||
for ( int i = 0; (unsigned int)i < flag.length(); i++ )
|
||||
if ( flag[i] == Arg::_delimiter )
|
||||
{
|
||||
stop = i;
|
||||
break;
|
||||
}
|
||||
|
||||
if ( stop > 1 )
|
||||
{
|
||||
value = flag.substr(stop+1);
|
||||
flag = flag.substr(0,stop);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Implementation of _hasBlanks.
|
||||
*/
|
||||
bool Arg::_hasBlanks( const string& s ) const
|
||||
{
|
||||
for ( int i = 1; (unsigned int)i < s.length(); i++ )
|
||||
if ( s[i] == Arg::blankChar )
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void Arg::forceRequired()
|
||||
{
|
||||
_required = true;
|
||||
}
|
||||
|
||||
void Arg::xorSet()
|
||||
{
|
||||
_alreadySet = true;
|
||||
_xorSet = true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Overridden by Args that need to added to the end of the list.
|
||||
*/
|
||||
void Arg::addToList( list<Arg*>& argList ) const
|
||||
{
|
||||
argList.push_front( (Arg*)this );
|
||||
}
|
||||
|
||||
}
|
262
src/CmdLine.cpp
262
src/CmdLine.cpp
@ -1,262 +0,0 @@
|
||||
|
||||
/******************************************************************************
|
||||
*
|
||||
* file: CmdLine.cpp
|
||||
*
|
||||
* Copyright (c) 2003, Michael E. Smoot .
|
||||
* All rights reverved.
|
||||
*
|
||||
* See the file COPYING in the top directory of this distribution for
|
||||
* more information.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED _AS IS_, WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
|
||||
#include <tclap/CommandLine.h>
|
||||
|
||||
using namespace std;
|
||||
|
||||
namespace TCLAP {
|
||||
|
||||
CmdLine::CmdLine(const string& n, const string& m, const string& v )
|
||||
: _progName(n),
|
||||
_message(m),
|
||||
_version(v),
|
||||
_numRequired(0),
|
||||
_delimiter(' ')
|
||||
{
|
||||
_constructor();
|
||||
}
|
||||
|
||||
CmdLine::CmdLine(const string& m, char delim, const string& v )
|
||||
: _progName("not_set_yet"),
|
||||
_message(m),
|
||||
_version(v),
|
||||
_numRequired(0),
|
||||
_delimiter(delim)
|
||||
{
|
||||
_constructor();
|
||||
}
|
||||
|
||||
CmdLine::~CmdLine()
|
||||
{
|
||||
list<Arg*>::iterator argIter;
|
||||
list<Visitor*>::iterator visIter;
|
||||
|
||||
for( argIter = _argDeleteOnExitList.begin();
|
||||
argIter != _argDeleteOnExitList.end();
|
||||
++argIter)
|
||||
delete *argIter;
|
||||
|
||||
for( visIter = _visitorDeleteOnExitList.begin();
|
||||
visIter != _visitorDeleteOnExitList.end();
|
||||
++visIter)
|
||||
delete *visIter;
|
||||
}
|
||||
|
||||
void CmdLine::_constructor()
|
||||
{
|
||||
Visitor *v;
|
||||
|
||||
Arg::setDelimiter( _delimiter );
|
||||
|
||||
v = new HelpVisitor( this );
|
||||
SwitchArg* help = new SwitchArg("h","help",
|
||||
"Displays usage information and exits.",
|
||||
false, v);
|
||||
add( *help );
|
||||
deleteOnExit(help);
|
||||
deleteOnExit(v);
|
||||
|
||||
v = new VersionVisitor( this );
|
||||
SwitchArg* vers = new SwitchArg("v","version",
|
||||
"Displays version information and exits.",
|
||||
false, v);
|
||||
add( *vers );
|
||||
deleteOnExit(vers);
|
||||
deleteOnExit(v);
|
||||
|
||||
v = new IgnoreRestVisitor();
|
||||
SwitchArg* ignore = new SwitchArg(Arg::flagStartString,
|
||||
Arg::ignoreNameString,
|
||||
"Ignores the rest of the labeled arguments following this flag.",
|
||||
false, v);
|
||||
add( *ignore );
|
||||
deleteOnExit(ignore);
|
||||
deleteOnExit(v);
|
||||
}
|
||||
|
||||
void CmdLine::xorAdd( vector<Arg*>& ors )
|
||||
{
|
||||
_xorHandler.add( ors );
|
||||
|
||||
for (ArgVectorIterator it = ors.begin(); it != ors.end(); it++)
|
||||
{
|
||||
(*it)->forceRequired();
|
||||
(*it)->setRequireLabel( "OR required" );
|
||||
|
||||
add( *it );
|
||||
}
|
||||
}
|
||||
|
||||
void CmdLine::xorAdd( Arg& a, Arg& b )
|
||||
{
|
||||
vector<Arg*> ors;
|
||||
ors.push_back( &a );
|
||||
ors.push_back( &b );
|
||||
xorAdd( ors );
|
||||
}
|
||||
|
||||
void CmdLine::add( Arg& a )
|
||||
{
|
||||
add( &a );
|
||||
}
|
||||
|
||||
void CmdLine::add( Arg* a )
|
||||
{
|
||||
for( ArgIterator iter = _argList.begin(); iter != _argList.end(); iter++ )
|
||||
if ( *a == *(*iter) )
|
||||
throw( ArgException( "Argument with same flag/name already exists!",
|
||||
a->longID() ) );
|
||||
|
||||
a->addToList( _argList );
|
||||
|
||||
if ( a->isRequired() ) _numRequired++;
|
||||
}
|
||||
|
||||
void CmdLine::version(int exitVal)
|
||||
{
|
||||
cout << endl << _progName << " version: " << _version << endl << endl;
|
||||
exit( exitVal );
|
||||
}
|
||||
|
||||
void CmdLine::_shortUsage( ostream& os )
|
||||
{
|
||||
string s = _progName + " " + _xorHandler.shortUsage();
|
||||
|
||||
for (ArgIterator it = _argList.begin(); it != _argList.end(); it++)
|
||||
if ( !_xorHandler.contains( (*it) ) )
|
||||
s += " " + (*it)->shortID();
|
||||
|
||||
spacePrint( os, s, 75, 3, (int)(_progName.length()) + 2 );
|
||||
}
|
||||
|
||||
void CmdLine::_longUsage( ostream& os )
|
||||
{
|
||||
_xorHandler.printLongUsage( os );
|
||||
|
||||
for (ArgIterator it = _argList.begin(); it != _argList.end(); it++)
|
||||
if ( !_xorHandler.contains( (*it) ) )
|
||||
{
|
||||
spacePrint( os, (*it)->longID(), 75, 3, 3 );
|
||||
spacePrint( os, (*it)->getDescription(), 75, 5, 0 );
|
||||
os << endl;
|
||||
}
|
||||
|
||||
os << endl;
|
||||
spacePrint( os, _message, 75, 3, 0 );
|
||||
}
|
||||
|
||||
void CmdLine::usage( int exitVal )
|
||||
{
|
||||
cout << endl << "USAGE: " << endl << endl;
|
||||
|
||||
_shortUsage( cout );
|
||||
|
||||
cout << endl << endl << "Where: " << endl << endl;
|
||||
|
||||
_longUsage( cout );
|
||||
|
||||
cout << endl;
|
||||
|
||||
exit( exitVal );
|
||||
}
|
||||
|
||||
void CmdLine::parse(int argc, char** argv)
|
||||
{
|
||||
try {
|
||||
|
||||
_progName = argv[0];
|
||||
|
||||
// this step is necessary so that we have easy access to mutable strings.
|
||||
vector<string> args;
|
||||
for (int i = 1; i < argc; i++)
|
||||
args.push_back(argv[i]);
|
||||
|
||||
int requiredCount = 0;
|
||||
|
||||
for (int i = 0; (unsigned int)i < args.size(); i++)
|
||||
{
|
||||
bool matched = false;
|
||||
for (ArgIterator it = _argList.begin(); it != _argList.end(); it++)
|
||||
{
|
||||
if ( (*it)->processArg( &i, args ) )
|
||||
{
|
||||
requiredCount += _xorHandler.check( *it );
|
||||
matched = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// checks to see if the argument is an empty combined switch ...
|
||||
// and if so, then we've actually matched it
|
||||
if ( !matched && _emptyCombined( args[i] ) )
|
||||
matched = true;
|
||||
|
||||
if ( !matched && !Arg::ignoreRest() )
|
||||
throw( ArgException("Couldn't find match for argument",args[i]));
|
||||
}
|
||||
|
||||
if ( requiredCount < _numRequired )
|
||||
throw( ArgException("One or more required arguments missing!") );
|
||||
|
||||
if ( requiredCount > _numRequired )
|
||||
throw( ArgException("Too many arguments!") );
|
||||
|
||||
} catch ( ArgException e )
|
||||
{
|
||||
cerr << "PARSE ERROR: " << e.argId() << endl
|
||||
<< " " << e.error() << endl << endl;
|
||||
|
||||
cerr << "Brief USAGE: " << endl;
|
||||
|
||||
_shortUsage( cerr );
|
||||
|
||||
cerr << endl << "For complete USAGE and HELP type: "
|
||||
<< endl << " " << _progName << " --help" << endl << endl;
|
||||
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
bool CmdLine::_emptyCombined(const string& s)
|
||||
{
|
||||
if ( s[0] != Arg::flagStartChar )
|
||||
return false;
|
||||
|
||||
for ( int i = 1; (unsigned int)i < s.length(); i++ )
|
||||
if ( s[i] != Arg::blankChar )
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void CmdLine::deleteOnExit(Arg* ptr)
|
||||
{
|
||||
_argDeleteOnExitList.push_back(ptr);
|
||||
}
|
||||
|
||||
void CmdLine::deleteOnExit(Visitor* ptr)
|
||||
{
|
||||
_visitorDeleteOnExitList.push_back(ptr);
|
||||
}
|
||||
|
||||
}
|
@ -1,12 +0,0 @@
|
||||
|
||||
lib_LIBRARIES = libtclap.a
|
||||
|
||||
libtclap_a_SOURCES = Arg.cpp \
|
||||
CmdLine.cpp \
|
||||
SwitchArg.cpp \
|
||||
XorHandler.cpp \
|
||||
PrintSensibly.cpp
|
||||
|
||||
INCLUDES = -I$(top_srcdir)/include
|
||||
|
||||
AM_CXXFLAGS = -Wall
|
@ -1,88 +0,0 @@
|
||||
|
||||
/******************************************************************************
|
||||
*
|
||||
* file: PrintSensibly.cpp
|
||||
*
|
||||
* Copyright (c) 2004, Michael E. Smoot .
|
||||
* All rights reverved.
|
||||
*
|
||||
* See the file COPYING in the top directory of this distribution for
|
||||
* more information.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED _AS IS_, WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
|
||||
#include <tclap/PrintSensibly.h>
|
||||
|
||||
using namespace std;
|
||||
|
||||
namespace TCLAP {
|
||||
|
||||
void spacePrint( ostream& os,
|
||||
const string& s,
|
||||
int maxWidth,
|
||||
int indentSpaces,
|
||||
int secondLineOffset )
|
||||
{
|
||||
int len = (int)(s.length());
|
||||
|
||||
if ( (len + indentSpaces > maxWidth) && maxWidth > 0 )
|
||||
{
|
||||
int allowedLen = maxWidth - indentSpaces;
|
||||
int start = 0;
|
||||
while ( start < len )
|
||||
{
|
||||
// find the substring length
|
||||
int stringLen = min( len - start, allowedLen );
|
||||
|
||||
// trim the length so it doesn't end in middle of a word
|
||||
if ( stringLen == allowedLen )
|
||||
while ( s[stringLen+start] != ' ' &&
|
||||
s[stringLen+start] != ',' &&
|
||||
s[stringLen+start] != '|' )
|
||||
stringLen--;
|
||||
|
||||
// check for newlines
|
||||
for ( int i = 0; i < stringLen; i++ )
|
||||
if ( s[start+i] == '\n' )
|
||||
stringLen = i+1;
|
||||
|
||||
// print the indent
|
||||
for ( int i = 0; i < indentSpaces; i++ )
|
||||
os << " ";
|
||||
|
||||
if ( start == 0 )
|
||||
{
|
||||
// handle second line offsets
|
||||
indentSpaces += secondLineOffset;
|
||||
|
||||
// adjust allowed len
|
||||
allowedLen -= secondLineOffset;
|
||||
}
|
||||
|
||||
os << s.substr(start,stringLen) << endl;
|
||||
|
||||
// so we don't start a line with a space
|
||||
if ( s[stringLen+start] == ' ' )
|
||||
start++;
|
||||
|
||||
start += stringLen;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for ( int i = 0; i < indentSpaces; i++ )
|
||||
os << " ";
|
||||
os << s << endl;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -1,114 +0,0 @@
|
||||
|
||||
/******************************************************************************
|
||||
*
|
||||
* file: SwitchArg.cpp
|
||||
*
|
||||
* Copyright (c) 2003, Michael E. Smoot .
|
||||
* All rights reverved.
|
||||
*
|
||||
* See the file COPYING in the top directory of this distribution for
|
||||
* more information.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED _AS IS_, WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
|
||||
#include <tclap/SwitchArg.h>
|
||||
#include <tclap/CommandLine.h>
|
||||
|
||||
using namespace std;
|
||||
|
||||
namespace TCLAP {
|
||||
|
||||
SwitchArg::SwitchArg(const string& flag,
|
||||
const string& name,
|
||||
const string& desc,
|
||||
bool _default,
|
||||
Visitor* v )
|
||||
: Arg(flag, name, desc, false, false, v),
|
||||
_value( _default )
|
||||
{ }
|
||||
|
||||
SwitchArg::SwitchArg(const string& flag,
|
||||
const string& name,
|
||||
const string& desc,
|
||||
bool _default,
|
||||
CmdLine& parser,
|
||||
Visitor* v )
|
||||
: Arg(flag, name, desc, false, false, v),
|
||||
_value( _default )
|
||||
{
|
||||
parser.add( this );
|
||||
}
|
||||
|
||||
bool SwitchArg::getValue() { return _value; }
|
||||
|
||||
bool SwitchArg::combinedSwitchesMatch(string& combinedSwitches )
|
||||
{
|
||||
// make sure this is actually a combined switch
|
||||
if ( combinedSwitches[0] != Arg::flagStartString[0] )
|
||||
return false;
|
||||
|
||||
// make sure it isn't a long name
|
||||
if ( combinedSwitches.substr( 0, Arg::nameStartString.length() ) ==
|
||||
Arg::nameStartString )
|
||||
return false;
|
||||
|
||||
// ok, we're not specifying a ValueArg, so we know that we have
|
||||
// a combined switch list.
|
||||
for ( unsigned int i = 1; i < combinedSwitches.length(); i++ )
|
||||
if ( combinedSwitches[i] == _flag[0] )
|
||||
{
|
||||
// update the combined switches so this one is no longer present
|
||||
// this is necessary so that no unlabeled args are matched
|
||||
// later in the processing.
|
||||
//combinedSwitches.erase(i,1);
|
||||
combinedSwitches[i] = Arg::blankChar;
|
||||
return true;
|
||||
}
|
||||
|
||||
// none of the switches passed in the list match.
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
bool SwitchArg::processArg(int *i, vector<string>& args)
|
||||
{
|
||||
if ( _ignoreable && Arg::ignoreRest() )
|
||||
return false;
|
||||
|
||||
if ( argMatches( args[*i] ) || combinedSwitchesMatch( args[*i] ) )
|
||||
{
|
||||
// If we match on a combined switch, then we want to return false
|
||||
// so that other switches in the combination will also have a
|
||||
// chance to match.
|
||||
bool ret = false;
|
||||
if ( argMatches( args[*i] ) )
|
||||
ret = true;
|
||||
|
||||
if ( _alreadySet )
|
||||
throw(ArgException("Argument already set!", toString()));
|
||||
|
||||
_alreadySet = true;
|
||||
|
||||
if ( _value == true )
|
||||
_value = false;
|
||||
else
|
||||
_value = true;
|
||||
|
||||
_checkWithVisitor();
|
||||
|
||||
return ret;
|
||||
}
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
@ -1,110 +0,0 @@
|
||||
|
||||
/******************************************************************************
|
||||
*
|
||||
* file: XorHandler.cpp
|
||||
*
|
||||
* Copyright (c) 2003, Michael E. Smoot .
|
||||
* All rights reverved.
|
||||
*
|
||||
* See the file COPYING in the top directory of this distribution for
|
||||
* more information.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED _AS IS_, WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
|
||||
#include <tclap/XorHandler.h>
|
||||
|
||||
using namespace std;
|
||||
|
||||
namespace TCLAP {
|
||||
|
||||
XorHandler::XorHandler( )
|
||||
{ }
|
||||
|
||||
void XorHandler::add( vector<Arg*>& ors )
|
||||
{
|
||||
_orList.push_back( ors );
|
||||
}
|
||||
|
||||
string XorHandler::shortUsage()
|
||||
{
|
||||
string out = "";
|
||||
for ( int i = 0; (unsigned int)i < _orList.size(); i++ )
|
||||
{
|
||||
out += " {";
|
||||
for ( ArgVectorIterator it = _orList[i].begin();
|
||||
it != _orList[i].end(); it++ )
|
||||
out += (*it)->shortID() + "|";
|
||||
|
||||
out[out.length()-1] = '}';
|
||||
}
|
||||
|
||||
return out;
|
||||
}
|
||||
|
||||
void XorHandler::printLongUsage( ostream& os )
|
||||
{
|
||||
for ( int i = 0; (unsigned int)i < _orList.size(); i++ )
|
||||
{
|
||||
for ( ArgVectorIterator it = _orList[i].begin();
|
||||
it != _orList[i].end();
|
||||
it++ )
|
||||
{
|
||||
spacePrint( os, (*it)->longID(), 75, 3, 3 );
|
||||
spacePrint( os, (*it)->getDescription(), 75, 5, 0 );
|
||||
|
||||
if ( it+1 != _orList[i].end() )
|
||||
spacePrint(os, "-- OR --", 75, 9);
|
||||
}
|
||||
os << endl << endl;
|
||||
}
|
||||
}
|
||||
|
||||
int XorHandler::check( const Arg* a )
|
||||
{
|
||||
// iterate over each XOR list
|
||||
for ( int i = 0; (unsigned int)i < _orList.size(); i++ )
|
||||
{
|
||||
// if the XOR list contains the arg..
|
||||
if ( find( _orList[i].begin(), _orList[i].end(), a ) !=
|
||||
_orList[i].end() )
|
||||
{
|
||||
// go through and set each arg that is not a
|
||||
for ( ArgVectorIterator it = _orList[i].begin();
|
||||
it != _orList[i].end();
|
||||
it++ )
|
||||
if ( a != (*it) )
|
||||
(*it)->xorSet();
|
||||
|
||||
// return the number of required args that have now been set
|
||||
return (int)_orList[i].size();
|
||||
}
|
||||
}
|
||||
|
||||
if ( a->isRequired() )
|
||||
return 1;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool XorHandler::contains( const Arg* a )
|
||||
{
|
||||
for ( int i = 0; (unsigned int)i < _orList.size(); i++ )
|
||||
for ( ArgVectorIterator it = _orList[i].begin();
|
||||
it != _orList[i].end();
|
||||
it++ )
|
||||
if ( a == (*it) )
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user