mirror of
https://github.com/lltcggie/waifu2x-caffe.git
synced 2025-06-26 21:52:49 +00:00
tclapwをコミットし忘れていたのを修正 #33
This commit is contained in:
parent
7fe5284079
commit
7f15cd6fb4
697
include/tclapw/Arg.h
Normal file
697
include/tclapw/Arg.h
Normal file
@ -0,0 +1,697 @@
|
|||||||
|
// -*- Mode: c++; c-basic-offset: 4; tab-width: 4; -*-
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
*
|
||||||
|
* file: Arg.h
|
||||||
|
*
|
||||||
|
* Copyright (c) 2003, Michael E. Smoot .
|
||||||
|
* Copyright (c) 2004, Michael E. Smoot, Daniel Aarno .
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef TCLAP_ARGUMENT_H
|
||||||
|
#define TCLAP_ARGUMENT_H
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
#include <config.h>
|
||||||
|
#else
|
||||||
|
#define HAVE_SSTREAM
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
#include <list>
|
||||||
|
#include <iostream>
|
||||||
|
#include <iomanip>
|
||||||
|
#include <cstdio>
|
||||||
|
|
||||||
|
#if defined(HAVE_SSTREAM)
|
||||||
|
#include <sstream>
|
||||||
|
typedef std::istringstream istringstream;
|
||||||
|
#elif defined(HAVE_STRSTREAM)
|
||||||
|
#include <strstream>
|
||||||
|
typedef std::istrstream istringstream;
|
||||||
|
#else
|
||||||
|
#error L"Need a stringstream (sstream or strstream) to compile!"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <tclapw/ArgException.h>
|
||||||
|
#include <tclapw/Visitor.h>
|
||||||
|
#include <tclapw/CmdLineInterface.h>
|
||||||
|
#include <tclapw/ArgTraits.h>
|
||||||
|
#include <tclapw/StandardTraits.h>
|
||||||
|
|
||||||
|
namespace TCLAP {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A virtual base class that defines the essential data for all arguments.
|
||||||
|
* This class, or one of its existing children, must be subclassed to do
|
||||||
|
* anything.
|
||||||
|
*/
|
||||||
|
class Arg
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
/**
|
||||||
|
* Prevent accidental copying.
|
||||||
|
*/
|
||||||
|
Arg(const Arg& rhs);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prevent accidental copying.
|
||||||
|
*/
|
||||||
|
Arg& operator=(const Arg& rhs);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Indicates whether the rest of the arguments should be ignored.
|
||||||
|
*/
|
||||||
|
static bool& ignoreRestRef() { static bool ign = false; return ign; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The delimiter that separates an argument flag/name from the
|
||||||
|
* value.
|
||||||
|
*/
|
||||||
|
static wchar_t& delimiterRef() { static wchar_t delim = L' '; return delim; }
|
||||||
|
|
||||||
|
static bool &ignoreMismatchedRef() { static bool ign = false; return ign; }
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The single wchar_t flag used to identify the argument.
|
||||||
|
* This value (preceded by a dash {-}), can be used to identify
|
||||||
|
* an argument on the command line. The _flag can be blank,
|
||||||
|
* in fact this is how unlabeled args work. Unlabeled args must
|
||||||
|
* override appropriate functions to get correct handling. Note
|
||||||
|
* that the _flag does NOT include the dash as part of the flag.
|
||||||
|
*/
|
||||||
|
std::wstring _flag;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A single work namd indentifying the argument.
|
||||||
|
* This value (preceded by two dashed {--}) can also be used
|
||||||
|
* to identify an argument on the command line. Note that the
|
||||||
|
* _name does NOT include the two dashes as part of the _name. The
|
||||||
|
* _name cannot be blank.
|
||||||
|
*/
|
||||||
|
std::wstring _name;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Description of the argument.
|
||||||
|
*/
|
||||||
|
std::wstring _description;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Indicating whether the argument is required.
|
||||||
|
*/
|
||||||
|
bool _required;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Label to be used in usage description. Normally set to
|
||||||
|
* L"required", but can be changed when necessary.
|
||||||
|
*/
|
||||||
|
std::wstring _requireLabel;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Indicates whether a value is required for the argument.
|
||||||
|
* Note that the value may be required but the argument/value
|
||||||
|
* combination may not be, as specified by _required.
|
||||||
|
*/
|
||||||
|
bool _valueRequired;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Indicates whether the argument has been set.
|
||||||
|
* Indicates that a value on the command line has matched the
|
||||||
|
* name/flag of this argument and the values have been set accordingly.
|
||||||
|
*/
|
||||||
|
bool _alreadySet;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A pointer to a vistitor object.
|
||||||
|
* The visitor allows special handling to occur as soon as the
|
||||||
|
* argument is matched. This defaults to NULL and should not
|
||||||
|
* be used unless absolutely necessary.
|
||||||
|
*/
|
||||||
|
Visitor* _visitor;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Whether this argument can be ignored, if desired.
|
||||||
|
*/
|
||||||
|
bool _ignoreable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Indicates that the arg was set as part of an XOR and not on the
|
||||||
|
* command line.
|
||||||
|
*/
|
||||||
|
bool _xorSet;
|
||||||
|
|
||||||
|
bool _acceptsMultipleValues;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Performs the special handling described by the Vistitor.
|
||||||
|
*/
|
||||||
|
void _checkWithVisitor() const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Primary constructor. YOU (yes you) should NEVER construct an Arg
|
||||||
|
* directly, this is a base class that is extended by various children
|
||||||
|
* that are meant to be used. Use SwitchArg, ValueArg, MultiArg,
|
||||||
|
* UnlabeledValueArg, or UnlabeledMultiArg instead.
|
||||||
|
*
|
||||||
|
* \param flag - The flag identifying the argument.
|
||||||
|
* \param name - The name identifying the argument.
|
||||||
|
* \param desc - The description of the argument, used in the usage.
|
||||||
|
* \param req - Whether the argument is required.
|
||||||
|
* \param valreq - Whether the a value is required for the argument.
|
||||||
|
* \param v - The visitor checked by the argument. Defaults to NULL.
|
||||||
|
*/
|
||||||
|
Arg( const std::wstring& flag,
|
||||||
|
const std::wstring& name,
|
||||||
|
const std::wstring& desc,
|
||||||
|
bool req,
|
||||||
|
bool valreq,
|
||||||
|
Visitor* v = NULL );
|
||||||
|
|
||||||
|
public:
|
||||||
|
/**
|
||||||
|
* Destructor.
|
||||||
|
*/
|
||||||
|
virtual ~Arg();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds this to the specified list of Args.
|
||||||
|
* \param argList - The list to add this to.
|
||||||
|
*/
|
||||||
|
virtual void addToList( std::list<Arg*>& argList ) const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Begin ignoring arguments since the L"--" argument was specified.
|
||||||
|
*/
|
||||||
|
static void beginIgnoring() { ignoreRestRef() = true; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Whether to ignore the rest.
|
||||||
|
*/
|
||||||
|
static bool ignoreRest() { return ignoreRestRef(); }
|
||||||
|
|
||||||
|
static void enableIgnoreMismatched() { ignoreMismatchedRef() = true; }
|
||||||
|
static bool ignoreMismatched() { return ignoreMismatchedRef(); }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The delimiter that separates an argument flag/name from the
|
||||||
|
* value.
|
||||||
|
*/
|
||||||
|
static wchar_t delimiter() { return delimiterRef(); }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The wchar_t used as a place holder when SwitchArgs are combined.
|
||||||
|
* Currently set to the bell wchar_t (ASCII 7).
|
||||||
|
*/
|
||||||
|
static wchar_t blankChar() { return (wchar_t)7; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The wchar_t that indicates the beginning of a flag. Defaults to L'-', but
|
||||||
|
* clients can define TCLAP_FLAGSTARTCHAR to override.
|
||||||
|
*/
|
||||||
|
#ifndef TCLAP_FLAGSTARTCHAR
|
||||||
|
#define TCLAP_FLAGSTARTCHAR L'-'
|
||||||
|
#endif
|
||||||
|
static wchar_t flagStartChar() { return TCLAP_FLAGSTARTCHAR; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The sting that indicates the beginning of a flag. Defaults to L"-", but
|
||||||
|
* clients can define TCLAP_FLAGSTARTSTRING to override. Should be the same
|
||||||
|
* as TCLAP_FLAGSTARTCHAR.
|
||||||
|
*/
|
||||||
|
#ifndef TCLAP_FLAGSTARTSTRING
|
||||||
|
#define TCLAP_FLAGSTARTSTRING L"-"
|
||||||
|
#endif
|
||||||
|
static const std::wstring flagStartString() { return TCLAP_FLAGSTARTSTRING; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The sting that indicates the beginning of a name. Defaults to L"--", but
|
||||||
|
* clients can define TCLAP_NAMESTARTSTRING to override.
|
||||||
|
*/
|
||||||
|
#ifndef TCLAP_NAMESTARTSTRING
|
||||||
|
#define TCLAP_NAMESTARTSTRING L"--"
|
||||||
|
#endif
|
||||||
|
static const std::wstring nameStartString() { return TCLAP_NAMESTARTSTRING; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The name used to identify the ignore rest argument.
|
||||||
|
*/
|
||||||
|
static const std::wstring ignoreNameString() { return L"ignore_rest"; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the delimiter for all arguments.
|
||||||
|
* \param c - The character that delimits flags/names from values.
|
||||||
|
*/
|
||||||
|
static void setDelimiter( wchar_t c ) { delimiterRef() = c; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Pure virtual method meant to handle the parsing and value assignment
|
||||||
|
* of the string on the command line.
|
||||||
|
* \param i - Pointer the the current argument in the list.
|
||||||
|
* \param args - Mutable list of strings. What is
|
||||||
|
* passed in from main.
|
||||||
|
*/
|
||||||
|
virtual bool processArg(int *i, std::vector<std::wstring>& args) = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Operator ==.
|
||||||
|
* Equality operator. Must be virtual to handle unlabeled args.
|
||||||
|
* \param a - The Arg to be compared to this.
|
||||||
|
*/
|
||||||
|
virtual bool operator==(const Arg& a) const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the argument flag.
|
||||||
|
*/
|
||||||
|
const std::wstring& getFlag() const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the argument name.
|
||||||
|
*/
|
||||||
|
const std::wstring& getName() const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the argument description.
|
||||||
|
*/
|
||||||
|
std::wstring getDescription() const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Indicates whether the argument is required.
|
||||||
|
*/
|
||||||
|
virtual bool isRequired() const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets _required to true. This is used by the XorHandler.
|
||||||
|
* You really have no reason to ever use it.
|
||||||
|
*/
|
||||||
|
void forceRequired();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the _alreadySet value to true. This is used by the XorHandler.
|
||||||
|
* You really have no reason to ever use it.
|
||||||
|
*/
|
||||||
|
void xorSet();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Indicates whether a value must be specified for argument.
|
||||||
|
*/
|
||||||
|
bool isValueRequired() const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Indicates whether the argument has already been set. Only true
|
||||||
|
* if the arg has been matched on the command line.
|
||||||
|
*/
|
||||||
|
bool isSet() const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Indicates whether the argument can be ignored, if desired.
|
||||||
|
*/
|
||||||
|
bool isIgnoreable() const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A method that tests whether a string matches this argument.
|
||||||
|
* This is generally called by the processArg() method. This
|
||||||
|
* method could be re-implemented by a child to change how
|
||||||
|
* arguments are specified on the command line.
|
||||||
|
* \param s - The string to be compared to the flag/name to determine
|
||||||
|
* whether the arg matches.
|
||||||
|
*/
|
||||||
|
virtual bool argMatches( const std::wstring& s ) const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a simple string representation of the argument.
|
||||||
|
* Primarily for debugging.
|
||||||
|
*/
|
||||||
|
virtual std::wstring toString() const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a short ID for the usage.
|
||||||
|
* \param valueId - The value used in the id.
|
||||||
|
*/
|
||||||
|
virtual std::wstring shortID( const std::wstring& valueId = L"val" ) const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a long ID for the usage.
|
||||||
|
* \param valueId - The value used in the id.
|
||||||
|
*/
|
||||||
|
virtual std::wstring longID( const std::wstring& valueId = L"val" ) const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Trims a value off of the flag.
|
||||||
|
* \param flag - The string from which the flag and value will be
|
||||||
|
* trimmed. Contains the flag once the value has been trimmed.
|
||||||
|
* \param value - Where the value trimmed from the string will
|
||||||
|
* be stored.
|
||||||
|
*/
|
||||||
|
virtual void trimFlag( std::wstring& flag, std::wstring& value ) const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks whether a given string has blank chars, indicating that
|
||||||
|
* it is a combined SwitchArg. If so, return true, otherwise return
|
||||||
|
* false.
|
||||||
|
* \param s - string to be checked.
|
||||||
|
*/
|
||||||
|
bool _hasBlanks( const std::wstring& s ) const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the requireLabel. Used by XorHandler. You shouldnL't ever
|
||||||
|
* use this.
|
||||||
|
* \param s - Set the requireLabel to this value.
|
||||||
|
*/
|
||||||
|
void setRequireLabel( const std::wstring& s );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Used for MultiArgs and XorHandler to determine whether args
|
||||||
|
* can still be set.
|
||||||
|
*/
|
||||||
|
virtual bool allowMore();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Use by output classes to determine whether an Arg accepts
|
||||||
|
* multiple values.
|
||||||
|
*/
|
||||||
|
virtual bool acceptsMultipleValues();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clears the Arg object and allows it to be reused by new
|
||||||
|
* command lines.
|
||||||
|
*/
|
||||||
|
virtual void reset();
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Typedef of an Arg list iterator.
|
||||||
|
*/
|
||||||
|
typedef std::list<Arg*>::iterator ArgListIterator;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Typedef of an Arg vector iterator.
|
||||||
|
*/
|
||||||
|
typedef std::vector<Arg*>::iterator ArgVectorIterator;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Typedef of a Visitor list iterator.
|
||||||
|
*/
|
||||||
|
typedef std::list<Visitor*>::iterator VisitorListIterator;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Extract a value of type T from it's string representation contained
|
||||||
|
* in strVal. The ValueLike parameter used to select the correct
|
||||||
|
* specialization of ExtractValue depending on the value traits of T.
|
||||||
|
* ValueLike traits use operator>> to assign the value from strVal.
|
||||||
|
*/
|
||||||
|
template<typename T> void
|
||||||
|
ExtractValue(T &destVal, const std::wstring& strVal, ValueLike vl)
|
||||||
|
{
|
||||||
|
static_cast<void>(vl); // Avoid warning about unused vl
|
||||||
|
std::wistringstream is(strVal);
|
||||||
|
|
||||||
|
int valuesRead = 0;
|
||||||
|
while ( is.good() ) {
|
||||||
|
if ( is.peek() != EOF )
|
||||||
|
#ifdef TCLAP_SETBASE_ZERO
|
||||||
|
is >> std::setbase(0) >> destVal;
|
||||||
|
#else
|
||||||
|
is >> destVal;
|
||||||
|
#endif
|
||||||
|
else
|
||||||
|
break;
|
||||||
|
|
||||||
|
valuesRead++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( is.fail() )
|
||||||
|
throw( ArgParseException(L"Couldn't read argument value "
|
||||||
|
L"from string '" + strVal + L"'"));
|
||||||
|
|
||||||
|
|
||||||
|
if ( valuesRead > 1 )
|
||||||
|
throw( ArgParseException(L"More than one valid value parsed from "
|
||||||
|
L"string '" + strVal + L"'"));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Extract a value of type T from itL's string representation contained
|
||||||
|
* in strVal. The ValueLike parameter used to select the correct
|
||||||
|
* specialization of ExtractValue depending on the value traits of T.
|
||||||
|
* StringLike uses assignment (operator=) to assign from strVal.
|
||||||
|
*/
|
||||||
|
template<typename T> void
|
||||||
|
ExtractValue(T &destVal, const std::wstring& strVal, StringLike sl)
|
||||||
|
{
|
||||||
|
static_cast<void>(sl); // Avoid warning about unused sl
|
||||||
|
SetString(destVal, strVal);
|
||||||
|
}
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////
|
||||||
|
//BEGIN Arg.cpp
|
||||||
|
//////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
inline Arg::Arg(const std::wstring& flag,
|
||||||
|
const std::wstring& name,
|
||||||
|
const std::wstring& desc,
|
||||||
|
bool req,
|
||||||
|
bool valreq,
|
||||||
|
Visitor* v) :
|
||||||
|
_flag(flag),
|
||||||
|
_name(name),
|
||||||
|
_description(desc),
|
||||||
|
_required(req),
|
||||||
|
_requireLabel(L"required"),
|
||||||
|
_valueRequired(valreq),
|
||||||
|
_alreadySet(false),
|
||||||
|
_visitor( v ),
|
||||||
|
_ignoreable(true),
|
||||||
|
_xorSet(false),
|
||||||
|
_acceptsMultipleValues(false)
|
||||||
|
{
|
||||||
|
if ( _flag.length() > 1 )
|
||||||
|
throw(SpecificationException(
|
||||||
|
L"Argument flag can only be one character long", toString() ) );
|
||||||
|
|
||||||
|
if ( _name != ignoreNameString() &&
|
||||||
|
( _flag == Arg::flagStartString() ||
|
||||||
|
_flag == Arg::nameStartString() ||
|
||||||
|
_flag == L" " ) )
|
||||||
|
throw(SpecificationException(L"Argument flag cannot be either '" +
|
||||||
|
Arg::flagStartString() + L"' or '" +
|
||||||
|
Arg::nameStartString() + L"' or a space.",
|
||||||
|
toString() ) );
|
||||||
|
|
||||||
|
if ( ( _name.substr( 0, Arg::flagStartString().length() ) == Arg::flagStartString() ) ||
|
||||||
|
( _name.substr( 0, Arg::nameStartString().length() ) == Arg::nameStartString() ) ||
|
||||||
|
( _name.find(L" ", 0 ) != std::wstring::npos ) )
|
||||||
|
throw(SpecificationException(L"Argument name begin with either '" +
|
||||||
|
Arg::flagStartString() + L"' or '" +
|
||||||
|
Arg::nameStartString() + L"' or space.",
|
||||||
|
toString() ) );
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
inline Arg::~Arg() { }
|
||||||
|
|
||||||
|
inline std::wstring Arg::shortID( const std::wstring& valueId ) const
|
||||||
|
{
|
||||||
|
std::wstring id = L"";
|
||||||
|
|
||||||
|
if ( _flag != L"" )
|
||||||
|
id = Arg::flagStartString() + _flag;
|
||||||
|
else
|
||||||
|
id = Arg::nameStartString() + _name;
|
||||||
|
|
||||||
|
if ( _valueRequired )
|
||||||
|
id += std::wstring( 1, Arg::delimiter() ) + L"<" + valueId + L">";
|
||||||
|
|
||||||
|
if ( !_required )
|
||||||
|
id = L"[" + id + L"]";
|
||||||
|
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline std::wstring Arg::longID( const std::wstring& valueId ) const
|
||||||
|
{
|
||||||
|
std::wstring id = L"";
|
||||||
|
|
||||||
|
if ( _flag != L"" )
|
||||||
|
{
|
||||||
|
id += Arg::flagStartString() + _flag;
|
||||||
|
|
||||||
|
if ( _valueRequired )
|
||||||
|
id += std::wstring( 1, Arg::delimiter() ) + L"<" + valueId + L">";
|
||||||
|
|
||||||
|
id += L", ";
|
||||||
|
}
|
||||||
|
|
||||||
|
id += Arg::nameStartString() + _name;
|
||||||
|
|
||||||
|
if ( _valueRequired )
|
||||||
|
id += std::wstring( 1, Arg::delimiter() ) + L"<" + valueId + L">";
|
||||||
|
|
||||||
|
return id;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool Arg::operator==(const Arg& a) const
|
||||||
|
{
|
||||||
|
if ( ( _flag != L"" && _flag == a._flag ) || _name == a._name)
|
||||||
|
return true;
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline std::wstring Arg::getDescription() const
|
||||||
|
{
|
||||||
|
std::wstring desc = L"";
|
||||||
|
if ( _required )
|
||||||
|
desc = L"(" + _requireLabel + L") ";
|
||||||
|
|
||||||
|
// if ( _valueRequired )
|
||||||
|
// desc += "(value required) L";
|
||||||
|
|
||||||
|
desc += _description;
|
||||||
|
return desc;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline const std::wstring& Arg::getFlag() const { return _flag; }
|
||||||
|
|
||||||
|
inline const std::wstring& Arg::getName() const { return _name; }
|
||||||
|
|
||||||
|
inline bool Arg::isRequired() const { return _required; }
|
||||||
|
|
||||||
|
inline bool Arg::isValueRequired() const { return _valueRequired; }
|
||||||
|
|
||||||
|
inline bool Arg::isSet() const
|
||||||
|
{
|
||||||
|
if ( _alreadySet && !_xorSet )
|
||||||
|
return true;
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool Arg::isIgnoreable() const { return _ignoreable; }
|
||||||
|
|
||||||
|
inline void Arg::setRequireLabel( const std::wstring& s)
|
||||||
|
{
|
||||||
|
_requireLabel = s;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool Arg::argMatches( const std::wstring& argFlag ) const
|
||||||
|
{
|
||||||
|
if ( ( argFlag == Arg::flagStartString() + _flag && _flag != L"" ) ||
|
||||||
|
argFlag == Arg::nameStartString() + _name )
|
||||||
|
return true;
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline std::wstring Arg::toString() const
|
||||||
|
{
|
||||||
|
std::wstring s = L"";
|
||||||
|
|
||||||
|
if ( _flag != L"" )
|
||||||
|
s += Arg::flagStartString() + _flag + L" ";
|
||||||
|
|
||||||
|
s += L"(" + Arg::nameStartString() + _name + L")";
|
||||||
|
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void Arg::_checkWithVisitor() const
|
||||||
|
{
|
||||||
|
if ( _visitor != NULL )
|
||||||
|
_visitor->visit();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Implementation of trimFlag.
|
||||||
|
*/
|
||||||
|
inline void Arg::trimFlag(std::wstring& flag, std::wstring& value) const
|
||||||
|
{
|
||||||
|
int stop = 0;
|
||||||
|
for ( int i = 0; static_cast<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.
|
||||||
|
*/
|
||||||
|
inline bool Arg::_hasBlanks( const std::wstring& s ) const
|
||||||
|
{
|
||||||
|
for ( int i = 1; static_cast<unsigned int>(i) < s.length(); i++ )
|
||||||
|
if ( s[i] == Arg::blankChar() )
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void Arg::forceRequired()
|
||||||
|
{
|
||||||
|
_required = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void Arg::xorSet()
|
||||||
|
{
|
||||||
|
_alreadySet = true;
|
||||||
|
_xorSet = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Overridden by Args that need to added to the end of the list.
|
||||||
|
*/
|
||||||
|
inline void Arg::addToList( std::list<Arg*>& argList ) const
|
||||||
|
{
|
||||||
|
argList.push_front( const_cast<Arg*>(this) );
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool Arg::allowMore()
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool Arg::acceptsMultipleValues()
|
||||||
|
{
|
||||||
|
return _acceptsMultipleValues;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void Arg::reset()
|
||||||
|
{
|
||||||
|
_xorSet = false;
|
||||||
|
_alreadySet = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////
|
||||||
|
//END Arg.cpp
|
||||||
|
//////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
} //namespace TCLAP
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
203
include/tclapw/ArgException.h
Normal file
203
include/tclapw/ArgException.h
Normal file
@ -0,0 +1,203 @@
|
|||||||
|
// -*- Mode: c++; c-basic-offset: 4; tab-width: 4; -*-
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
*
|
||||||
|
* file: ArgException.h
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef TCLAP_ARG_EXCEPTION_H
|
||||||
|
#define TCLAP_ARG_EXCEPTION_H
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <exception>
|
||||||
|
|
||||||
|
namespace TCLAP {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A simple class that defines and argument exception. Should be caught
|
||||||
|
* whenever a CmdLine is created and parsed.
|
||||||
|
*/
|
||||||
|
class ArgException : public std::exception
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor.
|
||||||
|
* \param text - The text of the exception.
|
||||||
|
* \param id - The text identifying the argument source.
|
||||||
|
* \param td - Text describing the type of ArgException it is.
|
||||||
|
* of the exception.
|
||||||
|
*/
|
||||||
|
ArgException( const std::wstring& text = L"undefined exception",
|
||||||
|
const std::wstring& id = L"undefined",
|
||||||
|
const std::wstring& td = L"Generic ArgException")
|
||||||
|
: std::exception(),
|
||||||
|
_errorText(text),
|
||||||
|
_argId( id ),
|
||||||
|
_typeDescription(td)
|
||||||
|
{ }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Destructor.
|
||||||
|
*/
|
||||||
|
virtual ~ArgException() throw() { }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the error text.
|
||||||
|
*/
|
||||||
|
std::wstring error() const { return ( _errorText ); }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the argument id.
|
||||||
|
*/
|
||||||
|
std::wstring argId() const
|
||||||
|
{
|
||||||
|
if ( _argId == L"undefined" )
|
||||||
|
return L" ";
|
||||||
|
else
|
||||||
|
return ( L"Argument: " + _argId );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the arg id and error text.
|
||||||
|
*/
|
||||||
|
const char* what() const throw()
|
||||||
|
{
|
||||||
|
static std::wstring ex;
|
||||||
|
ex = _argId + L" -- " + _errorText;
|
||||||
|
//return ex.c_str();
|
||||||
|
|
||||||
|
// TODO:
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the type of the exception. Used to explain and distinguish
|
||||||
|
* between different child exceptions.
|
||||||
|
*/
|
||||||
|
std::wstring typeDescription() const
|
||||||
|
{
|
||||||
|
return _typeDescription;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The text of the exception message.
|
||||||
|
*/
|
||||||
|
std::wstring _errorText;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The argument related to this exception.
|
||||||
|
*/
|
||||||
|
std::wstring _argId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Describes the type of the exception. Used to distinguish
|
||||||
|
* between different child exceptions.
|
||||||
|
*/
|
||||||
|
std::wstring _typeDescription;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Thrown from within the child Arg classes when it fails to properly
|
||||||
|
* parse the argument it has been passed.
|
||||||
|
*/
|
||||||
|
class ArgParseException : public ArgException
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/**
|
||||||
|
* Constructor.
|
||||||
|
* \param text - The text of the exception.
|
||||||
|
* \param id - The text identifying the argument source
|
||||||
|
* of the exception.
|
||||||
|
*/
|
||||||
|
ArgParseException( const std::wstring& text = L"undefined exception",
|
||||||
|
const std::wstring& id = L"undefined" )
|
||||||
|
: ArgException( text,
|
||||||
|
id,
|
||||||
|
std::wstring( L"Exception found while parsing " ) +
|
||||||
|
std::wstring( L"the value the Arg has been passed." ))
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Thrown from CmdLine when the arguments on the command line are not
|
||||||
|
* properly specified, e.g. too many arguments, required argument missing, etc.
|
||||||
|
*/
|
||||||
|
class CmdLineParseException : public ArgException
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/**
|
||||||
|
* Constructor.
|
||||||
|
* \param text - The text of the exception.
|
||||||
|
* \param id - The text identifying the argument source
|
||||||
|
* of the exception.
|
||||||
|
*/
|
||||||
|
CmdLineParseException( const std::wstring& text = L"undefined exception",
|
||||||
|
const std::wstring& id = L"undefined" )
|
||||||
|
: ArgException( text,
|
||||||
|
id,
|
||||||
|
std::wstring( L"Exception found when the values ") +
|
||||||
|
std::wstring( L"on the command line do not meet ") +
|
||||||
|
std::wstring( L"the requirements of the defined ") +
|
||||||
|
std::wstring( L"Args." ))
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Thrown from Arg and CmdLine when an Arg is improperly specified, e.g.
|
||||||
|
* same flag as another Arg, same name, etc.
|
||||||
|
*/
|
||||||
|
class SpecificationException : public ArgException
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/**
|
||||||
|
* Constructor.
|
||||||
|
* \param text - The text of the exception.
|
||||||
|
* \param id - The text identifying the argument source
|
||||||
|
* of the exception.
|
||||||
|
*/
|
||||||
|
SpecificationException( const std::wstring& text = L"undefined exception",
|
||||||
|
const std::wstring& id = L"undefined" )
|
||||||
|
: ArgException( text,
|
||||||
|
id,
|
||||||
|
std::wstring(L"Exception found when an Arg object ")+
|
||||||
|
std::wstring(L"is improperly defined by the ") +
|
||||||
|
std::wstring(L"developer." ))
|
||||||
|
{ }
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
class ExitException {
|
||||||
|
public:
|
||||||
|
ExitException(int estat) : _estat(estat) {}
|
||||||
|
|
||||||
|
int getExitStatus() const { return _estat; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
int _estat;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace TCLAP
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
87
include/tclapw/ArgTraits.h
Normal file
87
include/tclapw/ArgTraits.h
Normal file
@ -0,0 +1,87 @@
|
|||||||
|
// -*- Mode: c++; c-basic-offset: 4; tab-width: 4; -*-
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
*
|
||||||
|
* file: ArgTraits.h
|
||||||
|
*
|
||||||
|
* Copyright (c) 2007, Daniel Aarno, 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.
|
||||||
|
*
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
// This is an internal tclapw file, you should probably not have to
|
||||||
|
// include this directly
|
||||||
|
|
||||||
|
#ifndef TCLAP_ARGTRAITS_H
|
||||||
|
#define TCLAP_ARGTRAITS_H
|
||||||
|
|
||||||
|
namespace TCLAP {
|
||||||
|
|
||||||
|
// We use two empty structs to get compile type specialization
|
||||||
|
// function to work
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A value like argument value type is a value that can be set using
|
||||||
|
* operator>>. This is the default value type.
|
||||||
|
*/
|
||||||
|
struct ValueLike {
|
||||||
|
typedef ValueLike ValueCategory;
|
||||||
|
virtual ~ValueLike() {}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A string like argument value type is a value that can be set using
|
||||||
|
* operator=(string). Usefull if the value type contains spaces which
|
||||||
|
* will be broken up into individual tokens by operator>>.
|
||||||
|
*/
|
||||||
|
struct StringLike {
|
||||||
|
virtual ~StringLike() {}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A class can inherit from this object to make it have string like
|
||||||
|
* traits. This is a compile time thing and does not add any overhead
|
||||||
|
* to the inherenting class.
|
||||||
|
*/
|
||||||
|
struct StringLikeTrait {
|
||||||
|
typedef StringLike ValueCategory;
|
||||||
|
virtual ~StringLikeTrait() {}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A class can inherit from this object to make it have value like
|
||||||
|
* traits. This is a compile time thing and does not add any overhead
|
||||||
|
* to the inherenting class.
|
||||||
|
*/
|
||||||
|
struct ValueLikeTrait {
|
||||||
|
typedef ValueLike ValueCategory;
|
||||||
|
virtual ~ValueLikeTrait() {}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Arg traits are used to get compile type specialization when parsing
|
||||||
|
* argument values. Using an ArgTraits you can specify the way that
|
||||||
|
* values gets assigned to any particular type during parsing. The two
|
||||||
|
* supported types are StringLike and ValueLike.
|
||||||
|
*/
|
||||||
|
template<typename T>
|
||||||
|
struct ArgTraits {
|
||||||
|
typedef typename T::ValueCategory ValueCategory;
|
||||||
|
virtual ~ArgTraits() {}
|
||||||
|
//typedef ValueLike ValueCategory;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
} // namespace
|
633
include/tclapw/CmdLine.h
Normal file
633
include/tclapw/CmdLine.h
Normal file
@ -0,0 +1,633 @@
|
|||||||
|
// -*- Mode: c++; c-basic-offset: 4; tab-width: 4; -*-
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
*
|
||||||
|
* file: CmdLine.h
|
||||||
|
*
|
||||||
|
* Copyright (c) 2003, Michael E. Smoot .
|
||||||
|
* Copyright (c) 2004, Michael E. Smoot, Daniel Aarno.
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
#ifndef TCLAP_CMDLINE_H
|
||||||
|
#define TCLAP_CMDLINE_H
|
||||||
|
|
||||||
|
#include <tclapw/SwitchArg.h>
|
||||||
|
#include <tclapw/MultiSwitchArg.h>
|
||||||
|
#include <tclapw/UnlabeledValueArg.h>
|
||||||
|
#include <tclapw/UnlabeledMultiArg.h>
|
||||||
|
|
||||||
|
#include <tclapw/XorHandler.h>
|
||||||
|
#include <tclapw/HelpVisitor.h>
|
||||||
|
#include <tclapw/VersionVisitor.h>
|
||||||
|
#include <tclapw/IgnoreRestVisitor.h>
|
||||||
|
|
||||||
|
#include <tclapw/CmdLineOutput.h>
|
||||||
|
#include <tclapw/StdOutput.h>
|
||||||
|
|
||||||
|
#include <tclapw/Constraint.h>
|
||||||
|
#include <tclapw/ValuesConstraint.h>
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
#include <list>
|
||||||
|
#include <iostream>
|
||||||
|
#include <iomanip>
|
||||||
|
#include <algorithm>
|
||||||
|
#include <stdlib.h> // Needed for exit(), which isnL't defined in some envs.
|
||||||
|
|
||||||
|
namespace TCLAP {
|
||||||
|
|
||||||
|
template<typename T> void DelPtr(T ptr)
|
||||||
|
{
|
||||||
|
delete ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename C> void ClearContainer(C &c)
|
||||||
|
{
|
||||||
|
typedef typename C::value_type value_type;
|
||||||
|
std::for_each(c.begin(), c.end(), DelPtr<value_type>);
|
||||||
|
c.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The base class that manages the command line definition and passes
|
||||||
|
* along the parsing to the appropriate Arg classes.
|
||||||
|
*/
|
||||||
|
class CmdLine : public CmdLineInterface
|
||||||
|
{
|
||||||
|
protected:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The list of arguments that will be tested against the
|
||||||
|
* command line.
|
||||||
|
*/
|
||||||
|
std::list<Arg*> _argList;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The name of the program. Set to argv[0].
|
||||||
|
*/
|
||||||
|
std::wstring _progName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A message used to describe the program. Used in the usage output.
|
||||||
|
*/
|
||||||
|
std::wstring _message;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The version to be displayed with the --version switch.
|
||||||
|
*/
|
||||||
|
std::wstring _version;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The number of arguments that are required to be present on
|
||||||
|
* the command line. This is set dynamically, based on the
|
||||||
|
* Args added to the CmdLine object.
|
||||||
|
*/
|
||||||
|
int _numRequired;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The character that is used to separate the argument flag/name
|
||||||
|
* from the value. Defaults to ' L' (space).
|
||||||
|
*/
|
||||||
|
wchar_t _delimiter;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The handler that manages xoring lists of args.
|
||||||
|
*/
|
||||||
|
XorHandler _xorHandler;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A list of Args to be explicitly deleted when the destructor
|
||||||
|
* is called. At the moment, this only includes the three default
|
||||||
|
* Args.
|
||||||
|
*/
|
||||||
|
std::list<Arg*> _argDeleteOnExitList;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A list of Visitors to be explicitly deleted when the destructor
|
||||||
|
* is called. At the moment, these are the Vistors created for the
|
||||||
|
* default Args.
|
||||||
|
*/
|
||||||
|
std::list<Visitor*> _visitorDeleteOnExitList;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Object that handles all output for the CmdLine.
|
||||||
|
*/
|
||||||
|
CmdLineOutput* _output;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Should CmdLine handle parsing exceptions internally?
|
||||||
|
*/
|
||||||
|
bool _handleExceptions;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Throws an exception listing the missing args.
|
||||||
|
*/
|
||||||
|
void missingArgsException();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks whether a name/flag string matches entirely matches
|
||||||
|
* the Arg::blankChar. Used when multiple switches are combined
|
||||||
|
* into a single argument.
|
||||||
|
* \param s - The message to be used in the usage.
|
||||||
|
*/
|
||||||
|
bool _emptyCombined(const std::wstring& s);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Perform a delete ptr; operation on ptr when this object is deleted.
|
||||||
|
*/
|
||||||
|
void deleteOnExit(Arg* ptr);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Perform a delete ptr; operation on ptr when this object is deleted.
|
||||||
|
*/
|
||||||
|
void deleteOnExit(Visitor* ptr);
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prevent accidental copying.
|
||||||
|
*/
|
||||||
|
CmdLine(const CmdLine& rhs);
|
||||||
|
CmdLine& operator=(const CmdLine& rhs);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Encapsulates the code common to the constructors
|
||||||
|
* (which is all of it).
|
||||||
|
*/
|
||||||
|
void _constructor();
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Is set to true when a user sets the output object. We use this so
|
||||||
|
* that we don't delete objects that are created outside of this lib.
|
||||||
|
*/
|
||||||
|
bool _userSetOutput;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Whether or not to automatically create help and version switches.
|
||||||
|
*/
|
||||||
|
bool _helpAndVersion;
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Command line constructor. Defines how the arguments will be
|
||||||
|
* parsed.
|
||||||
|
* \param message - The message to be used in the usage
|
||||||
|
* output.
|
||||||
|
* \param delimiter - The character that is used to separate
|
||||||
|
* the argument flag/name from the value. Defaults to L' ' (space).
|
||||||
|
* \param version - The version number to be used in the
|
||||||
|
* --version switch.
|
||||||
|
* \param helpAndVersion - Whether or not to create the Help and
|
||||||
|
* Version switches. Defaults to true.
|
||||||
|
*/
|
||||||
|
CmdLine(const std::wstring& message,
|
||||||
|
const wchar_t delimiter = L' ',
|
||||||
|
const std::wstring& version = L"none",
|
||||||
|
bool helpAndVersion = true);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deletes any resources allocated by a CmdLine object.
|
||||||
|
*/
|
||||||
|
virtual ~CmdLine();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds an argument to the list of arguments to be parsed.
|
||||||
|
* \param a - Argument to be added.
|
||||||
|
*/
|
||||||
|
void add( Arg& a );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An alternative add. Functionally identical.
|
||||||
|
* \param a - Argument to be added.
|
||||||
|
*/
|
||||||
|
void add( Arg* a );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add two Args that will be xorL'd. If this method is used, add does
|
||||||
|
* not need to be called.
|
||||||
|
* \param a - Argument to be added and xor'd.
|
||||||
|
* \param b - Argument to be added and xorL'd.
|
||||||
|
*/
|
||||||
|
void xorAdd( Arg& a, Arg& b );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a list of Args that will be xor'd. If this method is used,
|
||||||
|
* add does not need to be called.
|
||||||
|
* \param xors - List of Args to be added and xorL'd.
|
||||||
|
*/
|
||||||
|
void xorAdd( std::vector<Arg*>& xors );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parses the command line.
|
||||||
|
* \param argc - Number of arguments.
|
||||||
|
* \param argv - Array of arguments.
|
||||||
|
*/
|
||||||
|
void parse(int argc, const wchar_t * const * argv);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parses the command line.
|
||||||
|
* \param args - A vector of strings representing the args.
|
||||||
|
* args[0] is still the program name.
|
||||||
|
*/
|
||||||
|
void parse(std::vector<std::wstring>& args);
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
CmdLineOutput* getOutput();
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void setOutput(CmdLineOutput* co);
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
std::wstring& getVersion();
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
std::wstring& getProgramName();
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
std::list<Arg*>& getArgList();
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
XorHandler& getXorHandler();
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
wchar_t getDelimiter();
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
std::wstring& getMessage();
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
bool hasHelpAndVersion();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Disables or enables CmdLine's internal parsing exception handling.
|
||||||
|
*
|
||||||
|
* @param state Should CmdLine handle parsing exceptions internally?
|
||||||
|
*/
|
||||||
|
void setExceptionHandling(const bool state);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the current state of the internal exception handling.
|
||||||
|
*
|
||||||
|
* @retval true Parsing exceptions are handled internally.
|
||||||
|
* @retval false Parsing exceptions are propagated to the caller.
|
||||||
|
*/
|
||||||
|
bool getExceptionHandling() const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allows the CmdLine object to be reused.
|
||||||
|
*/
|
||||||
|
void reset();
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
//Begin CmdLine.cpp
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
inline CmdLine::CmdLine(const std::wstring& m,
|
||||||
|
wchar_t delim,
|
||||||
|
const std::wstring& v,
|
||||||
|
bool help )
|
||||||
|
:
|
||||||
|
_argList(std::list<Arg*>()),
|
||||||
|
_progName(L"not_set_yet"),
|
||||||
|
_message(m),
|
||||||
|
_version(v),
|
||||||
|
_numRequired(0),
|
||||||
|
_delimiter(delim),
|
||||||
|
_xorHandler(XorHandler()),
|
||||||
|
_argDeleteOnExitList(std::list<Arg*>()),
|
||||||
|
_visitorDeleteOnExitList(std::list<Visitor*>()),
|
||||||
|
_output(0),
|
||||||
|
_handleExceptions(true),
|
||||||
|
_userSetOutput(false),
|
||||||
|
_helpAndVersion(help)
|
||||||
|
{
|
||||||
|
_constructor();
|
||||||
|
}
|
||||||
|
|
||||||
|
inline CmdLine::~CmdLine()
|
||||||
|
{
|
||||||
|
ClearContainer(_argDeleteOnExitList);
|
||||||
|
ClearContainer(_visitorDeleteOnExitList);
|
||||||
|
|
||||||
|
if ( !_userSetOutput ) {
|
||||||
|
delete _output;
|
||||||
|
_output = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void CmdLine::_constructor()
|
||||||
|
{
|
||||||
|
_output = new StdOutput;
|
||||||
|
|
||||||
|
Arg::setDelimiter( _delimiter );
|
||||||
|
|
||||||
|
Visitor* v;
|
||||||
|
|
||||||
|
if ( _helpAndVersion )
|
||||||
|
{
|
||||||
|
v = new HelpVisitor( this, &_output );
|
||||||
|
SwitchArg* help = new SwitchArg(L"?",L"help",
|
||||||
|
L"Displays usage information and exits.",
|
||||||
|
false, v);
|
||||||
|
add( help );
|
||||||
|
deleteOnExit(help);
|
||||||
|
deleteOnExit(v);
|
||||||
|
|
||||||
|
v = new VersionVisitor( this, &_output );
|
||||||
|
SwitchArg* vers = new SwitchArg(L"",L"version",
|
||||||
|
L"Displays version information and exits.",
|
||||||
|
false, v);
|
||||||
|
add( vers );
|
||||||
|
deleteOnExit(vers);
|
||||||
|
deleteOnExit(v);
|
||||||
|
}
|
||||||
|
|
||||||
|
v = new IgnoreRestVisitor();
|
||||||
|
SwitchArg* ignore = new SwitchArg(Arg::flagStartString(),
|
||||||
|
Arg::ignoreNameString(),
|
||||||
|
L"Ignores the rest of the labeled arguments following this flag.",
|
||||||
|
false, v);
|
||||||
|
add( ignore );
|
||||||
|
deleteOnExit(ignore);
|
||||||
|
deleteOnExit(v);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void CmdLine::xorAdd( std::vector<Arg*>& ors )
|
||||||
|
{
|
||||||
|
_xorHandler.add( ors );
|
||||||
|
|
||||||
|
for (ArgVectorIterator it = ors.begin(); it != ors.end(); it++)
|
||||||
|
{
|
||||||
|
(*it)->forceRequired();
|
||||||
|
(*it)->setRequireLabel( L"OR required" );
|
||||||
|
add( *it );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void CmdLine::xorAdd( Arg& a, Arg& b )
|
||||||
|
{
|
||||||
|
std::vector<Arg*> ors;
|
||||||
|
ors.push_back( &a );
|
||||||
|
ors.push_back( &b );
|
||||||
|
xorAdd( ors );
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void CmdLine::add( Arg& a )
|
||||||
|
{
|
||||||
|
add( &a );
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void CmdLine::add( Arg* a )
|
||||||
|
{
|
||||||
|
for( ArgListIterator it = _argList.begin(); it != _argList.end(); it++ )
|
||||||
|
if ( *a == *(*it) )
|
||||||
|
throw( SpecificationException(
|
||||||
|
L"Argument with same flag/name already exists!",
|
||||||
|
a->longID() ) );
|
||||||
|
|
||||||
|
a->addToList( _argList );
|
||||||
|
|
||||||
|
if ( a->isRequired() )
|
||||||
|
_numRequired++;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline void CmdLine::parse(int argc, const wchar_t * const * argv)
|
||||||
|
{
|
||||||
|
// this step is necessary so that we have easy access to
|
||||||
|
// mutable strings.
|
||||||
|
std::vector<std::wstring> args;
|
||||||
|
for (int i = 0; i < argc; i++)
|
||||||
|
args.push_back(argv[i]);
|
||||||
|
|
||||||
|
parse(args);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void CmdLine::parse(std::vector<std::wstring>& args)
|
||||||
|
{
|
||||||
|
bool shouldExit = false;
|
||||||
|
int estat = 0;
|
||||||
|
|
||||||
|
try {
|
||||||
|
_progName = args.front();
|
||||||
|
args.erase(args.begin());
|
||||||
|
|
||||||
|
int requiredCount = 0;
|
||||||
|
|
||||||
|
for (int i = 0; static_cast<unsigned int>(i) < args.size(); i++)
|
||||||
|
{
|
||||||
|
bool matched = false;
|
||||||
|
for (ArgListIterator 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 weL've actually matched it
|
||||||
|
if ( !matched && _emptyCombined( args[i] ) )
|
||||||
|
matched = true;
|
||||||
|
|
||||||
|
if ( !matched && !Arg::ignoreRest() && !Arg::ignoreMismatched() )
|
||||||
|
throw(CmdLineParseException(L"Couldn't find match "
|
||||||
|
L"for argument",
|
||||||
|
args[i]));
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( requiredCount < _numRequired )
|
||||||
|
missingArgsException();
|
||||||
|
|
||||||
|
if ( requiredCount > _numRequired )
|
||||||
|
throw(CmdLineParseException(L"Too many arguments!"));
|
||||||
|
|
||||||
|
} catch ( ArgException& e ) {
|
||||||
|
// If we're not handling the exceptions, rethrow.
|
||||||
|
if ( !_handleExceptions) {
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
_output->failure(*this,e);
|
||||||
|
} catch ( ExitException &ee ) {
|
||||||
|
estat = ee.getExitStatus();
|
||||||
|
shouldExit = true;
|
||||||
|
}
|
||||||
|
} catch (ExitException &ee) {
|
||||||
|
// If we're not handling the exceptions, rethrow.
|
||||||
|
if ( !_handleExceptions) {
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
|
||||||
|
estat = ee.getExitStatus();
|
||||||
|
shouldExit = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (shouldExit)
|
||||||
|
exit(estat);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool CmdLine::_emptyCombined(const std::wstring& s)
|
||||||
|
{
|
||||||
|
if ( s.length() > 0 && s[0] != Arg::flagStartChar() )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
for ( int i = 1; static_cast<unsigned int>(i) < s.length(); i++ )
|
||||||
|
if ( s[i] != Arg::blankChar() )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void CmdLine::missingArgsException()
|
||||||
|
{
|
||||||
|
int count = 0;
|
||||||
|
|
||||||
|
std::wstring missingArgList;
|
||||||
|
for (ArgListIterator it = _argList.begin(); it != _argList.end(); it++)
|
||||||
|
{
|
||||||
|
if ( (*it)->isRequired() && !(*it)->isSet() )
|
||||||
|
{
|
||||||
|
missingArgList += (*it)->getName();
|
||||||
|
missingArgList += L", ";
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
missingArgList = missingArgList.substr(0,missingArgList.length()-2);
|
||||||
|
|
||||||
|
std::wstring msg;
|
||||||
|
if ( count > 1 )
|
||||||
|
msg = L"Required arguments missing: ";
|
||||||
|
else
|
||||||
|
msg = L"Required argument missing: ";
|
||||||
|
|
||||||
|
msg += missingArgList;
|
||||||
|
|
||||||
|
throw(CmdLineParseException(msg));
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void CmdLine::deleteOnExit(Arg* ptr)
|
||||||
|
{
|
||||||
|
_argDeleteOnExitList.push_back(ptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void CmdLine::deleteOnExit(Visitor* ptr)
|
||||||
|
{
|
||||||
|
_visitorDeleteOnExitList.push_back(ptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline CmdLineOutput* CmdLine::getOutput()
|
||||||
|
{
|
||||||
|
return _output;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void CmdLine::setOutput(CmdLineOutput* co)
|
||||||
|
{
|
||||||
|
if ( !_userSetOutput )
|
||||||
|
delete _output;
|
||||||
|
_userSetOutput = true;
|
||||||
|
_output = co;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline std::wstring& CmdLine::getVersion()
|
||||||
|
{
|
||||||
|
return _version;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline std::wstring& CmdLine::getProgramName()
|
||||||
|
{
|
||||||
|
return _progName;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline std::list<Arg*>& CmdLine::getArgList()
|
||||||
|
{
|
||||||
|
return _argList;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline XorHandler& CmdLine::getXorHandler()
|
||||||
|
{
|
||||||
|
return _xorHandler;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline wchar_t CmdLine::getDelimiter()
|
||||||
|
{
|
||||||
|
return _delimiter;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline std::wstring& CmdLine::getMessage()
|
||||||
|
{
|
||||||
|
return _message;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool CmdLine::hasHelpAndVersion()
|
||||||
|
{
|
||||||
|
return _helpAndVersion;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void CmdLine::setExceptionHandling(const bool state)
|
||||||
|
{
|
||||||
|
_handleExceptions = state;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool CmdLine::getExceptionHandling() const
|
||||||
|
{
|
||||||
|
return _handleExceptions;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void CmdLine::reset()
|
||||||
|
{
|
||||||
|
for( ArgListIterator it = _argList.begin(); it != _argList.end(); it++ )
|
||||||
|
(*it)->reset();
|
||||||
|
|
||||||
|
_progName.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
//End CmdLine.cpp
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} //namespace TCLAP
|
||||||
|
#endif
|
150
include/tclapw/CmdLineInterface.h
Normal file
150
include/tclapw/CmdLineInterface.h
Normal file
@ -0,0 +1,150 @@
|
|||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
*
|
||||||
|
* file: CmdLineInterface.h
|
||||||
|
*
|
||||||
|
* Copyright (c) 2003, Michael E. Smoot .
|
||||||
|
* Copyright (c) 2004, Michael E. Smoot, Daniel Aarno.
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
#ifndef TCLAP_COMMANDLINE_INTERFACE_H
|
||||||
|
#define TCLAP_COMMANDLINE_INTERFACE_H
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
#include <list>
|
||||||
|
#include <iostream>
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
|
|
||||||
|
namespace TCLAP {
|
||||||
|
|
||||||
|
class Arg;
|
||||||
|
class CmdLineOutput;
|
||||||
|
class XorHandler;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The base class that manages the command line definition and passes
|
||||||
|
* along the parsing to the appropriate Arg classes.
|
||||||
|
*/
|
||||||
|
class CmdLineInterface
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Destructor
|
||||||
|
*/
|
||||||
|
virtual ~CmdLineInterface() {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds an argument to the list of arguments to be parsed.
|
||||||
|
* \param a - Argument to be added.
|
||||||
|
*/
|
||||||
|
virtual void add( Arg& a )=0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An alternative add. Functionally identical.
|
||||||
|
* \param a - Argument to be added.
|
||||||
|
*/
|
||||||
|
virtual void add( Arg* a )=0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add two Args that will be xorL'd.
|
||||||
|
* If this method is used, add does
|
||||||
|
* not need to be called.
|
||||||
|
* \param a - Argument to be added and xor'd.
|
||||||
|
* \param b - Argument to be added and xorL'd.
|
||||||
|
*/
|
||||||
|
virtual void xorAdd( Arg& a, Arg& b )=0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a list of Args that will be xor'd. If this method is used,
|
||||||
|
* add does not need to be called.
|
||||||
|
* \param xors - List of Args to be added and xor'd.
|
||||||
|
*/
|
||||||
|
virtual void xorAdd( std::vector<Arg*>& xors )=0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parses the command line.
|
||||||
|
* \param argc - Number of arguments.
|
||||||
|
* \param argv - Array of arguments.
|
||||||
|
*/
|
||||||
|
virtual void parse(int argc, const wchar_t * const * argv)=0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parses the command line.
|
||||||
|
* \param args - A vector of strings representing the args.
|
||||||
|
* args[0] is still the program name.
|
||||||
|
*/
|
||||||
|
void parse(std::vector<std::wstring>& args);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the CmdLineOutput object.
|
||||||
|
*/
|
||||||
|
virtual CmdLineOutput* getOutput()=0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \param co - CmdLineOutput object that we want to use instead.
|
||||||
|
*/
|
||||||
|
virtual void setOutput(CmdLineOutput* co)=0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the version string.
|
||||||
|
*/
|
||||||
|
virtual std::wstring& getVersion()=0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the program name string.
|
||||||
|
*/
|
||||||
|
virtual std::wstring& getProgramName()=0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the argList.
|
||||||
|
*/
|
||||||
|
virtual std::list<Arg*>& getArgList()=0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the XorHandler.
|
||||||
|
*/
|
||||||
|
virtual XorHandler& getXorHandler()=0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the delimiter string.
|
||||||
|
*/
|
||||||
|
virtual wchar_t getDelimiter()=0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the message string.
|
||||||
|
*/
|
||||||
|
virtual std::wstring& getMessage()=0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Indicates whether or not the help and version switches were created
|
||||||
|
* automatically.
|
||||||
|
*/
|
||||||
|
virtual bool hasHelpAndVersion()=0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Resets the instance as if it had just been constructed so that the
|
||||||
|
* instance can be reused.
|
||||||
|
*/
|
||||||
|
virtual void reset()=0;
|
||||||
|
};
|
||||||
|
|
||||||
|
} //namespace
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
74
include/tclapw/CmdLineOutput.h
Normal file
74
include/tclapw/CmdLineOutput.h
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
*
|
||||||
|
* file: CmdLineOutput.h
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
#ifndef TCLAP_CMDLINEOUTPUT_H
|
||||||
|
#define TCLAP_CMDLINEOUTPUT_H
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
#include <list>
|
||||||
|
#include <iostream>
|
||||||
|
#include <iomanip>
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
|
namespace TCLAP {
|
||||||
|
|
||||||
|
class CmdLineInterface;
|
||||||
|
class ArgException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The interface that any output object must implement.
|
||||||
|
*/
|
||||||
|
class CmdLineOutput
|
||||||
|
{
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Virtual destructor.
|
||||||
|
*/
|
||||||
|
virtual ~CmdLineOutput() {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generates some sort of output for the USAGE.
|
||||||
|
* \param c - The CmdLine object the output is generated for.
|
||||||
|
*/
|
||||||
|
virtual void usage(CmdLineInterface& c)=0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generates some sort of output for the version.
|
||||||
|
* \param c - The CmdLine object the output is generated for.
|
||||||
|
*/
|
||||||
|
virtual void version(CmdLineInterface& c)=0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generates some sort of output for a failure.
|
||||||
|
* \param c - The CmdLine object the output is generated for.
|
||||||
|
* \param e - The ArgException that caused the failure.
|
||||||
|
*/
|
||||||
|
virtual void failure( CmdLineInterface& c,
|
||||||
|
ArgException& e )=0;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
} //namespace TCLAP
|
||||||
|
#endif
|
68
include/tclapw/Constraint.h
Normal file
68
include/tclapw/Constraint.h
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
*
|
||||||
|
* file: Constraint.h
|
||||||
|
*
|
||||||
|
* Copyright (c) 2005, 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.
|
||||||
|
*
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
#ifndef TCLAP_CONSTRAINT_H
|
||||||
|
#define TCLAP_CONSTRAINT_H
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
#include <list>
|
||||||
|
#include <iostream>
|
||||||
|
#include <iomanip>
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
|
namespace TCLAP {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The interface that defines the interaction between the Arg and Constraint.
|
||||||
|
*/
|
||||||
|
template<class T>
|
||||||
|
class Constraint
|
||||||
|
{
|
||||||
|
|
||||||
|
public:
|
||||||
|
/**
|
||||||
|
* Returns a description of the Constraint.
|
||||||
|
*/
|
||||||
|
virtual std::wstring description() const =0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the short ID for the Constraint.
|
||||||
|
*/
|
||||||
|
virtual std::wstring shortID() const =0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The method used to verify that the value parsed from the command
|
||||||
|
* line meets the constraint.
|
||||||
|
* \param value - The value that will be checked.
|
||||||
|
*/
|
||||||
|
virtual bool check(const T& value) const =0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Destructor.
|
||||||
|
* Silences warnings about Constraint being a base class with virtual
|
||||||
|
* functions but without a virtual destructor.
|
||||||
|
*/
|
||||||
|
virtual ~Constraint() { ; }
|
||||||
|
};
|
||||||
|
|
||||||
|
} //namespace TCLAP
|
||||||
|
#endif
|
299
include/tclapw/DocBookOutput.h
Normal file
299
include/tclapw/DocBookOutput.h
Normal file
@ -0,0 +1,299 @@
|
|||||||
|
// -*- Mode: c++; c-basic-offset: 4; tab-width: 4; -*-
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
*
|
||||||
|
* file: DocBookOutput.h
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
#ifndef TCLAP_DOCBOOKOUTPUT_H
|
||||||
|
#define TCLAP_DOCBOOKOUTPUT_H
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
#include <list>
|
||||||
|
#include <iostream>
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
|
#include <tclapw/CmdLineInterface.h>
|
||||||
|
#include <tclapw/CmdLineOutput.h>
|
||||||
|
#include <tclapw/XorHandler.h>
|
||||||
|
#include <tclapw/Arg.h>
|
||||||
|
|
||||||
|
namespace TCLAP {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A class that generates DocBook output for usage() method for the
|
||||||
|
* given CmdLine and its Args.
|
||||||
|
*/
|
||||||
|
class DocBookOutput : public CmdLineOutput
|
||||||
|
{
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prints the usage to stdout. Can be overridden to
|
||||||
|
* produce alternative behavior.
|
||||||
|
* \param c - The CmdLine object the output is generated for.
|
||||||
|
*/
|
||||||
|
virtual void usage(CmdLineInterface& c);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prints the version to stdout. Can be overridden
|
||||||
|
* to produce alternative behavior.
|
||||||
|
* \param c - The CmdLine object the output is generated for.
|
||||||
|
*/
|
||||||
|
virtual void version(CmdLineInterface& c);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prints (to stderr) an error message, short usage
|
||||||
|
* Can be overridden to produce alternative behavior.
|
||||||
|
* \param c - The CmdLine object the output is generated for.
|
||||||
|
* \param e - The ArgException that caused the failure.
|
||||||
|
*/
|
||||||
|
virtual void failure(CmdLineInterface& c,
|
||||||
|
ArgException& e );
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Substitutes the wchar_t r for string x in string s.
|
||||||
|
* \param s - The string to operate on.
|
||||||
|
* \param r - The wchar_t to replace.
|
||||||
|
* \param x - What to replace r with.
|
||||||
|
*/
|
||||||
|
void substituteSpecialChars( std::wstring& s, wchar_t r, std::wstring& x );
|
||||||
|
void removeChar( std::wstring& s, wchar_t r);
|
||||||
|
void basename( std::wstring& s );
|
||||||
|
|
||||||
|
void printShortArg(Arg* it);
|
||||||
|
void printLongArg(Arg* it);
|
||||||
|
|
||||||
|
wchar_t theDelimiter;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
inline void DocBookOutput::version(CmdLineInterface& _cmd)
|
||||||
|
{
|
||||||
|
std::cout << _cmd.getVersion() << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void DocBookOutput::usage(CmdLineInterface& _cmd )
|
||||||
|
{
|
||||||
|
std::list<Arg*> argList = _cmd.getArgList();
|
||||||
|
std::wstring progName = _cmd.getProgramName();
|
||||||
|
std::wstring xversion = _cmd.getVersion();
|
||||||
|
theDelimiter = _cmd.getDelimiter();
|
||||||
|
XorHandler xorHandler = _cmd.getXorHandler();
|
||||||
|
std::vector< std::vector<Arg*> > xorList = xorHandler.getXorList();
|
||||||
|
basename(progName);
|
||||||
|
|
||||||
|
std::cout << L"<?xml version='1.0'?>" << std::endl;
|
||||||
|
std::cout << L"<!DOCTYPE refentry PUBLIC \"-//OASIS//DTD DocBook XML V4.2//EN\L"" << std::endl;
|
||||||
|
std::cout << L"\t\"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd\L">" << std::endl << std::endl;
|
||||||
|
|
||||||
|
std::cout << L"<refentry>" << std::endl;
|
||||||
|
|
||||||
|
std::cout << L"<refmeta>" << std::endl;
|
||||||
|
std::cout << L"<refentrytitle>" << progName << L"</refentrytitle>" << std::endl;
|
||||||
|
std::cout << L"<manvolnum>1</manvolnum>" << std::endl;
|
||||||
|
std::cout << L"</refmeta>" << std::endl;
|
||||||
|
|
||||||
|
std::cout << L"<refnamediv>" << std::endl;
|
||||||
|
std::cout << L"<refname>" << progName << L"</refname>" << std::endl;
|
||||||
|
std::cout << L"<refpurpose>" << _cmd.getMessage() << L"</refpurpose>" << std::endl;
|
||||||
|
std::cout << L"</refnamediv>" << std::endl;
|
||||||
|
|
||||||
|
std::cout << L"<refsynopsisdiv>" << std::endl;
|
||||||
|
std::cout << L"<cmdsynopsis>" << std::endl;
|
||||||
|
|
||||||
|
std::cout << L"<command>" << progName << L"</command>" << std::endl;
|
||||||
|
|
||||||
|
// xor
|
||||||
|
for ( int i = 0; (unsigned int)i < xorList.size(); i++ )
|
||||||
|
{
|
||||||
|
std::cout << L"<group choice='req'>" << std::endl;
|
||||||
|
for ( ArgVectorIterator it = xorList[i].begin();
|
||||||
|
it != xorList[i].end(); it++ )
|
||||||
|
printShortArg((*it));
|
||||||
|
|
||||||
|
std::cout << L"</group>" << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
// rest of args
|
||||||
|
for (ArgListIterator it = argList.begin(); it != argList.end(); it++)
|
||||||
|
if ( !xorHandler.contains( (*it) ) )
|
||||||
|
printShortArg((*it));
|
||||||
|
|
||||||
|
std::cout << L"</cmdsynopsis>" << std::endl;
|
||||||
|
std::cout << L"</refsynopsisdiv>" << std::endl;
|
||||||
|
|
||||||
|
std::cout << L"<refsect1>" << std::endl;
|
||||||
|
std::cout << L"<title>Description</title>" << std::endl;
|
||||||
|
std::cout << L"<para>" << std::endl;
|
||||||
|
std::cout << _cmd.getMessage() << std::endl;
|
||||||
|
std::cout << L"</para>" << std::endl;
|
||||||
|
std::cout << L"</refsect1>" << std::endl;
|
||||||
|
|
||||||
|
std::cout << L"<refsect1>" << std::endl;
|
||||||
|
std::cout << L"<title>Options</title>" << std::endl;
|
||||||
|
|
||||||
|
std::cout << L"<variablelist>" << std::endl;
|
||||||
|
|
||||||
|
for (ArgListIterator it = argList.begin(); it != argList.end(); it++)
|
||||||
|
printLongArg((*it));
|
||||||
|
|
||||||
|
std::cout << L"</variablelist>" << std::endl;
|
||||||
|
std::cout << L"</refsect1>" << std::endl;
|
||||||
|
|
||||||
|
std::cout << L"<refsect1>" << std::endl;
|
||||||
|
std::cout << L"<title>Version</title>" << std::endl;
|
||||||
|
std::cout << L"<para>" << std::endl;
|
||||||
|
std::cout << xversion << std::endl;
|
||||||
|
std::cout << L"</para>" << std::endl;
|
||||||
|
std::cout << L"</refsect1>" << std::endl;
|
||||||
|
|
||||||
|
std::cout << L"</refentry>" << std::endl;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void DocBookOutput::failure( CmdLineInterface& _cmd,
|
||||||
|
ArgException& e )
|
||||||
|
{
|
||||||
|
static_cast<void>(_cmd); // unused
|
||||||
|
std::cout << e.what() << std::endl;
|
||||||
|
throw ExitException(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void DocBookOutput::substituteSpecialChars( std::wstring& s,
|
||||||
|
wchar_t r,
|
||||||
|
std::wstring& x )
|
||||||
|
{
|
||||||
|
size_t p;
|
||||||
|
while ( (p = s.find_first_of(r)) != std::wstring::npos )
|
||||||
|
{
|
||||||
|
s.erase(p,1);
|
||||||
|
s.insert(p,x);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void DocBookOutput::removeChar( std::wstring& s, wchar_t r)
|
||||||
|
{
|
||||||
|
size_t p;
|
||||||
|
while ( (p = s.find_first_of(r)) != std::wstring::npos )
|
||||||
|
{
|
||||||
|
s.erase(p,1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void DocBookOutput::basename( std::wstring& s )
|
||||||
|
{
|
||||||
|
size_t p = s.find_last_of(L'/');
|
||||||
|
if ( p != std::wstring::npos )
|
||||||
|
{
|
||||||
|
s.erase(0, p + 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void DocBookOutput::printShortArg(Arg* a)
|
||||||
|
{
|
||||||
|
std::wstring lt = L"<";
|
||||||
|
std::wstring gt = L">";
|
||||||
|
|
||||||
|
std::wstring id = a->shortID();
|
||||||
|
substituteSpecialChars(id,L'<',lt);
|
||||||
|
substituteSpecialChars(id,L'>',gt);
|
||||||
|
removeChar(id,L'[');
|
||||||
|
removeChar(id,L']');
|
||||||
|
|
||||||
|
std::wstring choice = L"opt";
|
||||||
|
if ( a->isRequired() )
|
||||||
|
choice = L"plain";
|
||||||
|
|
||||||
|
std::cout << L"<arg choice='" << choice << L'\'L';
|
||||||
|
if ( a->acceptsMultipleValues() )
|
||||||
|
std::cout << " rep='repeatL'";
|
||||||
|
|
||||||
|
|
||||||
|
std::cout << '>L';
|
||||||
|
if ( !a->getFlag().empty() )
|
||||||
|
std::cout << a->flagStartChar() << a->getFlag();
|
||||||
|
else
|
||||||
|
std::cout << a->nameStartString() << a->getName();
|
||||||
|
if ( a->isValueRequired() )
|
||||||
|
{
|
||||||
|
std::wstring arg = a->shortID();
|
||||||
|
removeChar(arg,'[L');
|
||||||
|
removeChar(arg,']L');
|
||||||
|
removeChar(arg,'<L');
|
||||||
|
removeChar(arg,'>L');
|
||||||
|
arg.erase(0, arg.find_last_of(theDelimiter) + 1);
|
||||||
|
std::cout << theDelimiter;
|
||||||
|
std::cout << "<replaceable>" << arg << "</replaceable>";
|
||||||
|
}
|
||||||
|
std::cout << "</arg>" << std::endl;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void DocBookOutput::printLongArg(Arg* a)
|
||||||
|
{
|
||||||
|
std::wstring lt = "<";
|
||||||
|
std::wstring gt = ">";
|
||||||
|
|
||||||
|
std::wstring desc = a->getDescription();
|
||||||
|
substituteSpecialChars(desc,'<L',lt);
|
||||||
|
substituteSpecialChars(desc,'>L',gt);
|
||||||
|
|
||||||
|
std::cout << "<varlistentry>" << std::endl;
|
||||||
|
|
||||||
|
if ( !a->getFlag().empty() )
|
||||||
|
{
|
||||||
|
std::cout << "<term>" << std::endl;
|
||||||
|
std::cout << "<option>";
|
||||||
|
std::cout << a->flagStartChar() << a->getFlag();
|
||||||
|
std::cout << "</option>" << std::endl;
|
||||||
|
std::cout << "</term>" << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::cout << "<term>" << std::endl;
|
||||||
|
std::cout << "<option>";
|
||||||
|
std::cout << a->nameStartString() << a->getName();
|
||||||
|
if ( a->isValueRequired() )
|
||||||
|
{
|
||||||
|
std::wstring arg = a->shortID();
|
||||||
|
removeChar(arg,'[L');
|
||||||
|
removeChar(arg,']L');
|
||||||
|
removeChar(arg,'<L');
|
||||||
|
removeChar(arg,'>');
|
||||||
|
arg.erase(0, arg.find_last_of(theDelimiter) + 1);
|
||||||
|
std::cout << theDelimiter;
|
||||||
|
std::cout << L"<replaceable>" << arg << L"</replaceable>";
|
||||||
|
}
|
||||||
|
std::cout << L"</option>" << std::endl;
|
||||||
|
std::cout << L"</term>" << std::endl;
|
||||||
|
|
||||||
|
std::cout << L"<listitem>" << std::endl;
|
||||||
|
std::cout << L"<para>" << std::endl;
|
||||||
|
std::cout << desc << std::endl;
|
||||||
|
std::cout << L"</para>" << std::endl;
|
||||||
|
std::cout << L"</listitem>" << std::endl;
|
||||||
|
|
||||||
|
std::cout << L"</varlistentry>" << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
} //namespace TCLAP
|
||||||
|
#endif
|
76
include/tclapw/HelpVisitor.h
Normal file
76
include/tclapw/HelpVisitor.h
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
*
|
||||||
|
* file: HelpVisitor.h
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
#ifndef TCLAP_HELP_VISITOR_H
|
||||||
|
#define TCLAP_HELP_VISITOR_H
|
||||||
|
|
||||||
|
#include <tclapw/CmdLineInterface.h>
|
||||||
|
#include <tclapw/CmdLineOutput.h>
|
||||||
|
#include <tclapw/Visitor.h>
|
||||||
|
|
||||||
|
namespace TCLAP {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A Visitor object that calls the usage method of the given CmdLineOutput
|
||||||
|
* object for the specified CmdLine object.
|
||||||
|
*/
|
||||||
|
class HelpVisitor: public Visitor
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
/**
|
||||||
|
* Prevent accidental copying.
|
||||||
|
*/
|
||||||
|
HelpVisitor(const HelpVisitor& rhs);
|
||||||
|
HelpVisitor& operator=(const HelpVisitor& rhs);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The CmdLine the output will be generated for.
|
||||||
|
*/
|
||||||
|
CmdLineInterface* _cmd;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The output object.
|
||||||
|
*/
|
||||||
|
CmdLineOutput** _out;
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor.
|
||||||
|
* \param cmd - The CmdLine the output will be generated for.
|
||||||
|
* \param out - The type of output.
|
||||||
|
*/
|
||||||
|
HelpVisitor(CmdLineInterface* cmd, CmdLineOutput** out)
|
||||||
|
: Visitor(), _cmd( cmd ), _out( out ) { }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Calls the usage method of the CmdLineOutput for the
|
||||||
|
* specified CmdLine.
|
||||||
|
*/
|
||||||
|
void visit() { (*_out)->usage(*_cmd); throw ExitException(0); }
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
52
include/tclapw/IgnoreRestVisitor.h
Normal file
52
include/tclapw/IgnoreRestVisitor.h
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
*
|
||||||
|
* file: IgnoreRestVisitor.h
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef TCLAP_IGNORE_REST_VISITOR_H
|
||||||
|
#define TCLAP_IGNORE_REST_VISITOR_H
|
||||||
|
|
||||||
|
#include <tclapw/Visitor.h>
|
||||||
|
#include <tclapw/Arg.h>
|
||||||
|
|
||||||
|
namespace TCLAP {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A Vistor that tells the CmdLine to begin ignoring arguments after
|
||||||
|
* this one is parsed.
|
||||||
|
*/
|
||||||
|
class IgnoreRestVisitor: public Visitor
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor.
|
||||||
|
*/
|
||||||
|
IgnoreRestVisitor() : Visitor() {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets Arg::_ignoreRest.
|
||||||
|
*/
|
||||||
|
void visit() { Arg::beginIgnoring(); }
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
28
include/tclapw/Makefile.am
Normal file
28
include/tclapw/Makefile.am
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
|
||||||
|
libtclapincludedir = $(includedir)/tclap
|
||||||
|
|
||||||
|
libtclapinclude_HEADERS = \
|
||||||
|
CmdLineInterface.h \
|
||||||
|
ArgException.h \
|
||||||
|
CmdLine.h \
|
||||||
|
XorHandler.h \
|
||||||
|
MultiArg.h \
|
||||||
|
UnlabeledMultiArg.h \
|
||||||
|
ValueArg.h \
|
||||||
|
UnlabeledValueArg.h \
|
||||||
|
Visitor.h Arg.h \
|
||||||
|
HelpVisitor.h \
|
||||||
|
SwitchArg.h \
|
||||||
|
MultiSwitchArg.h \
|
||||||
|
VersionVisitor.h \
|
||||||
|
IgnoreRestVisitor.h \
|
||||||
|
CmdLineOutput.h \
|
||||||
|
StdOutput.h \
|
||||||
|
DocBookOutput.h \
|
||||||
|
ZshCompletionOutput.h \
|
||||||
|
OptionalUnlabeledTracker.h \
|
||||||
|
Constraint.h \
|
||||||
|
ValuesConstraint.h \
|
||||||
|
ArgTraits.h \
|
||||||
|
StandardTraits.h
|
||||||
|
|
403
include/tclapw/Makefile.in
Normal file
403
include/tclapw/Makefile.in
Normal file
@ -0,0 +1,403 @@
|
|||||||
|
# Makefile.in generated by automake 1.10 from Makefile.am.
|
||||||
|
# @configure_input@
|
||||||
|
|
||||||
|
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
|
||||||
|
# 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
|
||||||
|
# This Makefile.in is free software; the Free Software Foundation
|
||||||
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
|
# with or without modifications, as long as this notice is preserved.
|
||||||
|
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
|
||||||
|
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||||
|
# PARTICULAR PURPOSE.
|
||||||
|
|
||||||
|
@SET_MAKE@
|
||||||
|
|
||||||
|
VPATH = @srcdir@
|
||||||
|
pkgdatadir = $(datadir)/@PACKAGE@
|
||||||
|
pkglibdir = $(libdir)/@PACKAGE@
|
||||||
|
pkgincludedir = $(includedir)/@PACKAGE@
|
||||||
|
am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
|
||||||
|
install_sh_DATA = $(install_sh) -c -m 644
|
||||||
|
install_sh_PROGRAM = $(install_sh) -c
|
||||||
|
install_sh_SCRIPT = $(install_sh) -c
|
||||||
|
INSTALL_HEADER = $(INSTALL_DATA)
|
||||||
|
transform = $(program_transform_name)
|
||||||
|
NORMAL_INSTALL = :
|
||||||
|
PRE_INSTALL = :
|
||||||
|
POST_INSTALL = :
|
||||||
|
NORMAL_UNINSTALL = :
|
||||||
|
PRE_UNINSTALL = :
|
||||||
|
POST_UNINSTALL = :
|
||||||
|
subdir = include/tclap
|
||||||
|
DIST_COMMON = $(libtclapinclude_HEADERS) $(srcdir)/Makefile.am \
|
||||||
|
$(srcdir)/Makefile.in
|
||||||
|
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
||||||
|
am__aclocal_m4_deps = $(top_srcdir)/config/ac_cxx_have_long_long.m4 \
|
||||||
|
$(top_srcdir)/config/ac_cxx_have_sstream.m4 \
|
||||||
|
$(top_srcdir)/config/ac_cxx_have_strstream.m4 \
|
||||||
|
$(top_srcdir)/config/ac_cxx_namespaces.m4 \
|
||||||
|
$(top_srcdir)/config/ac_cxx_warn_effective_cxx.m4 \
|
||||||
|
$(top_srcdir)/config/bb_enable_doxygen.m4 \
|
||||||
|
$(top_srcdir)/configure.in
|
||||||
|
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
||||||
|
$(ACLOCAL_M4)
|
||||||
|
mkinstalldirs = $(SHELL) $(top_srcdir)/config/mkinstalldirs
|
||||||
|
CONFIG_HEADER = $(top_builddir)/config/config.h
|
||||||
|
CONFIG_CLEAN_FILES =
|
||||||
|
SOURCES =
|
||||||
|
DIST_SOURCES =
|
||||||
|
am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
|
||||||
|
am__vpath_adj = case $$p in \
|
||||||
|
$(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
|
||||||
|
*) f=$$p;; \
|
||||||
|
esac;
|
||||||
|
am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
|
||||||
|
am__installdirs = "$(DESTDIR)$(libtclapincludedir)"
|
||||||
|
libtclapincludeHEADERS_INSTALL = $(INSTALL_HEADER)
|
||||||
|
HEADERS = $(libtclapinclude_HEADERS)
|
||||||
|
ETAGS = etags
|
||||||
|
CTAGS = ctags
|
||||||
|
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
|
||||||
|
ACLOCAL = @ACLOCAL@
|
||||||
|
AMTAR = @AMTAR@
|
||||||
|
AUTOCONF = @AUTOCONF@
|
||||||
|
AUTOHEADER = @AUTOHEADER@
|
||||||
|
AUTOMAKE = @AUTOMAKE@
|
||||||
|
AWK = @AWK@
|
||||||
|
CPPFLAGS = @CPPFLAGS@
|
||||||
|
CXX = @CXX@
|
||||||
|
CXXCPP = @CXXCPP@
|
||||||
|
CXXDEPMODE = @CXXDEPMODE@
|
||||||
|
CXXFLAGS = @CXXFLAGS@
|
||||||
|
CYGPATH_W = @CYGPATH_W@
|
||||||
|
DEFS = @DEFS@
|
||||||
|
DEPDIR = @DEPDIR@
|
||||||
|
DOT = @DOT@
|
||||||
|
DOXYGEN = @DOXYGEN@
|
||||||
|
ECHO_C = @ECHO_C@
|
||||||
|
ECHO_N = @ECHO_N@
|
||||||
|
ECHO_T = @ECHO_T@
|
||||||
|
EGREP = @EGREP@
|
||||||
|
EXEEXT = @EXEEXT@
|
||||||
|
GREP = @GREP@
|
||||||
|
INSTALL = @INSTALL@
|
||||||
|
INSTALL_DATA = @INSTALL_DATA@
|
||||||
|
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
||||||
|
INSTALL_SCRIPT = @INSTALL_SCRIPT@
|
||||||
|
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
|
||||||
|
LDFLAGS = @LDFLAGS@
|
||||||
|
LIBOBJS = @LIBOBJS@
|
||||||
|
LIBS = @LIBS@
|
||||||
|
LTLIBOBJS = @LTLIBOBJS@
|
||||||
|
MAKEINFO = @MAKEINFO@
|
||||||
|
MKDIR_P = @MKDIR_P@
|
||||||
|
OBJEXT = @OBJEXT@
|
||||||
|
PACKAGE = @PACKAGE@
|
||||||
|
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
|
||||||
|
PACKAGE_NAME = @PACKAGE_NAME@
|
||||||
|
PACKAGE_STRING = @PACKAGE_STRING@
|
||||||
|
PACKAGE_TARNAME = @PACKAGE_TARNAME@
|
||||||
|
PACKAGE_VERSION = @PACKAGE_VERSION@
|
||||||
|
PATH_SEPARATOR = @PATH_SEPARATOR@
|
||||||
|
RANLIB = @RANLIB@
|
||||||
|
SET_MAKE = @SET_MAKE@
|
||||||
|
SHELL = @SHELL@
|
||||||
|
STRIP = @STRIP@
|
||||||
|
VERSION = @VERSION@
|
||||||
|
WARN_EFFECTIVE_CXX = @WARN_EFFECTIVE_CXX@
|
||||||
|
WARN_NO_EFFECTIVE_CXX = @WARN_NO_EFFECTIVE_CXX@
|
||||||
|
abs_builddir = @abs_builddir@
|
||||||
|
abs_srcdir = @abs_srcdir@
|
||||||
|
abs_top_builddir = @abs_top_builddir@
|
||||||
|
abs_top_srcdir = @abs_top_srcdir@
|
||||||
|
ac_ct_CXX = @ac_ct_CXX@
|
||||||
|
am__include = @am__include@
|
||||||
|
am__leading_dot = @am__leading_dot@
|
||||||
|
am__quote = @am__quote@
|
||||||
|
am__tar = @am__tar@
|
||||||
|
am__untar = @am__untar@
|
||||||
|
bindir = @bindir@
|
||||||
|
build_alias = @build_alias@
|
||||||
|
builddir = @builddir@
|
||||||
|
datadir = @datadir@
|
||||||
|
datarootdir = @datarootdir@
|
||||||
|
docdir = @docdir@
|
||||||
|
dvidir = @dvidir@
|
||||||
|
exec_prefix = @exec_prefix@
|
||||||
|
host_alias = @host_alias@
|
||||||
|
htmldir = @htmldir@
|
||||||
|
includedir = @includedir@
|
||||||
|
infodir = @infodir@
|
||||||
|
install_sh = @install_sh@
|
||||||
|
libdir = @libdir@
|
||||||
|
libexecdir = @libexecdir@
|
||||||
|
localedir = @localedir@
|
||||||
|
localstatedir = @localstatedir@
|
||||||
|
mandir = @mandir@
|
||||||
|
mkdir_p = @mkdir_p@
|
||||||
|
oldincludedir = @oldincludedir@
|
||||||
|
pdfdir = @pdfdir@
|
||||||
|
prefix = @prefix@
|
||||||
|
program_transform_name = @program_transform_name@
|
||||||
|
psdir = @psdir@
|
||||||
|
sbindir = @sbindir@
|
||||||
|
sharedstatedir = @sharedstatedir@
|
||||||
|
srcdir = @srcdir@
|
||||||
|
sysconfdir = @sysconfdir@
|
||||||
|
target_alias = @target_alias@
|
||||||
|
top_builddir = @top_builddir@
|
||||||
|
top_srcdir = @top_srcdir@
|
||||||
|
libtclapincludedir = $(includedir)/tclap
|
||||||
|
libtclapinclude_HEADERS = \
|
||||||
|
CmdLineInterface.h \
|
||||||
|
ArgException.h \
|
||||||
|
CmdLine.h \
|
||||||
|
XorHandler.h \
|
||||||
|
MultiArg.h \
|
||||||
|
UnlabeledMultiArg.h \
|
||||||
|
ValueArg.h \
|
||||||
|
UnlabeledValueArg.h \
|
||||||
|
Visitor.h Arg.h \
|
||||||
|
HelpVisitor.h \
|
||||||
|
SwitchArg.h \
|
||||||
|
MultiSwitchArg.h \
|
||||||
|
VersionVisitor.h \
|
||||||
|
IgnoreRestVisitor.h \
|
||||||
|
CmdLineOutput.h \
|
||||||
|
StdOutput.h \
|
||||||
|
DocBookOutput.h \
|
||||||
|
ZshCompletionOutput.h \
|
||||||
|
OptionalUnlabeledTracker.h \
|
||||||
|
Constraint.h \
|
||||||
|
ValuesConstraint.h \
|
||||||
|
ArgTraits.h \
|
||||||
|
StandardTraits.h
|
||||||
|
|
||||||
|
all: all-am
|
||||||
|
|
||||||
|
.SUFFIXES:
|
||||||
|
$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
|
||||||
|
@for dep in $?; do \
|
||||||
|
case '$(am__configure_deps)' in \
|
||||||
|
*$$dep*) \
|
||||||
|
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
|
||||||
|
&& exit 0; \
|
||||||
|
exit 1;; \
|
||||||
|
esac; \
|
||||||
|
done; \
|
||||||
|
echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu include/tclap/Makefile'; \
|
||||||
|
cd $(top_srcdir) && \
|
||||||
|
$(AUTOMAKE) --gnu include/tclap/Makefile
|
||||||
|
.PRECIOUS: Makefile
|
||||||
|
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
||||||
|
@case '$?' in \
|
||||||
|
*config.status*) \
|
||||||
|
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
|
||||||
|
*) \
|
||||||
|
echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
|
||||||
|
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
|
||||||
|
esac;
|
||||||
|
|
||||||
|
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
|
||||||
|
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
||||||
|
|
||||||
|
$(top_srcdir)/configure: $(am__configure_deps)
|
||||||
|
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
||||||
|
$(ACLOCAL_M4): $(am__aclocal_m4_deps)
|
||||||
|
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
||||||
|
install-libtclapincludeHEADERS: $(libtclapinclude_HEADERS)
|
||||||
|
@$(NORMAL_INSTALL)
|
||||||
|
test -z "$(libtclapincludedir)" || $(MKDIR_P) "$(DESTDIR)$(libtclapincludedir)"
|
||||||
|
@list='$(libtclapinclude_HEADERS)'; for p in $$list; do \
|
||||||
|
if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
|
||||||
|
f=$(am__strip_dir) \
|
||||||
|
echo " $(libtclapincludeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(libtclapincludedir)/$$f'"; \
|
||||||
|
$(libtclapincludeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(libtclapincludedir)/$$f"; \
|
||||||
|
done
|
||||||
|
|
||||||
|
uninstall-libtclapincludeHEADERS:
|
||||||
|
@$(NORMAL_UNINSTALL)
|
||||||
|
@list='$(libtclapinclude_HEADERS)'; for p in $$list; do \
|
||||||
|
f=$(am__strip_dir) \
|
||||||
|
echo " rm -f '$(DESTDIR)$(libtclapincludedir)/$$f'"; \
|
||||||
|
rm -f "$(DESTDIR)$(libtclapincludedir)/$$f"; \
|
||||||
|
done
|
||||||
|
|
||||||
|
ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
|
||||||
|
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
|
||||||
|
unique=`for i in $$list; do \
|
||||||
|
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
||||||
|
done | \
|
||||||
|
$(AWK) ' { files[$$0] = 1; } \
|
||||||
|
END { for (i in files) print i; }'`; \
|
||||||
|
mkid -fID $$unique
|
||||||
|
tags: TAGS
|
||||||
|
|
||||||
|
TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
|
||||||
|
$(TAGS_FILES) $(LISP)
|
||||||
|
tags=; \
|
||||||
|
here=`pwd`; \
|
||||||
|
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
|
||||||
|
unique=`for i in $$list; do \
|
||||||
|
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
||||||
|
done | \
|
||||||
|
$(AWK) ' { files[$$0] = 1; } \
|
||||||
|
END { for (i in files) print i; }'`; \
|
||||||
|
if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
|
||||||
|
test -n "$$unique" || unique=$$empty_fix; \
|
||||||
|
$(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
|
||||||
|
$$tags $$unique; \
|
||||||
|
fi
|
||||||
|
ctags: CTAGS
|
||||||
|
CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
|
||||||
|
$(TAGS_FILES) $(LISP)
|
||||||
|
tags=; \
|
||||||
|
here=`pwd`; \
|
||||||
|
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
|
||||||
|
unique=`for i in $$list; do \
|
||||||
|
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
||||||
|
done | \
|
||||||
|
$(AWK) ' { files[$$0] = 1; } \
|
||||||
|
END { for (i in files) print i; }'`; \
|
||||||
|
test -z "$(CTAGS_ARGS)$$tags$$unique" \
|
||||||
|
|| $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
|
||||||
|
$$tags $$unique
|
||||||
|
|
||||||
|
GTAGS:
|
||||||
|
here=`$(am__cd) $(top_builddir) && pwd` \
|
||||||
|
&& cd $(top_srcdir) \
|
||||||
|
&& gtags -i $(GTAGS_ARGS) $$here
|
||||||
|
|
||||||
|
distclean-tags:
|
||||||
|
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
|
||||||
|
|
||||||
|
distdir: $(DISTFILES)
|
||||||
|
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
||||||
|
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
||||||
|
list='$(DISTFILES)'; \
|
||||||
|
dist_files=`for file in $$list; do echo $$file; done | \
|
||||||
|
sed -e "s|^$$srcdirstrip/||;t" \
|
||||||
|
-e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
|
||||||
|
case $$dist_files in \
|
||||||
|
*/*) $(MKDIR_P) `echo "$$dist_files" | \
|
||||||
|
sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
|
||||||
|
sort -u` ;; \
|
||||||
|
esac; \
|
||||||
|
for file in $$dist_files; do \
|
||||||
|
if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
|
||||||
|
if test -d $$d/$$file; then \
|
||||||
|
dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
|
||||||
|
if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
|
||||||
|
cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
|
||||||
|
fi; \
|
||||||
|
cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
|
||||||
|
else \
|
||||||
|
test -f $(distdir)/$$file \
|
||||||
|
|| cp -p $$d/$$file $(distdir)/$$file \
|
||||||
|
|| exit 1; \
|
||||||
|
fi; \
|
||||||
|
done
|
||||||
|
check-am: all-am
|
||||||
|
check: check-am
|
||||||
|
all-am: Makefile $(HEADERS)
|
||||||
|
installdirs:
|
||||||
|
for dir in "$(DESTDIR)$(libtclapincludedir)"; do \
|
||||||
|
test -z "$$dir" || $(MKDIR_P) "$$dir"; \
|
||||||
|
done
|
||||||
|
install: install-am
|
||||||
|
install-exec: install-exec-am
|
||||||
|
install-data: install-data-am
|
||||||
|
uninstall: uninstall-am
|
||||||
|
|
||||||
|
install-am: all-am
|
||||||
|
@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
|
||||||
|
|
||||||
|
installcheck: installcheck-am
|
||||||
|
install-strip:
|
||||||
|
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
|
||||||
|
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
|
||||||
|
`test -z '$(STRIP)' || \
|
||||||
|
echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
|
||||||
|
mostlyclean-generic:
|
||||||
|
|
||||||
|
clean-generic:
|
||||||
|
|
||||||
|
distclean-generic:
|
||||||
|
-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
|
||||||
|
|
||||||
|
maintainer-clean-generic:
|
||||||
|
@echo "This command is intended for maintainers to use"
|
||||||
|
@echo "it deletes files that may require special tools to rebuild."
|
||||||
|
clean: clean-am
|
||||||
|
|
||||||
|
clean-am: clean-generic mostlyclean-am
|
||||||
|
|
||||||
|
distclean: distclean-am
|
||||||
|
-rm -f Makefile
|
||||||
|
distclean-am: clean-am distclean-generic distclean-tags
|
||||||
|
|
||||||
|
dvi: dvi-am
|
||||||
|
|
||||||
|
dvi-am:
|
||||||
|
|
||||||
|
html: html-am
|
||||||
|
|
||||||
|
info: info-am
|
||||||
|
|
||||||
|
info-am:
|
||||||
|
|
||||||
|
install-data-am: install-libtclapincludeHEADERS
|
||||||
|
|
||||||
|
install-dvi: install-dvi-am
|
||||||
|
|
||||||
|
install-exec-am:
|
||||||
|
|
||||||
|
install-html: install-html-am
|
||||||
|
|
||||||
|
install-info: install-info-am
|
||||||
|
|
||||||
|
install-man:
|
||||||
|
|
||||||
|
install-pdf: install-pdf-am
|
||||||
|
|
||||||
|
install-ps: install-ps-am
|
||||||
|
|
||||||
|
installcheck-am:
|
||||||
|
|
||||||
|
maintainer-clean: maintainer-clean-am
|
||||||
|
-rm -f Makefile
|
||||||
|
maintainer-clean-am: distclean-am maintainer-clean-generic
|
||||||
|
|
||||||
|
mostlyclean: mostlyclean-am
|
||||||
|
|
||||||
|
mostlyclean-am: mostlyclean-generic
|
||||||
|
|
||||||
|
pdf: pdf-am
|
||||||
|
|
||||||
|
pdf-am:
|
||||||
|
|
||||||
|
ps: ps-am
|
||||||
|
|
||||||
|
ps-am:
|
||||||
|
|
||||||
|
uninstall-am: uninstall-libtclapincludeHEADERS
|
||||||
|
|
||||||
|
.MAKE: install-am install-strip
|
||||||
|
|
||||||
|
.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
|
||||||
|
ctags distclean distclean-generic distclean-tags distdir dvi \
|
||||||
|
dvi-am html html-am info info-am install install-am \
|
||||||
|
install-data install-data-am install-dvi install-dvi-am \
|
||||||
|
install-exec install-exec-am install-html install-html-am \
|
||||||
|
install-info install-info-am install-libtclapincludeHEADERS \
|
||||||
|
install-man install-pdf install-pdf-am install-ps \
|
||||||
|
install-ps-am install-strip installcheck installcheck-am \
|
||||||
|
installdirs maintainer-clean maintainer-clean-generic \
|
||||||
|
mostlyclean mostlyclean-generic pdf pdf-am ps ps-am tags \
|
||||||
|
uninstall uninstall-am uninstall-libtclapincludeHEADERS
|
||||||
|
|
||||||
|
# Tell versions [3.59,3.63) of GNU make to not export all variables.
|
||||||
|
# Otherwise a system limit (for SysV at least) may be exceeded.
|
||||||
|
.NOEXPORT:
|
433
include/tclapw/MultiArg.h
Normal file
433
include/tclapw/MultiArg.h
Normal file
@ -0,0 +1,433 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
*
|
||||||
|
* file: MultiArg.h
|
||||||
|
*
|
||||||
|
* Copyright (c) 2003, Michael E. Smoot .
|
||||||
|
* Copyright (c) 2004, Michael E. Smoot, Daniel Aarno.
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef TCLAP_MULTIPLE_ARGUMENT_H
|
||||||
|
#define TCLAP_MULTIPLE_ARGUMENT_H
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
#include <tclapw/Arg.h>
|
||||||
|
#include <tclapw/Constraint.h>
|
||||||
|
|
||||||
|
namespace TCLAP {
|
||||||
|
/**
|
||||||
|
* An argument that allows multiple values of type T to be specified. Very
|
||||||
|
* similar to a ValueArg, except a vector of values will be returned
|
||||||
|
* instead of just one.
|
||||||
|
*/
|
||||||
|
template<class T>
|
||||||
|
class MultiArg : public Arg
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
typedef std::vector<T> container_type;
|
||||||
|
typedef typename container_type::iterator iterator;
|
||||||
|
typedef typename container_type::const_iterator const_iterator;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The list of values parsed from the CmdLine.
|
||||||
|
*/
|
||||||
|
std::vector<T> _values;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The description of type T to be used in the usage.
|
||||||
|
*/
|
||||||
|
std::wstring _typeDesc;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A list of constraint on this Arg.
|
||||||
|
*/
|
||||||
|
Constraint<T>* _constraint;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Extracts the value from the string.
|
||||||
|
* Attempts to parse string as type T, if this fails an exception
|
||||||
|
* is thrown.
|
||||||
|
* \param val - The string to be read.
|
||||||
|
*/
|
||||||
|
void _extractValue( const std::wstring& val );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Used by XorHandler to decide whether to keep parsing for this arg.
|
||||||
|
*/
|
||||||
|
bool _allowMore;
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor.
|
||||||
|
* \param flag - The one character flag that identifies this
|
||||||
|
* argument on the command line.
|
||||||
|
* \param name - A one word name for the argument. Can be
|
||||||
|
* used as a long flag on the command line.
|
||||||
|
* \param desc - A description of what the argument is for or
|
||||||
|
* does.
|
||||||
|
* \param req - Whether the argument is required on the command
|
||||||
|
* line.
|
||||||
|
* \param typeDesc - A short, human readable description of the
|
||||||
|
* type that this object expects. This is used in the generation
|
||||||
|
* of the USAGE statement. The goal is to be helpful to the end user
|
||||||
|
* of the program.
|
||||||
|
* \param v - An optional visitor. You probably should not
|
||||||
|
* use this unless you have a very good reason.
|
||||||
|
*/
|
||||||
|
MultiArg( const std::wstring& flag,
|
||||||
|
const std::wstring& name,
|
||||||
|
const std::wstring& desc,
|
||||||
|
bool req,
|
||||||
|
const std::wstring& typeDesc,
|
||||||
|
Visitor* v = NULL);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor.
|
||||||
|
* \param flag - The one character flag that identifies this
|
||||||
|
* argument on the command line.
|
||||||
|
* \param name - A one word name for the argument. Can be
|
||||||
|
* used as a long flag on the command line.
|
||||||
|
* \param desc - A description of what the argument is for or
|
||||||
|
* does.
|
||||||
|
* \param req - Whether the argument is required on the command
|
||||||
|
* line.
|
||||||
|
* \param typeDesc - A short, human readable description of the
|
||||||
|
* type that this object expects. This is used in the generation
|
||||||
|
* of the USAGE statement. The goal is to be helpful to the end user
|
||||||
|
* of the program.
|
||||||
|
* \param parser - A CmdLine parser object to add this Arg to
|
||||||
|
* \param v - An optional visitor. You probably should not
|
||||||
|
* use this unless you have a very good reason.
|
||||||
|
*/
|
||||||
|
MultiArg( const std::wstring& flag,
|
||||||
|
const std::wstring& name,
|
||||||
|
const std::wstring& desc,
|
||||||
|
bool req,
|
||||||
|
const std::wstring& typeDesc,
|
||||||
|
CmdLineInterface& parser,
|
||||||
|
Visitor* v = NULL );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor.
|
||||||
|
* \param flag - The one character flag that identifies this
|
||||||
|
* argument on the command line.
|
||||||
|
* \param name - A one word name for the argument. Can be
|
||||||
|
* used as a long flag on the command line.
|
||||||
|
* \param desc - A description of what the argument is for or
|
||||||
|
* does.
|
||||||
|
* \param req - Whether the argument is required on the command
|
||||||
|
* line.
|
||||||
|
* \param constraint - A pointer to a Constraint object used
|
||||||
|
* to constrain this Arg.
|
||||||
|
* \param v - An optional visitor. You probably should not
|
||||||
|
* use this unless you have a very good reason.
|
||||||
|
*/
|
||||||
|
MultiArg( const std::wstring& flag,
|
||||||
|
const std::wstring& name,
|
||||||
|
const std::wstring& desc,
|
||||||
|
bool req,
|
||||||
|
Constraint<T>* constraint,
|
||||||
|
Visitor* v = NULL );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor.
|
||||||
|
* \param flag - The one character flag that identifies this
|
||||||
|
* argument on the command line.
|
||||||
|
* \param name - A one word name for the argument. Can be
|
||||||
|
* used as a long flag on the command line.
|
||||||
|
* \param desc - A description of what the argument is for or
|
||||||
|
* does.
|
||||||
|
* \param req - Whether the argument is required on the command
|
||||||
|
* line.
|
||||||
|
* \param constraint - A pointer to a Constraint object used
|
||||||
|
* to constrain this Arg.
|
||||||
|
* \param parser - A CmdLine parser object to add this Arg to
|
||||||
|
* \param v - An optional visitor. You probably should not
|
||||||
|
* use this unless you have a very good reason.
|
||||||
|
*/
|
||||||
|
MultiArg( const std::wstring& flag,
|
||||||
|
const std::wstring& name,
|
||||||
|
const std::wstring& desc,
|
||||||
|
bool req,
|
||||||
|
Constraint<T>* constraint,
|
||||||
|
CmdLineInterface& parser,
|
||||||
|
Visitor* v = NULL );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handles the processing of the argument.
|
||||||
|
* This re-implements the Arg version of this method to set the
|
||||||
|
* _value of the argument appropriately. It knows the difference
|
||||||
|
* between labeled and unlabeled.
|
||||||
|
* \param i - Pointer the the current argument in the list.
|
||||||
|
* \param args - Mutable list of strings. Passed from main().
|
||||||
|
*/
|
||||||
|
virtual bool processArg(int* i, std::vector<std::wstring>& args);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a vector of type T containing the values parsed from
|
||||||
|
* the command line.
|
||||||
|
*/
|
||||||
|
const std::vector<T>& getValue();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns an iterator over the values parsed from the command
|
||||||
|
* line.
|
||||||
|
*/
|
||||||
|
const_iterator begin() const { return _values.begin(); }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the end of the values parsed from the command
|
||||||
|
* line.
|
||||||
|
*/
|
||||||
|
const_iterator end() const { return _values.end(); }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the a short id string. Used in the usage.
|
||||||
|
* \param val - value to be used.
|
||||||
|
*/
|
||||||
|
virtual std::wstring shortID(const std::wstring& val=L"val") const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the a long id string. Used in the usage.
|
||||||
|
* \param val - value to be used.
|
||||||
|
*/
|
||||||
|
virtual std::wstring longID(const std::wstring& val=L"val") const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Once weL've matched the first value, then the arg is no longer
|
||||||
|
* required.
|
||||||
|
*/
|
||||||
|
virtual bool isRequired() const;
|
||||||
|
|
||||||
|
virtual bool allowMore();
|
||||||
|
|
||||||
|
virtual void reset();
|
||||||
|
|
||||||
|
private:
|
||||||
|
/**
|
||||||
|
* Prevent accidental copying
|
||||||
|
*/
|
||||||
|
MultiArg<T>(const MultiArg<T>& rhs);
|
||||||
|
MultiArg<T>& operator=(const MultiArg<T>& rhs);
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
MultiArg<T>::MultiArg(const std::wstring& flag,
|
||||||
|
const std::wstring& name,
|
||||||
|
const std::wstring& desc,
|
||||||
|
bool req,
|
||||||
|
const std::wstring& typeDesc,
|
||||||
|
Visitor* v) :
|
||||||
|
Arg( flag, name, desc, req, true, v ),
|
||||||
|
_values(std::vector<T>()),
|
||||||
|
_typeDesc( typeDesc ),
|
||||||
|
_constraint( NULL ),
|
||||||
|
_allowMore(false)
|
||||||
|
{
|
||||||
|
_acceptsMultipleValues = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
MultiArg<T>::MultiArg(const std::wstring& flag,
|
||||||
|
const std::wstring& name,
|
||||||
|
const std::wstring& desc,
|
||||||
|
bool req,
|
||||||
|
const std::wstring& typeDesc,
|
||||||
|
CmdLineInterface& parser,
|
||||||
|
Visitor* v)
|
||||||
|
: Arg( flag, name, desc, req, true, v ),
|
||||||
|
_values(std::vector<T>()),
|
||||||
|
_typeDesc( typeDesc ),
|
||||||
|
_constraint( NULL ),
|
||||||
|
_allowMore(false)
|
||||||
|
{
|
||||||
|
parser.add( this );
|
||||||
|
_acceptsMultipleValues = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
template<class T>
|
||||||
|
MultiArg<T>::MultiArg(const std::wstring& flag,
|
||||||
|
const std::wstring& name,
|
||||||
|
const std::wstring& desc,
|
||||||
|
bool req,
|
||||||
|
Constraint<T>* constraint,
|
||||||
|
Visitor* v)
|
||||||
|
: Arg( flag, name, desc, req, true, v ),
|
||||||
|
_values(std::vector<T>()),
|
||||||
|
_typeDesc( constraint->shortID() ),
|
||||||
|
_constraint( constraint ),
|
||||||
|
_allowMore(false)
|
||||||
|
{
|
||||||
|
_acceptsMultipleValues = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
MultiArg<T>::MultiArg(const std::wstring& flag,
|
||||||
|
const std::wstring& name,
|
||||||
|
const std::wstring& desc,
|
||||||
|
bool req,
|
||||||
|
Constraint<T>* constraint,
|
||||||
|
CmdLineInterface& parser,
|
||||||
|
Visitor* v)
|
||||||
|
: Arg( flag, name, desc, req, true, v ),
|
||||||
|
_values(std::vector<T>()),
|
||||||
|
_typeDesc( constraint->shortID() ),
|
||||||
|
_constraint( constraint ),
|
||||||
|
_allowMore(false)
|
||||||
|
{
|
||||||
|
parser.add( this );
|
||||||
|
_acceptsMultipleValues = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
const std::vector<T>& MultiArg<T>::getValue() { return _values; }
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
bool MultiArg<T>::processArg(int *i, std::vector<std::wstring>& args)
|
||||||
|
{
|
||||||
|
if ( _ignoreable && Arg::ignoreRest() )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if ( _hasBlanks( args[*i] ) )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
std::wstring flag = args[*i];
|
||||||
|
std::wstring value = L"";
|
||||||
|
|
||||||
|
trimFlag( flag, value );
|
||||||
|
|
||||||
|
if ( argMatches( flag ) )
|
||||||
|
{
|
||||||
|
if ( Arg::delimiter() != L' ' && value == L"" )
|
||||||
|
throw( ArgParseException(
|
||||||
|
L"Couldn't find delimiter for this argument!",
|
||||||
|
toString() ) );
|
||||||
|
|
||||||
|
// always take the first one, regardless of start string
|
||||||
|
if ( value == L"" )
|
||||||
|
{
|
||||||
|
(*i)++;
|
||||||
|
if ( static_cast<unsigned int>(*i) < args.size() )
|
||||||
|
_extractValue( args[*i] );
|
||||||
|
else
|
||||||
|
throw( ArgParseException(L"Missing a value for this argument!",
|
||||||
|
toString() ) );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
_extractValue( value );
|
||||||
|
|
||||||
|
/*
|
||||||
|
// continuing taking the args until we hit one with a start string
|
||||||
|
while ( (unsigned int)(*i)+1 < args.size() &&
|
||||||
|
args[(*i)+1].find_first_of( Arg::flagStartString() ) != 0 &&
|
||||||
|
args[(*i)+1].find_first_of( Arg::nameStartString() ) != 0 )
|
||||||
|
_extractValue( args[++(*i)] );
|
||||||
|
*/
|
||||||
|
|
||||||
|
_alreadySet = true;
|
||||||
|
_checkWithVisitor();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
template<class T>
|
||||||
|
std::wstring MultiArg<T>::shortID(const std::wstring& val) const
|
||||||
|
{
|
||||||
|
static_cast<void>(val); // Ignore input, don't warn
|
||||||
|
return Arg::shortID(_typeDesc) + L" ... ";
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
template<class T>
|
||||||
|
std::wstring MultiArg<T>::longID(const std::wstring& val) const
|
||||||
|
{
|
||||||
|
static_cast<void>(val); // Ignore input, don't warn
|
||||||
|
return Arg::longID(_typeDesc) + L" (accepted multiple times)";
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Once we've matched the first value, then the arg is no longer
|
||||||
|
* required.
|
||||||
|
*/
|
||||||
|
template<class T>
|
||||||
|
bool MultiArg<T>::isRequired() const
|
||||||
|
{
|
||||||
|
if ( _required )
|
||||||
|
{
|
||||||
|
if ( _values.size() > 1 )
|
||||||
|
return false;
|
||||||
|
else
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
void MultiArg<T>::_extractValue( const std::wstring& val )
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
T tmp;
|
||||||
|
ExtractValue(tmp, val, typename ArgTraits<T>::ValueCategory());
|
||||||
|
_values.push_back(tmp);
|
||||||
|
} catch( ArgParseException &e) {
|
||||||
|
throw ArgParseException(e.error(), toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( _constraint != NULL )
|
||||||
|
if ( ! _constraint->check( _values.back() ) )
|
||||||
|
throw( CmdLineParseException(L"Value '" + val +
|
||||||
|
L"' does not meet constraint: " +
|
||||||
|
_constraint->description(),
|
||||||
|
toString() ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
bool MultiArg<T>::allowMore()
|
||||||
|
{
|
||||||
|
bool am = _allowMore;
|
||||||
|
_allowMore = true;
|
||||||
|
return am;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
void MultiArg<T>::reset()
|
||||||
|
{
|
||||||
|
Arg::reset();
|
||||||
|
_values.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace TCLAP
|
||||||
|
|
||||||
|
#endif
|
216
include/tclapw/MultiSwitchArg.h
Normal file
216
include/tclapw/MultiSwitchArg.h
Normal file
@ -0,0 +1,216 @@
|
|||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
*
|
||||||
|
* file: MultiSwitchArg.h
|
||||||
|
*
|
||||||
|
* Copyright (c) 2003, Michael E. Smoot .
|
||||||
|
* Copyright (c) 2004, Michael E. Smoot, Daniel Aarno.
|
||||||
|
* Copyright (c) 2005, Michael E. Smoot, Daniel Aarno, Erik Zeek.
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef TCLAP_MULTI_SWITCH_ARG_H
|
||||||
|
#define TCLAP_MULTI_SWITCH_ARG_H
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
#include <tclapw/SwitchArg.h>
|
||||||
|
|
||||||
|
namespace TCLAP {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A multiple switch argument. If the switch is set on the command line, then
|
||||||
|
* the getValue method will return the number of times the switch appears.
|
||||||
|
*/
|
||||||
|
class MultiSwitchArg : public SwitchArg
|
||||||
|
{
|
||||||
|
protected:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The value of the switch.
|
||||||
|
*/
|
||||||
|
int _value;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Used to support the reset() method so that ValueArg can be
|
||||||
|
* reset to their constructed value.
|
||||||
|
*/
|
||||||
|
int _default;
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MultiSwitchArg constructor.
|
||||||
|
* \param flag - The one character flag that identifies this
|
||||||
|
* argument on the command line.
|
||||||
|
* \param name - A one word name for the argument. Can be
|
||||||
|
* used as a long flag on the command line.
|
||||||
|
* \param desc - A description of what the argument is for or
|
||||||
|
* does.
|
||||||
|
* \param init - Optional. The initial/default value of this Arg.
|
||||||
|
* Defaults to 0.
|
||||||
|
* \param v - An optional visitor. You probably should not
|
||||||
|
* use this unless you have a very good reason.
|
||||||
|
*/
|
||||||
|
MultiSwitchArg(const std::wstring& flag,
|
||||||
|
const std::wstring& name,
|
||||||
|
const std::wstring& desc,
|
||||||
|
int init = 0,
|
||||||
|
Visitor* v = NULL);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MultiSwitchArg constructor.
|
||||||
|
* \param flag - The one character flag that identifies this
|
||||||
|
* argument on the command line.
|
||||||
|
* \param name - A one word name for the argument. Can be
|
||||||
|
* used as a long flag on the command line.
|
||||||
|
* \param desc - A description of what the argument is for or
|
||||||
|
* does.
|
||||||
|
* \param parser - A CmdLine parser object to add this Arg to
|
||||||
|
* \param init - Optional. The initial/default value of this Arg.
|
||||||
|
* Defaults to 0.
|
||||||
|
* \param v - An optional visitor. You probably should not
|
||||||
|
* use this unless you have a very good reason.
|
||||||
|
*/
|
||||||
|
MultiSwitchArg(const std::wstring& flag,
|
||||||
|
const std::wstring& name,
|
||||||
|
const std::wstring& desc,
|
||||||
|
CmdLineInterface& parser,
|
||||||
|
int init = 0,
|
||||||
|
Visitor* v = NULL);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handles the processing of the argument.
|
||||||
|
* This re-implements the SwitchArg version of this method to set the
|
||||||
|
* _value of the argument appropriately.
|
||||||
|
* \param i - Pointer the the current argument in the list.
|
||||||
|
* \param args - Mutable list of strings. Passed
|
||||||
|
* in from main().
|
||||||
|
*/
|
||||||
|
virtual bool processArg(int* i, std::vector<std::wstring>& args);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns int, the number of times the switch has been set.
|
||||||
|
*/
|
||||||
|
int getValue();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the shortID for this Arg.
|
||||||
|
*/
|
||||||
|
std::wstring shortID(const std::wstring& val) const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the longID for this Arg.
|
||||||
|
*/
|
||||||
|
std::wstring longID(const std::wstring& val) const;
|
||||||
|
|
||||||
|
void reset();
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////
|
||||||
|
//BEGIN MultiSwitchArg.cpp
|
||||||
|
//////////////////////////////////////////////////////////////////////
|
||||||
|
inline MultiSwitchArg::MultiSwitchArg(const std::wstring& flag,
|
||||||
|
const std::wstring& name,
|
||||||
|
const std::wstring& desc,
|
||||||
|
int init,
|
||||||
|
Visitor* v )
|
||||||
|
: SwitchArg(flag, name, desc, false, v),
|
||||||
|
_value( init ),
|
||||||
|
_default( init )
|
||||||
|
{ }
|
||||||
|
|
||||||
|
inline MultiSwitchArg::MultiSwitchArg(const std::wstring& flag,
|
||||||
|
const std::wstring& name,
|
||||||
|
const std::wstring& desc,
|
||||||
|
CmdLineInterface& parser,
|
||||||
|
int init,
|
||||||
|
Visitor* v )
|
||||||
|
: SwitchArg(flag, name, desc, false, v),
|
||||||
|
_value( init ),
|
||||||
|
_default( init )
|
||||||
|
{
|
||||||
|
parser.add( this );
|
||||||
|
}
|
||||||
|
|
||||||
|
inline int MultiSwitchArg::getValue() { return _value; }
|
||||||
|
|
||||||
|
inline bool MultiSwitchArg::processArg(int *i, std::vector<std::wstring>& args)
|
||||||
|
{
|
||||||
|
if ( _ignoreable && Arg::ignoreRest() )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if ( argMatches( args[*i] ))
|
||||||
|
{
|
||||||
|
// so the isSet() method will work
|
||||||
|
_alreadySet = true;
|
||||||
|
|
||||||
|
// Matched argument: increment value.
|
||||||
|
++_value;
|
||||||
|
|
||||||
|
_checkWithVisitor();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else if ( combinedSwitchesMatch( args[*i] ) )
|
||||||
|
{
|
||||||
|
// so the isSet() method will work
|
||||||
|
_alreadySet = true;
|
||||||
|
|
||||||
|
// Matched argument: increment value.
|
||||||
|
++_value;
|
||||||
|
|
||||||
|
// Check for more in argument and increment value.
|
||||||
|
while ( combinedSwitchesMatch( args[*i] ) )
|
||||||
|
++_value;
|
||||||
|
|
||||||
|
_checkWithVisitor();
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline std::wstring
|
||||||
|
MultiSwitchArg::shortID(const std::wstring& val) const
|
||||||
|
{
|
||||||
|
return Arg::shortID(val) + L" ... ";
|
||||||
|
}
|
||||||
|
|
||||||
|
inline std::wstring
|
||||||
|
MultiSwitchArg::longID(const std::wstring& val) const
|
||||||
|
{
|
||||||
|
return Arg::longID(val) + L" (accepted multiple times)";
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void
|
||||||
|
MultiSwitchArg::reset()
|
||||||
|
{
|
||||||
|
MultiSwitchArg::_value = MultiSwitchArg::_default;
|
||||||
|
}
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////
|
||||||
|
//END MultiSwitchArg.cpp
|
||||||
|
//////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
} //namespace TCLAP
|
||||||
|
|
||||||
|
#endif
|
62
include/tclapw/OptionalUnlabeledTracker.h
Normal file
62
include/tclapw/OptionalUnlabeledTracker.h
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
*
|
||||||
|
* file: OptionalUnlabeledTracker.h
|
||||||
|
*
|
||||||
|
* Copyright (c) 2005, 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.
|
||||||
|
*
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef TCLAP_OPTIONAL_UNLABELED_TRACKER_H
|
||||||
|
#define TCLAP_OPTIONAL_UNLABELED_TRACKER_H
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
namespace TCLAP {
|
||||||
|
|
||||||
|
class OptionalUnlabeledTracker
|
||||||
|
{
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
static void check( bool req, const std::wstring& argName );
|
||||||
|
|
||||||
|
static void gotOptional() { alreadyOptionalRef() = true; }
|
||||||
|
|
||||||
|
static bool& alreadyOptional() { return alreadyOptionalRef(); }
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
static bool& alreadyOptionalRef() { static bool ct = false; return ct; }
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
inline void OptionalUnlabeledTracker::check( bool req, const std::wstring& argName )
|
||||||
|
{
|
||||||
|
if ( OptionalUnlabeledTracker::alreadyOptional() )
|
||||||
|
throw( SpecificationException(
|
||||||
|
L"You can't specify ANY Unlabeled Arg following an optional Unlabeled Arg",
|
||||||
|
argName ) );
|
||||||
|
|
||||||
|
if ( !req )
|
||||||
|
OptionalUnlabeledTracker::gotOptional();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
} // namespace TCLAP
|
||||||
|
|
||||||
|
#endif
|
208
include/tclapw/StandardTraits.h
Normal file
208
include/tclapw/StandardTraits.h
Normal file
@ -0,0 +1,208 @@
|
|||||||
|
// -*- Mode: c++; c-basic-offset: 4; tab-width: 4; -*-
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
*
|
||||||
|
* file: StandardTraits.h
|
||||||
|
*
|
||||||
|
* Copyright (c) 2007, Daniel Aarno, 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.
|
||||||
|
*
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
// This is an internal tclapw file, you should probably not have to
|
||||||
|
// include this directly
|
||||||
|
|
||||||
|
#ifndef TCLAP_STANDARD_TRAITS_H
|
||||||
|
#define TCLAP_STANDARD_TRAITS_H
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
#include <config.h> // To check for long long
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// If Microsoft has already typedefL'd wchar_t as an unsigned
|
||||||
|
// short, then compiles will break because it's as if we're
|
||||||
|
// creating ArgTraits twice for unsigned short. Thus...
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
#ifndef _NATIVE_WCHAR_T_DEFINED
|
||||||
|
#define TCLAP_DONT_DECLARE_WCHAR_T_ARGTRAITS
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace TCLAP {
|
||||||
|
|
||||||
|
// ======================================================================
|
||||||
|
// Integer types
|
||||||
|
// ======================================================================
|
||||||
|
|
||||||
|
/**
|
||||||
|
* longs have value-like semantics.
|
||||||
|
*/
|
||||||
|
template<>
|
||||||
|
struct ArgTraits<long> {
|
||||||
|
typedef ValueLike ValueCategory;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ints have value-like semantics.
|
||||||
|
*/
|
||||||
|
template<>
|
||||||
|
struct ArgTraits<int> {
|
||||||
|
typedef ValueLike ValueCategory;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* shorts have value-like semantics.
|
||||||
|
*/
|
||||||
|
template<>
|
||||||
|
struct ArgTraits<short> {
|
||||||
|
typedef ValueLike ValueCategory;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* chars have value-like semantics.
|
||||||
|
*/
|
||||||
|
template<>
|
||||||
|
struct ArgTraits<char> {
|
||||||
|
typedef ValueLike ValueCategory;
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifdef HAVE_LONG_LONG
|
||||||
|
/**
|
||||||
|
* long longs have value-like semantics.
|
||||||
|
*/
|
||||||
|
template<>
|
||||||
|
struct ArgTraits<long long> {
|
||||||
|
typedef ValueLike ValueCategory;
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// ======================================================================
|
||||||
|
// Unsigned integer types
|
||||||
|
// ======================================================================
|
||||||
|
|
||||||
|
/**
|
||||||
|
* unsigned longs have value-like semantics.
|
||||||
|
*/
|
||||||
|
template<>
|
||||||
|
struct ArgTraits<unsigned long> {
|
||||||
|
typedef ValueLike ValueCategory;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* unsigned ints have value-like semantics.
|
||||||
|
*/
|
||||||
|
template<>
|
||||||
|
struct ArgTraits<unsigned int> {
|
||||||
|
typedef ValueLike ValueCategory;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* unsigned shorts have value-like semantics.
|
||||||
|
*/
|
||||||
|
template<>
|
||||||
|
struct ArgTraits<unsigned short> {
|
||||||
|
typedef ValueLike ValueCategory;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* unsigned chars have value-like semantics.
|
||||||
|
*/
|
||||||
|
template<>
|
||||||
|
struct ArgTraits<unsigned char> {
|
||||||
|
typedef ValueLike ValueCategory;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Microsoft implements size_t awkwardly.
|
||||||
|
#if defined(_MSC_VER) && defined(_M_X64)
|
||||||
|
/**
|
||||||
|
* size_ts have value-like semantics.
|
||||||
|
*/
|
||||||
|
template<>
|
||||||
|
struct ArgTraits<size_t> {
|
||||||
|
typedef ValueLike ValueCategory;
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef HAVE_LONG_LONG
|
||||||
|
/**
|
||||||
|
* unsigned long longs have value-like semantics.
|
||||||
|
*/
|
||||||
|
template<>
|
||||||
|
struct ArgTraits<unsigned long long> {
|
||||||
|
typedef ValueLike ValueCategory;
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// ======================================================================
|
||||||
|
// Float types
|
||||||
|
// ======================================================================
|
||||||
|
|
||||||
|
/**
|
||||||
|
* floats have value-like semantics.
|
||||||
|
*/
|
||||||
|
template<>
|
||||||
|
struct ArgTraits<float> {
|
||||||
|
typedef ValueLike ValueCategory;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* doubles have value-like semantics.
|
||||||
|
*/
|
||||||
|
template<>
|
||||||
|
struct ArgTraits<double> {
|
||||||
|
typedef ValueLike ValueCategory;
|
||||||
|
};
|
||||||
|
|
||||||
|
// ======================================================================
|
||||||
|
// Other types
|
||||||
|
// ======================================================================
|
||||||
|
|
||||||
|
/**
|
||||||
|
* bools have value-like semantics.
|
||||||
|
*/
|
||||||
|
template<>
|
||||||
|
struct ArgTraits<bool> {
|
||||||
|
typedef ValueLike ValueCategory;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* wchar_ts have value-like semantics.
|
||||||
|
*/
|
||||||
|
#ifndef TCLAP_DONT_DECLARE_WCHAR_T_ARGTRAITS
|
||||||
|
template<>
|
||||||
|
struct ArgTraits<wchar_t> {
|
||||||
|
typedef ValueLike ValueCategory;
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Strings have string like argument traits.
|
||||||
|
*/
|
||||||
|
template<>
|
||||||
|
struct ArgTraits<std::wstring> {
|
||||||
|
typedef StringLike ValueCategory;
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
void SetString(T &dst, const std::wstring &src)
|
||||||
|
{
|
||||||
|
dst = src;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
298
include/tclapw/StdOutput.h
Normal file
298
include/tclapw/StdOutput.h
Normal file
@ -0,0 +1,298 @@
|
|||||||
|
// -*- Mode: c++; c-basic-offset: 4; tab-width: 4; -*-
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
*
|
||||||
|
* file: StdOutput.h
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
#ifndef TCLAP_STDCMDLINEOUTPUT_H
|
||||||
|
#define TCLAP_STDCMDLINEOUTPUT_H
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
#include <list>
|
||||||
|
#include <iostream>
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
|
#include <tclapw/CmdLineInterface.h>
|
||||||
|
#include <tclapw/CmdLineOutput.h>
|
||||||
|
#include <tclapw/XorHandler.h>
|
||||||
|
#include <tclapw/Arg.h>
|
||||||
|
|
||||||
|
namespace TCLAP {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A class that isolates any output from the CmdLine object so that it
|
||||||
|
* may be easily modified.
|
||||||
|
*/
|
||||||
|
class StdOutput : public CmdLineOutput
|
||||||
|
{
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prints the usage to stdout. Can be overridden to
|
||||||
|
* produce alternative behavior.
|
||||||
|
* \param c - The CmdLine object the output is generated for.
|
||||||
|
*/
|
||||||
|
virtual void usage(CmdLineInterface& c);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prints the version to stdout. Can be overridden
|
||||||
|
* to produce alternative behavior.
|
||||||
|
* \param c - The CmdLine object the output is generated for.
|
||||||
|
*/
|
||||||
|
virtual void version(CmdLineInterface& c);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prints (to stderr) an error message, short usage
|
||||||
|
* Can be overridden to produce alternative behavior.
|
||||||
|
* \param c - The CmdLine object the output is generated for.
|
||||||
|
* \param e - The ArgException that caused the failure.
|
||||||
|
*/
|
||||||
|
virtual void failure(CmdLineInterface& c,
|
||||||
|
ArgException& e );
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Writes a brief usage message with short args.
|
||||||
|
* \param c - The CmdLine object the output is generated for.
|
||||||
|
* \param os - The stream to write the message to.
|
||||||
|
*/
|
||||||
|
void _shortUsage( CmdLineInterface& c, std::wostream& os ) const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Writes a longer usage message with long and short args,
|
||||||
|
* provides descriptions and prints message.
|
||||||
|
* \param c - The CmdLine object the output is generated for.
|
||||||
|
* \param os - The stream to write the message to.
|
||||||
|
*/
|
||||||
|
void _longUsage( CmdLineInterface& c, std::wostream& os ) const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This function inserts line breaks and indents long strings
|
||||||
|
* according the params input. It will only break lines at spaces,
|
||||||
|
* commas and pipes.
|
||||||
|
* \param os - The stream to be printed to.
|
||||||
|
* \param s - The string to be printed.
|
||||||
|
* \param maxWidth - The maxWidth allowed for the output line.
|
||||||
|
* \param indentSpaces - The number of spaces to indent the first line.
|
||||||
|
* \param secondLineOffset - The number of spaces to indent the second
|
||||||
|
* and all subsequent lines in addition to indentSpaces.
|
||||||
|
*/
|
||||||
|
void spacePrint( std::wostream& os,
|
||||||
|
const std::wstring& s,
|
||||||
|
int maxWidth,
|
||||||
|
int indentSpaces,
|
||||||
|
int secondLineOffset ) const;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
inline void StdOutput::version(CmdLineInterface& _cmd)
|
||||||
|
{
|
||||||
|
std::wstring progName = _cmd.getProgramName();
|
||||||
|
std::wstring xversion = _cmd.getVersion();
|
||||||
|
|
||||||
|
std::wcout << std::endl << progName << L" version: "
|
||||||
|
<< xversion << std::endl << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void StdOutput::usage(CmdLineInterface& _cmd )
|
||||||
|
{
|
||||||
|
std::wcout << std::endl << L"USAGE: " << std::endl << std::endl;
|
||||||
|
|
||||||
|
_shortUsage( _cmd, std::wcout );
|
||||||
|
|
||||||
|
std::wcout << std::endl << std::endl << L"Where: " << std::endl << std::endl;
|
||||||
|
|
||||||
|
_longUsage( _cmd, std::wcout );
|
||||||
|
|
||||||
|
std::wcout << std::endl;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void StdOutput::failure( CmdLineInterface& _cmd,
|
||||||
|
ArgException& e )
|
||||||
|
{
|
||||||
|
std::wstring progName = _cmd.getProgramName();
|
||||||
|
|
||||||
|
std::wcerr << L"PARSE ERROR: " << e.argId() << std::endl
|
||||||
|
<< L" " << e.error() << std::endl << std::endl;
|
||||||
|
|
||||||
|
if ( _cmd.hasHelpAndVersion() )
|
||||||
|
{
|
||||||
|
std::wcerr << L"Brief USAGE: " << std::endl;
|
||||||
|
|
||||||
|
_shortUsage( _cmd, std::wcerr );
|
||||||
|
|
||||||
|
std::wcerr << std::endl << L"For complete USAGE and HELP type: "
|
||||||
|
<< std::endl << L" " << progName << L" --help"
|
||||||
|
<< std::endl << std::endl;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
usage(_cmd);
|
||||||
|
|
||||||
|
throw ExitException(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void
|
||||||
|
StdOutput::_shortUsage( CmdLineInterface& _cmd,
|
||||||
|
std::wostream& os ) const
|
||||||
|
{
|
||||||
|
std::list<Arg*> argList = _cmd.getArgList();
|
||||||
|
std::wstring progName = _cmd.getProgramName();
|
||||||
|
XorHandler xorHandler = _cmd.getXorHandler();
|
||||||
|
std::vector< std::vector<Arg*> > xorList = xorHandler.getXorList();
|
||||||
|
|
||||||
|
std::wstring s = progName + L" ";
|
||||||
|
|
||||||
|
// first the xor
|
||||||
|
for ( int i = 0; static_cast<unsigned int>(i) < xorList.size(); i++ )
|
||||||
|
{
|
||||||
|
s += L" {";
|
||||||
|
for ( ArgVectorIterator it = xorList[i].begin();
|
||||||
|
it != xorList[i].end(); it++ )
|
||||||
|
s += (*it)->shortID() + L"|";
|
||||||
|
|
||||||
|
s[s.length()-1] = L'}';
|
||||||
|
}
|
||||||
|
|
||||||
|
// then the rest
|
||||||
|
for (ArgListIterator it = argList.begin(); it != argList.end(); it++)
|
||||||
|
if ( !xorHandler.contains( (*it) ) )
|
||||||
|
s += L" " + (*it)->shortID();
|
||||||
|
|
||||||
|
// if the program name is too long, then adjust the second line offset
|
||||||
|
int secondLineOffset = static_cast<int>(progName.length()) + 2;
|
||||||
|
if ( secondLineOffset > 75/2 )
|
||||||
|
secondLineOffset = static_cast<int>(75/2);
|
||||||
|
|
||||||
|
spacePrint( os, s, 75, 3, secondLineOffset );
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void
|
||||||
|
StdOutput::_longUsage( CmdLineInterface& _cmd,
|
||||||
|
std::wostream& os ) const
|
||||||
|
{
|
||||||
|
std::list<Arg*> argList = _cmd.getArgList();
|
||||||
|
std::wstring message = _cmd.getMessage();
|
||||||
|
XorHandler xorHandler = _cmd.getXorHandler();
|
||||||
|
std::vector< std::vector<Arg*> > xorList = xorHandler.getXorList();
|
||||||
|
|
||||||
|
// first the xor
|
||||||
|
for ( int i = 0; static_cast<unsigned int>(i) < xorList.size(); i++ )
|
||||||
|
{
|
||||||
|
for ( ArgVectorIterator it = xorList[i].begin();
|
||||||
|
it != xorList[i].end();
|
||||||
|
it++ )
|
||||||
|
{
|
||||||
|
spacePrint( os, (*it)->longID(), 75, 3, 3 );
|
||||||
|
spacePrint( os, (*it)->getDescription(), 75, 5, 0 );
|
||||||
|
|
||||||
|
if ( it+1 != xorList[i].end() )
|
||||||
|
spacePrint(os, L"-- OR --", 75, 9, 0);
|
||||||
|
}
|
||||||
|
os << std::endl << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
// then the rest
|
||||||
|
for (ArgListIterator 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 << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
os << std::endl;
|
||||||
|
|
||||||
|
spacePrint( os, message, 75, 3, 0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void StdOutput::spacePrint( std::wostream& os,
|
||||||
|
const std::wstring& s,
|
||||||
|
int maxWidth,
|
||||||
|
int indentSpaces,
|
||||||
|
int secondLineOffset ) const
|
||||||
|
{
|
||||||
|
int len = static_cast<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 = std::min<int>( len - start, allowedLen );
|
||||||
|
// doing it this way to support a VisualC++ 2005 bug
|
||||||
|
using namespace std;
|
||||||
|
int stringLen = min<int>( len - start, allowedLen );
|
||||||
|
|
||||||
|
// trim the length so it doesnL't end in middle of a word
|
||||||
|
if ( stringLen == allowedLen )
|
||||||
|
while ( stringLen >= 0 &&
|
||||||
|
s[stringLen+start] != L' ' &&
|
||||||
|
s[stringLen+start] != L',' &&
|
||||||
|
s[stringLen+start] != L'|' )
|
||||||
|
stringLen--;
|
||||||
|
|
||||||
|
// ok, the word is longer than the line, so just split
|
||||||
|
// wherever the line ends
|
||||||
|
if ( stringLen <= 0 )
|
||||||
|
stringLen = allowedLen;
|
||||||
|
|
||||||
|
// check for newlines
|
||||||
|
for ( int i = 0; i < stringLen; i++ )
|
||||||
|
if ( s[start+i] == L'\n' )
|
||||||
|
stringLen = i+1;
|
||||||
|
|
||||||
|
// print the indent
|
||||||
|
for ( int i = 0; i < indentSpaces; i++ )
|
||||||
|
os << L" ";
|
||||||
|
|
||||||
|
if ( start == 0 )
|
||||||
|
{
|
||||||
|
// handle second line offsets
|
||||||
|
indentSpaces += secondLineOffset;
|
||||||
|
|
||||||
|
// adjust allowed len
|
||||||
|
allowedLen -= secondLineOffset;
|
||||||
|
}
|
||||||
|
|
||||||
|
os << s.substr(start,stringLen) << std::endl;
|
||||||
|
|
||||||
|
// so we don't start a line with a space
|
||||||
|
while ( s[stringLen+start] == L' ' && start < len )
|
||||||
|
start++;
|
||||||
|
|
||||||
|
start += stringLen;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for ( int i = 0; i < indentSpaces; i++ )
|
||||||
|
os << L" ";
|
||||||
|
os << s << std::endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} //namespace TCLAP
|
||||||
|
#endif
|
266
include/tclapw/SwitchArg.h
Normal file
266
include/tclapw/SwitchArg.h
Normal file
@ -0,0 +1,266 @@
|
|||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
*
|
||||||
|
* file: SwitchArg.h
|
||||||
|
*
|
||||||
|
* Copyright (c) 2003, Michael E. Smoot .
|
||||||
|
* Copyright (c) 2004, Michael E. Smoot, Daniel Aarno.
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef TCLAP_SWITCH_ARG_H
|
||||||
|
#define TCLAP_SWITCH_ARG_H
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
#include <tclapw/Arg.h>
|
||||||
|
|
||||||
|
namespace TCLAP {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A simple switch argument. If the switch is set on the command line, then
|
||||||
|
* the getValue method will return the opposite of the default value for the
|
||||||
|
* switch.
|
||||||
|
*/
|
||||||
|
class SwitchArg : public Arg
|
||||||
|
{
|
||||||
|
protected:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The value of the switch.
|
||||||
|
*/
|
||||||
|
bool _value;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Used to support the reset() method so that ValueArg can be
|
||||||
|
* reset to their constructed value.
|
||||||
|
*/
|
||||||
|
bool _default;
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* SwitchArg constructor.
|
||||||
|
* \param flag - The one character flag that identifies this
|
||||||
|
* argument on the command line.
|
||||||
|
* \param name - A one word name for the argument. Can be
|
||||||
|
* used as a long flag on the command line.
|
||||||
|
* \param desc - A description of what the argument is for or
|
||||||
|
* does.
|
||||||
|
* \param def - The default value for this Switch.
|
||||||
|
* \param v - An optional visitor. You probably should not
|
||||||
|
* use this unless you have a very good reason.
|
||||||
|
*/
|
||||||
|
SwitchArg(const std::wstring& flag,
|
||||||
|
const std::wstring& name,
|
||||||
|
const std::wstring& desc,
|
||||||
|
bool def = false,
|
||||||
|
Visitor* v = NULL);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* SwitchArg constructor.
|
||||||
|
* \param flag - The one character flag that identifies this
|
||||||
|
* argument on the command line.
|
||||||
|
* \param name - A one word name for the argument. Can be
|
||||||
|
* used as a long flag on the command line.
|
||||||
|
* \param desc - A description of what the argument is for or
|
||||||
|
* does.
|
||||||
|
* \param parser - A CmdLine parser object to add this Arg to
|
||||||
|
* \param def - The default value for this Switch.
|
||||||
|
* \param v - An optional visitor. You probably should not
|
||||||
|
* use this unless you have a very good reason.
|
||||||
|
*/
|
||||||
|
SwitchArg(const std::wstring& flag,
|
||||||
|
const std::wstring& name,
|
||||||
|
const std::wstring& desc,
|
||||||
|
CmdLineInterface& parser,
|
||||||
|
bool def = false,
|
||||||
|
Visitor* v = NULL);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handles the processing of the argument.
|
||||||
|
* This re-implements the Arg version of this method to set the
|
||||||
|
* _value of the argument appropriately.
|
||||||
|
* \param i - Pointer the the current argument in the list.
|
||||||
|
* \param args - Mutable list of strings. Passed
|
||||||
|
* in from main().
|
||||||
|
*/
|
||||||
|
virtual bool processArg(int* i, std::vector<std::wstring>& args);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks a string to see if any of the chars in the string
|
||||||
|
* match the flag for this Switch.
|
||||||
|
*/
|
||||||
|
bool combinedSwitchesMatch(std::wstring& combined);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns bool, whether or not the switch has been set.
|
||||||
|
*/
|
||||||
|
bool getValue();
|
||||||
|
|
||||||
|
virtual void reset();
|
||||||
|
|
||||||
|
private:
|
||||||
|
/**
|
||||||
|
* Checks to see if weL've found the last match in
|
||||||
|
* a combined string.
|
||||||
|
*/
|
||||||
|
bool lastCombined(std::wstring& combined);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Does the common processing of processArg.
|
||||||
|
*/
|
||||||
|
void commonProcessing();
|
||||||
|
};
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////
|
||||||
|
//BEGIN SwitchArg.cpp
|
||||||
|
//////////////////////////////////////////////////////////////////////
|
||||||
|
inline SwitchArg::SwitchArg(const std::wstring& flag,
|
||||||
|
const std::wstring& name,
|
||||||
|
const std::wstring& desc,
|
||||||
|
bool default_val,
|
||||||
|
Visitor* v )
|
||||||
|
: Arg(flag, name, desc, false, false, v),
|
||||||
|
_value( default_val ),
|
||||||
|
_default( default_val )
|
||||||
|
{ }
|
||||||
|
|
||||||
|
inline SwitchArg::SwitchArg(const std::wstring& flag,
|
||||||
|
const std::wstring& name,
|
||||||
|
const std::wstring& desc,
|
||||||
|
CmdLineInterface& parser,
|
||||||
|
bool default_val,
|
||||||
|
Visitor* v )
|
||||||
|
: Arg(flag, name, desc, false, false, v),
|
||||||
|
_value( default_val ),
|
||||||
|
_default(default_val)
|
||||||
|
{
|
||||||
|
parser.add( this );
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool SwitchArg::getValue() { return _value; }
|
||||||
|
|
||||||
|
inline bool SwitchArg::lastCombined(std::wstring& combinedSwitches )
|
||||||
|
{
|
||||||
|
for ( unsigned int i = 1; i < combinedSwitches.length(); i++ )
|
||||||
|
if ( combinedSwitches[i] != Arg::blankChar() )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool SwitchArg::combinedSwitchesMatch(std::wstring& combinedSwitches )
|
||||||
|
{
|
||||||
|
// make sure this is actually a combined switch
|
||||||
|
if ( combinedSwitches.length() > 0 &&
|
||||||
|
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;
|
||||||
|
|
||||||
|
// make sure the delimiter isnL't in the string
|
||||||
|
if ( combinedSwitches.find_first_of( Arg::delimiter() ) != std::wstring::npos )
|
||||||
|
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 ( _flag.length() > 0 &&
|
||||||
|
combinedSwitches[i] == _flag[0] &&
|
||||||
|
_flag[0] != Arg::flagStartString()[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;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void SwitchArg::commonProcessing()
|
||||||
|
{
|
||||||
|
if ( _xorSet )
|
||||||
|
throw(CmdLineParseException(
|
||||||
|
L"Mutually exclusive argument already set!", toString()));
|
||||||
|
|
||||||
|
if ( _alreadySet )
|
||||||
|
throw(CmdLineParseException(L"Argument already set!", toString()));
|
||||||
|
|
||||||
|
_alreadySet = true;
|
||||||
|
|
||||||
|
if ( _value == true )
|
||||||
|
_value = false;
|
||||||
|
else
|
||||||
|
_value = true;
|
||||||
|
|
||||||
|
_checkWithVisitor();
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool SwitchArg::processArg(int *i, std::vector<std::wstring>& args)
|
||||||
|
{
|
||||||
|
if ( _ignoreable && Arg::ignoreRest() )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// if the whole string matches the flag or name string
|
||||||
|
if ( argMatches( args[*i] ) )
|
||||||
|
{
|
||||||
|
commonProcessing();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
// if a substring matches the flag as part of a combination
|
||||||
|
else if ( combinedSwitchesMatch( args[*i] ) )
|
||||||
|
{
|
||||||
|
// check again to ensure we donL't misinterpret
|
||||||
|
// this as a MultiSwitchArg
|
||||||
|
if ( combinedSwitchesMatch( args[*i] ) )
|
||||||
|
throw(CmdLineParseException(L"Argument already set!",
|
||||||
|
toString()));
|
||||||
|
|
||||||
|
commonProcessing();
|
||||||
|
|
||||||
|
// We only want to return true if we've found the last combined
|
||||||
|
// match in the string, otherwise we return true so that other
|
||||||
|
// switches in the combination will have a chance to match.
|
||||||
|
return lastCombined( args[*i] );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void SwitchArg::reset()
|
||||||
|
{
|
||||||
|
Arg::reset();
|
||||||
|
_value = _default;
|
||||||
|
}
|
||||||
|
//////////////////////////////////////////////////////////////////////
|
||||||
|
//End SwitchArg.cpp
|
||||||
|
//////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
} //namespace TCLAP
|
||||||
|
|
||||||
|
#endif
|
301
include/tclapw/UnlabeledMultiArg.h
Normal file
301
include/tclapw/UnlabeledMultiArg.h
Normal file
@ -0,0 +1,301 @@
|
|||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
*
|
||||||
|
* file: UnlabeledMultiArg.h
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef TCLAP_MULTIPLE_UNLABELED_ARGUMENT_H
|
||||||
|
#define TCLAP_MULTIPLE_UNLABELED_ARGUMENT_H
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
#include <tclapw/MultiArg.h>
|
||||||
|
#include <tclapw/OptionalUnlabeledTracker.h>
|
||||||
|
|
||||||
|
namespace TCLAP {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Just like a MultiArg, except that the arguments are unlabeled. Basically,
|
||||||
|
* this Arg will slurp up everything that hasnL't been matched to another
|
||||||
|
* Arg.
|
||||||
|
*/
|
||||||
|
template<class T>
|
||||||
|
class UnlabeledMultiArg : public MultiArg<T>
|
||||||
|
{
|
||||||
|
|
||||||
|
// If compiler has two stage name lookup (as gcc >= 3.4 does)
|
||||||
|
// this is requried to prevent undef. symbols
|
||||||
|
using MultiArg<T>::_ignoreable;
|
||||||
|
using MultiArg<T>::_hasBlanks;
|
||||||
|
using MultiArg<T>::_extractValue;
|
||||||
|
using MultiArg<T>::_typeDesc;
|
||||||
|
using MultiArg<T>::_name;
|
||||||
|
using MultiArg<T>::_description;
|
||||||
|
using MultiArg<T>::_alreadySet;
|
||||||
|
using MultiArg<T>::toString;
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor.
|
||||||
|
* \param name - The name of the Arg. Note that this is used for
|
||||||
|
* identification, not as a long flag.
|
||||||
|
* \param desc - A description of what the argument is for or
|
||||||
|
* does.
|
||||||
|
* \param req - Whether the argument is required on the command
|
||||||
|
* line.
|
||||||
|
* \param typeDesc - A short, human readable description of the
|
||||||
|
* type that this object expects. This is used in the generation
|
||||||
|
* of the USAGE statement. The goal is to be helpful to the end user
|
||||||
|
* of the program.
|
||||||
|
* \param ignoreable - Whether or not this argument can be ignored
|
||||||
|
* using the "--" flag.
|
||||||
|
* \param v - An optional visitor. You probably should not
|
||||||
|
* use this unless you have a very good reason.
|
||||||
|
*/
|
||||||
|
UnlabeledMultiArg( const std::wstring& name,
|
||||||
|
const std::wstring& desc,
|
||||||
|
bool req,
|
||||||
|
const std::wstring& typeDesc,
|
||||||
|
bool ignoreable = false,
|
||||||
|
Visitor* v = NULL );
|
||||||
|
/**
|
||||||
|
* Constructor.
|
||||||
|
* \param name - The name of the Arg. Note that this is used for
|
||||||
|
* identification, not as a long flag.
|
||||||
|
* \param desc - A description of what the argument is for or
|
||||||
|
* does.
|
||||||
|
* \param req - Whether the argument is required on the command
|
||||||
|
* line.
|
||||||
|
* \param typeDesc - A short, human readable description of the
|
||||||
|
* type that this object expects. This is used in the generation
|
||||||
|
* of the USAGE statement. The goal is to be helpful to the end user
|
||||||
|
* of the program.
|
||||||
|
* \param parser - A CmdLine parser object to add this Arg to
|
||||||
|
* \param ignoreable - Whether or not this argument can be ignored
|
||||||
|
* using the "--" flag.
|
||||||
|
* \param v - An optional visitor. You probably should not
|
||||||
|
* use this unless you have a very good reason.
|
||||||
|
*/
|
||||||
|
UnlabeledMultiArg( const std::wstring& name,
|
||||||
|
const std::wstring& desc,
|
||||||
|
bool req,
|
||||||
|
const std::wstring& typeDesc,
|
||||||
|
CmdLineInterface& parser,
|
||||||
|
bool ignoreable = false,
|
||||||
|
Visitor* v = NULL );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor.
|
||||||
|
* \param name - The name of the Arg. Note that this is used for
|
||||||
|
* identification, not as a long flag.
|
||||||
|
* \param desc - A description of what the argument is for or
|
||||||
|
* does.
|
||||||
|
* \param req - Whether the argument is required on the command
|
||||||
|
* line.
|
||||||
|
* \param constraint - A pointer to a Constraint object used
|
||||||
|
* to constrain this Arg.
|
||||||
|
* \param ignoreable - Whether or not this argument can be ignored
|
||||||
|
* using the "--" flag.
|
||||||
|
* \param v - An optional visitor. You probably should not
|
||||||
|
* use this unless you have a very good reason.
|
||||||
|
*/
|
||||||
|
UnlabeledMultiArg( const std::wstring& name,
|
||||||
|
const std::wstring& desc,
|
||||||
|
bool req,
|
||||||
|
Constraint<T>* constraint,
|
||||||
|
bool ignoreable = false,
|
||||||
|
Visitor* v = NULL );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor.
|
||||||
|
* \param name - The name of the Arg. Note that this is used for
|
||||||
|
* identification, not as a long flag.
|
||||||
|
* \param desc - A description of what the argument is for or
|
||||||
|
* does.
|
||||||
|
* \param req - Whether the argument is required on the command
|
||||||
|
* line.
|
||||||
|
* \param constraint - A pointer to a Constraint object used
|
||||||
|
* to constrain this Arg.
|
||||||
|
* \param parser - A CmdLine parser object to add this Arg to
|
||||||
|
* \param ignoreable - Whether or not this argument can be ignored
|
||||||
|
* using the "--" flag.
|
||||||
|
* \param v - An optional visitor. You probably should not
|
||||||
|
* use this unless you have a very good reason.
|
||||||
|
*/
|
||||||
|
UnlabeledMultiArg( const std::wstring& name,
|
||||||
|
const std::wstring& desc,
|
||||||
|
bool req,
|
||||||
|
Constraint<T>* constraint,
|
||||||
|
CmdLineInterface& parser,
|
||||||
|
bool ignoreable = false,
|
||||||
|
Visitor* v = NULL );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handles the processing of the argument.
|
||||||
|
* This re-implements the Arg version of this method to set the
|
||||||
|
* _value of the argument appropriately. It knows the difference
|
||||||
|
* between labeled and unlabeled.
|
||||||
|
* \param i - Pointer the the current argument in the list.
|
||||||
|
* \param args - Mutable list of strings. Passed from main().
|
||||||
|
*/
|
||||||
|
virtual bool processArg(int* i, std::vector<std::wstring>& args);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the a short id string. Used in the usage.
|
||||||
|
* \param val - value to be used.
|
||||||
|
*/
|
||||||
|
virtual std::wstring shortID(const std::wstring& val="val") const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the a long id string. Used in the usage.
|
||||||
|
* \param val - value to be used.
|
||||||
|
*/
|
||||||
|
virtual std::wstring longID(const std::wstring& val="val") const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Opertor ==.
|
||||||
|
* \param a - The Arg to be compared to this.
|
||||||
|
*/
|
||||||
|
virtual bool operator==(const Arg& a) const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Pushes this to back of list rather than front.
|
||||||
|
* \param argList - The list this should be added to.
|
||||||
|
*/
|
||||||
|
virtual void addToList( std::list<Arg*>& argList ) const;
|
||||||
|
};
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
UnlabeledMultiArg<T>::UnlabeledMultiArg(const std::wstring& name,
|
||||||
|
const std::wstring& desc,
|
||||||
|
bool req,
|
||||||
|
const std::wstring& typeDesc,
|
||||||
|
bool ignoreable,
|
||||||
|
Visitor* v)
|
||||||
|
: MultiArg<T>("", name, desc, req, typeDesc, v)
|
||||||
|
{
|
||||||
|
_ignoreable = ignoreable;
|
||||||
|
OptionalUnlabeledTracker::check(true, toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
UnlabeledMultiArg<T>::UnlabeledMultiArg(const std::wstring& name,
|
||||||
|
const std::wstring& desc,
|
||||||
|
bool req,
|
||||||
|
const std::wstring& typeDesc,
|
||||||
|
CmdLineInterface& parser,
|
||||||
|
bool ignoreable,
|
||||||
|
Visitor* v)
|
||||||
|
: MultiArg<T>(L"", name, desc, req, typeDesc, v)
|
||||||
|
{
|
||||||
|
_ignoreable = ignoreable;
|
||||||
|
OptionalUnlabeledTracker::check(true, toString());
|
||||||
|
parser.add( this );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
UnlabeledMultiArg<T>::UnlabeledMultiArg(const std::wstring& name,
|
||||||
|
const std::wstring& desc,
|
||||||
|
bool req,
|
||||||
|
Constraint<T>* constraint,
|
||||||
|
bool ignoreable,
|
||||||
|
Visitor* v)
|
||||||
|
: MultiArg<T>("", name, desc, req, constraint, v)
|
||||||
|
{
|
||||||
|
_ignoreable = ignoreable;
|
||||||
|
OptionalUnlabeledTracker::check(true, toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
UnlabeledMultiArg<T>::UnlabeledMultiArg(const std::wstring& name,
|
||||||
|
const std::wstring& desc,
|
||||||
|
bool req,
|
||||||
|
Constraint<T>* constraint,
|
||||||
|
CmdLineInterface& parser,
|
||||||
|
bool ignoreable,
|
||||||
|
Visitor* v)
|
||||||
|
: MultiArg<T>("", name, desc, req, constraint, v)
|
||||||
|
{
|
||||||
|
_ignoreable = ignoreable;
|
||||||
|
OptionalUnlabeledTracker::check(true, toString());
|
||||||
|
parser.add( this );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
bool UnlabeledMultiArg<T>::processArg(int *i, std::vector<std::wstring>& args)
|
||||||
|
{
|
||||||
|
|
||||||
|
if ( _hasBlanks( args[*i] ) )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// never ignore an unlabeled multi arg
|
||||||
|
|
||||||
|
|
||||||
|
// always take the first value, regardless of the start string
|
||||||
|
_extractValue( args[(*i)] );
|
||||||
|
|
||||||
|
/*
|
||||||
|
// continue taking args until we hit the end or a start string
|
||||||
|
while ( (unsigned int)(*i)+1 < args.size() &&
|
||||||
|
args[(*i)+1].find_first_of( Arg::flagStartString() ) != 0 &&
|
||||||
|
args[(*i)+1].find_first_of( Arg::nameStartString() ) != 0 )
|
||||||
|
_extractValue( args[++(*i)] );
|
||||||
|
*/
|
||||||
|
|
||||||
|
_alreadySet = true;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
std::wstring UnlabeledMultiArg<T>::shortID(const std::wstring& val) const
|
||||||
|
{
|
||||||
|
static_cast<void>(val); // Ignore input, don't warn
|
||||||
|
return std::wstring(L"<") + _typeDesc + L"> ...";
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
std::wstring UnlabeledMultiArg<T>::longID(const std::wstring& val) const
|
||||||
|
{
|
||||||
|
static_cast<void>(val); // Ignore input, don't warn
|
||||||
|
return std::wstring(L"<") + _typeDesc + L"> (accepted multiple times)";
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
bool UnlabeledMultiArg<T>::operator==(const Arg& a) const
|
||||||
|
{
|
||||||
|
if ( _name == a.getName() || _description == a.getDescription() )
|
||||||
|
return true;
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
void UnlabeledMultiArg<T>::addToList( std::list<Arg*>& argList ) const
|
||||||
|
{
|
||||||
|
argList.push_back( const_cast<Arg*>(static_cast<const Arg* const>(this)) );
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
340
include/tclapw/UnlabeledValueArg.h
Normal file
340
include/tclapw/UnlabeledValueArg.h
Normal file
@ -0,0 +1,340 @@
|
|||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
*
|
||||||
|
* file: UnlabeledValueArg.h
|
||||||
|
*
|
||||||
|
* Copyright (c) 2003, Michael E. Smoot .
|
||||||
|
* Copyright (c) 2004, Michael E. Smoot, Daniel Aarno.
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef TCLAP_UNLABELED_VALUE_ARGUMENT_H
|
||||||
|
#define TCLAP_UNLABELED_VALUE_ARGUMENT_H
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
#include <tclapw/ValueArg.h>
|
||||||
|
#include <tclapw/OptionalUnlabeledTracker.h>
|
||||||
|
|
||||||
|
|
||||||
|
namespace TCLAP {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The basic unlabeled argument that parses a value.
|
||||||
|
* This is a template class, which means the type T defines the type
|
||||||
|
* that a given object will attempt to parse when an UnlabeledValueArg
|
||||||
|
* is reached in the list of args that the CmdLine iterates over.
|
||||||
|
*/
|
||||||
|
template<class T>
|
||||||
|
class UnlabeledValueArg : public ValueArg<T>
|
||||||
|
{
|
||||||
|
|
||||||
|
// If compiler has two stage name lookup (as gcc >= 3.4 does)
|
||||||
|
// this is requried to prevent undef. symbols
|
||||||
|
using ValueArg<T>::_ignoreable;
|
||||||
|
using ValueArg<T>::_hasBlanks;
|
||||||
|
using ValueArg<T>::_extractValue;
|
||||||
|
using ValueArg<T>::_typeDesc;
|
||||||
|
using ValueArg<T>::_name;
|
||||||
|
using ValueArg<T>::_description;
|
||||||
|
using ValueArg<T>::_alreadySet;
|
||||||
|
using ValueArg<T>::toString;
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* UnlabeledValueArg constructor.
|
||||||
|
* \param name - A one word name for the argument. Note that this is used for
|
||||||
|
* identification, not as a long flag.
|
||||||
|
* \param desc - A description of what the argument is for or
|
||||||
|
* does.
|
||||||
|
* \param req - Whether the argument is required on the command
|
||||||
|
* line.
|
||||||
|
* \param value - The default value assigned to this argument if it
|
||||||
|
* is not present on the command line.
|
||||||
|
* \param typeDesc - A short, human readable description of the
|
||||||
|
* type that this object expects. This is used in the generation
|
||||||
|
* of the USAGE statement. The goal is to be helpful to the end user
|
||||||
|
* of the program.
|
||||||
|
* \param ignoreable - Allows you to specify that this argument can be
|
||||||
|
* ignored if the L'--' flag is set. This defaults to false (cannot
|
||||||
|
* be ignored) and should generally stay that way unless you have
|
||||||
|
* some special need for certain arguments to be ignored.
|
||||||
|
* \param v - Optional Vistor. You should leave this blank unless
|
||||||
|
* you have a very good reason.
|
||||||
|
*/
|
||||||
|
UnlabeledValueArg( const std::wstring& name,
|
||||||
|
const std::wstring& desc,
|
||||||
|
bool req,
|
||||||
|
T value,
|
||||||
|
const std::wstring& typeDesc,
|
||||||
|
bool ignoreable = false,
|
||||||
|
Visitor* v = NULL);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* UnlabeledValueArg constructor.
|
||||||
|
* \param name - A one word name for the argument. Note that this is used for
|
||||||
|
* identification, not as a long flag.
|
||||||
|
* \param desc - A description of what the argument is for or
|
||||||
|
* does.
|
||||||
|
* \param req - Whether the argument is required on the command
|
||||||
|
* line.
|
||||||
|
* \param value - The default value assigned to this argument if it
|
||||||
|
* is not present on the command line.
|
||||||
|
* \param typeDesc - A short, human readable description of the
|
||||||
|
* type that this object expects. This is used in the generation
|
||||||
|
* of the USAGE statement. The goal is to be helpful to the end user
|
||||||
|
* of the program.
|
||||||
|
* \param parser - A CmdLine parser object to add this Arg to
|
||||||
|
* \param ignoreable - Allows you to specify that this argument can be
|
||||||
|
* ignored if the L'--' flag is set. This defaults to false (cannot
|
||||||
|
* be ignored) and should generally stay that way unless you have
|
||||||
|
* some special need for certain arguments to be ignored.
|
||||||
|
* \param v - Optional Vistor. You should leave this blank unless
|
||||||
|
* you have a very good reason.
|
||||||
|
*/
|
||||||
|
UnlabeledValueArg( const std::wstring& name,
|
||||||
|
const std::wstring& desc,
|
||||||
|
bool req,
|
||||||
|
T value,
|
||||||
|
const std::wstring& typeDesc,
|
||||||
|
CmdLineInterface& parser,
|
||||||
|
bool ignoreable = false,
|
||||||
|
Visitor* v = NULL );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* UnlabeledValueArg constructor.
|
||||||
|
* \param name - A one word name for the argument. Note that this is used for
|
||||||
|
* identification, not as a long flag.
|
||||||
|
* \param desc - A description of what the argument is for or
|
||||||
|
* does.
|
||||||
|
* \param req - Whether the argument is required on the command
|
||||||
|
* line.
|
||||||
|
* \param value - The default value assigned to this argument if it
|
||||||
|
* is not present on the command line.
|
||||||
|
* \param constraint - A pointer to a Constraint object used
|
||||||
|
* to constrain this Arg.
|
||||||
|
* \param ignoreable - Allows you to specify that this argument can be
|
||||||
|
* ignored if the L'--' flag is set. This defaults to false (cannot
|
||||||
|
* be ignored) and should generally stay that way unless you have
|
||||||
|
* some special need for certain arguments to be ignored.
|
||||||
|
* \param v - Optional Vistor. You should leave this blank unless
|
||||||
|
* you have a very good reason.
|
||||||
|
*/
|
||||||
|
UnlabeledValueArg( const std::wstring& name,
|
||||||
|
const std::wstring& desc,
|
||||||
|
bool req,
|
||||||
|
T value,
|
||||||
|
Constraint<T>* constraint,
|
||||||
|
bool ignoreable = false,
|
||||||
|
Visitor* v = NULL );
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* UnlabeledValueArg constructor.
|
||||||
|
* \param name - A one word name for the argument. Note that this is used for
|
||||||
|
* identification, not as a long flag.
|
||||||
|
* \param desc - A description of what the argument is for or
|
||||||
|
* does.
|
||||||
|
* \param req - Whether the argument is required on the command
|
||||||
|
* line.
|
||||||
|
* \param value - The default value assigned to this argument if it
|
||||||
|
* is not present on the command line.
|
||||||
|
* \param constraint - A pointer to a Constraint object used
|
||||||
|
* to constrain this Arg.
|
||||||
|
* \param parser - A CmdLine parser object to add this Arg to
|
||||||
|
* \param ignoreable - Allows you to specify that this argument can be
|
||||||
|
* ignored if the L'--' flag is set. This defaults to false (cannot
|
||||||
|
* be ignored) and should generally stay that way unless you have
|
||||||
|
* some special need for certain arguments to be ignored.
|
||||||
|
* \param v - Optional Vistor. You should leave this blank unless
|
||||||
|
* you have a very good reason.
|
||||||
|
*/
|
||||||
|
UnlabeledValueArg( const std::wstring& name,
|
||||||
|
const std::wstring& desc,
|
||||||
|
bool req,
|
||||||
|
T value,
|
||||||
|
Constraint<T>* constraint,
|
||||||
|
CmdLineInterface& parser,
|
||||||
|
bool ignoreable = false,
|
||||||
|
Visitor* v = NULL);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handles the processing of the argument.
|
||||||
|
* This re-implements the Arg version of this method to set the
|
||||||
|
* _value of the argument appropriately. Handling specific to
|
||||||
|
* unlabled arguments.
|
||||||
|
* \param i - Pointer the the current argument in the list.
|
||||||
|
* \param args - Mutable list of strings.
|
||||||
|
*/
|
||||||
|
virtual bool processArg(int* i, std::vector<std::wstring>& args);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Overrides shortID for specific behavior.
|
||||||
|
*/
|
||||||
|
virtual std::wstring shortID(const std::wstring& val=L"val") const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Overrides longID for specific behavior.
|
||||||
|
*/
|
||||||
|
virtual std::wstring longID(const std::wstring& val=L"val") const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Overrides operator== for specific behavior.
|
||||||
|
*/
|
||||||
|
virtual bool operator==(const Arg& a ) const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Instead of pushing to the front of list, push to the back.
|
||||||
|
* \param argList - The list to add this to.
|
||||||
|
*/
|
||||||
|
virtual void addToList( std::list<Arg*>& argList ) const;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor implemenation.
|
||||||
|
*/
|
||||||
|
template<class T>
|
||||||
|
UnlabeledValueArg<T>::UnlabeledValueArg(const std::wstring& name,
|
||||||
|
const std::wstring& desc,
|
||||||
|
bool req,
|
||||||
|
T val,
|
||||||
|
const std::wstring& typeDesc,
|
||||||
|
bool ignoreable,
|
||||||
|
Visitor* v)
|
||||||
|
: ValueArg<T>(L"", name, desc, req, val, typeDesc, v)
|
||||||
|
{
|
||||||
|
_ignoreable = ignoreable;
|
||||||
|
|
||||||
|
OptionalUnlabeledTracker::check(req, toString());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
UnlabeledValueArg<T>::UnlabeledValueArg(const std::wstring& name,
|
||||||
|
const std::wstring& desc,
|
||||||
|
bool req,
|
||||||
|
T val,
|
||||||
|
const std::wstring& typeDesc,
|
||||||
|
CmdLineInterface& parser,
|
||||||
|
bool ignoreable,
|
||||||
|
Visitor* v)
|
||||||
|
: ValueArg<T>(L"", name, desc, req, val, typeDesc, v)
|
||||||
|
{
|
||||||
|
_ignoreable = ignoreable;
|
||||||
|
OptionalUnlabeledTracker::check(req, toString());
|
||||||
|
parser.add( this );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor implemenation.
|
||||||
|
*/
|
||||||
|
template<class T>
|
||||||
|
UnlabeledValueArg<T>::UnlabeledValueArg(const std::wstring& name,
|
||||||
|
const std::wstring& desc,
|
||||||
|
bool req,
|
||||||
|
T val,
|
||||||
|
Constraint<T>* constraint,
|
||||||
|
bool ignoreable,
|
||||||
|
Visitor* v)
|
||||||
|
: ValueArg<T>(L"", name, desc, req, val, constraint, v)
|
||||||
|
{
|
||||||
|
_ignoreable = ignoreable;
|
||||||
|
OptionalUnlabeledTracker::check(req, toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
UnlabeledValueArg<T>::UnlabeledValueArg(const std::wstring& name,
|
||||||
|
const std::wstring& desc,
|
||||||
|
bool req,
|
||||||
|
T val,
|
||||||
|
Constraint<T>* constraint,
|
||||||
|
CmdLineInterface& parser,
|
||||||
|
bool ignoreable,
|
||||||
|
Visitor* v)
|
||||||
|
: ValueArg<T>(L"", name, desc, req, val, constraint, v)
|
||||||
|
{
|
||||||
|
_ignoreable = ignoreable;
|
||||||
|
OptionalUnlabeledTracker::check(req, toString());
|
||||||
|
parser.add( this );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Implementation of processArg().
|
||||||
|
*/
|
||||||
|
template<class T>
|
||||||
|
bool UnlabeledValueArg<T>::processArg(int *i, std::vector<std::wstring>& args)
|
||||||
|
{
|
||||||
|
|
||||||
|
if ( _alreadySet )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if ( _hasBlanks( args[*i] ) )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// never ignore an unlabeled arg
|
||||||
|
|
||||||
|
_extractValue( args[*i] );
|
||||||
|
_alreadySet = true;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Overriding shortID for specific output.
|
||||||
|
*/
|
||||||
|
template<class T>
|
||||||
|
std::wstring UnlabeledValueArg<T>::shortID(const std::wstring& val) const
|
||||||
|
{
|
||||||
|
static_cast<void>(val); // Ignore input, donL't warn
|
||||||
|
return std::wstring("<") + _typeDesc + ">";
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Overriding longID for specific output.
|
||||||
|
*/
|
||||||
|
template<class T>
|
||||||
|
std::wstring UnlabeledValueArg<T>::longID(const std::wstring& val) const
|
||||||
|
{
|
||||||
|
static_cast<void>(val); // Ignore input, don't warn
|
||||||
|
|
||||||
|
// Ideally we would like to be able to use RTTI to return the name
|
||||||
|
// of the type required for this argument. However, g++ at least,
|
||||||
|
// doesn't appear to return terribly useful L"names" of the types.
|
||||||
|
return std::wstring(L"<") + _typeDesc + L">";
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Overriding operator== for specific behavior.
|
||||||
|
*/
|
||||||
|
template<class T>
|
||||||
|
bool UnlabeledValueArg<T>::operator==(const Arg& a ) const
|
||||||
|
{
|
||||||
|
if ( _name == a.getName() || _description == a.getDescription() )
|
||||||
|
return true;
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
void UnlabeledValueArg<T>::addToList( std::list<Arg*>& argList ) const
|
||||||
|
{
|
||||||
|
argList.push_back( const_cast<Arg*>(static_cast<const Arg* const>(this)) );
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
#endif
|
425
include/tclapw/ValueArg.h
Normal file
425
include/tclapw/ValueArg.h
Normal file
@ -0,0 +1,425 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
*
|
||||||
|
* file: ValueArg.h
|
||||||
|
*
|
||||||
|
* Copyright (c) 2003, Michael E. Smoot .
|
||||||
|
* Copyright (c) 2004, Michael E. Smoot, Daniel Aarno.
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef TCLAP_VALUE_ARGUMENT_H
|
||||||
|
#define TCLAP_VALUE_ARGUMENT_H
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
#include <tclapw/Arg.h>
|
||||||
|
#include <tclapw/Constraint.h>
|
||||||
|
|
||||||
|
namespace TCLAP {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The basic labeled argument that parses a value.
|
||||||
|
* This is a template class, which means the type T defines the type
|
||||||
|
* that a given object will attempt to parse when the flag/name is matched
|
||||||
|
* on the command line. While there is nothing stopping you from creating
|
||||||
|
* an unflagged ValueArg, it is unwise and would cause significant problems.
|
||||||
|
* Instead use an UnlabeledValueArg.
|
||||||
|
*/
|
||||||
|
template<class T>
|
||||||
|
class ValueArg : public Arg
|
||||||
|
{
|
||||||
|
protected:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The value parsed from the command line.
|
||||||
|
* Can be of any type, as long as the >> operator for the type
|
||||||
|
* is defined.
|
||||||
|
*/
|
||||||
|
T _value;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Used to support the reset() method so that ValueArg can be
|
||||||
|
* reset to their constructed value.
|
||||||
|
*/
|
||||||
|
T _default;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A human readable description of the type to be parsed.
|
||||||
|
* This is a hack, plain and simple. Ideally we would use RTTI to
|
||||||
|
* return the name of type T, but until there is some sort of
|
||||||
|
* consistent support for human readable names, we are left to our
|
||||||
|
* own devices.
|
||||||
|
*/
|
||||||
|
std::wstring _typeDesc;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A Constraint this Arg must conform to.
|
||||||
|
*/
|
||||||
|
Constraint<T>* _constraint;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Extracts the value from the string.
|
||||||
|
* Attempts to parse string as type T, if this fails an exception
|
||||||
|
* is thrown.
|
||||||
|
* \param val - value to be parsed.
|
||||||
|
*/
|
||||||
|
void _extractValue( const std::wstring& val );
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Labeled ValueArg constructor.
|
||||||
|
* You could conceivably call this constructor with a blank flag,
|
||||||
|
* but that would make you a bad person. It would also cause
|
||||||
|
* an exception to be thrown. If you want an unlabeled argument,
|
||||||
|
* use the other constructor.
|
||||||
|
* \param flag - The one character flag that identifies this
|
||||||
|
* argument on the command line.
|
||||||
|
* \param name - A one word name for the argument. Can be
|
||||||
|
* used as a long flag on the command line.
|
||||||
|
* \param desc - A description of what the argument is for or
|
||||||
|
* does.
|
||||||
|
* \param req - Whether the argument is required on the command
|
||||||
|
* line.
|
||||||
|
* \param value - The default value assigned to this argument if it
|
||||||
|
* is not present on the command line.
|
||||||
|
* \param typeDesc - A short, human readable description of the
|
||||||
|
* type that this object expects. This is used in the generation
|
||||||
|
* of the USAGE statement. The goal is to be helpful to the end user
|
||||||
|
* of the program.
|
||||||
|
* \param v - An optional visitor. You probably should not
|
||||||
|
* use this unless you have a very good reason.
|
||||||
|
*/
|
||||||
|
ValueArg( const std::wstring& flag,
|
||||||
|
const std::wstring& name,
|
||||||
|
const std::wstring& desc,
|
||||||
|
bool req,
|
||||||
|
T value,
|
||||||
|
const std::wstring& typeDesc,
|
||||||
|
Visitor* v = NULL);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Labeled ValueArg constructor.
|
||||||
|
* You could conceivably call this constructor with a blank flag,
|
||||||
|
* but that would make you a bad person. It would also cause
|
||||||
|
* an exception to be thrown. If you want an unlabeled argument,
|
||||||
|
* use the other constructor.
|
||||||
|
* \param flag - The one character flag that identifies this
|
||||||
|
* argument on the command line.
|
||||||
|
* \param name - A one word name for the argument. Can be
|
||||||
|
* used as a long flag on the command line.
|
||||||
|
* \param desc - A description of what the argument is for or
|
||||||
|
* does.
|
||||||
|
* \param req - Whether the argument is required on the command
|
||||||
|
* line.
|
||||||
|
* \param value - The default value assigned to this argument if it
|
||||||
|
* is not present on the command line.
|
||||||
|
* \param typeDesc - A short, human readable description of the
|
||||||
|
* type that this object expects. This is used in the generation
|
||||||
|
* of the USAGE statement. The goal is to be helpful to the end user
|
||||||
|
* of the program.
|
||||||
|
* \param parser - A CmdLine parser object to add this Arg to
|
||||||
|
* \param v - An optional visitor. You probably should not
|
||||||
|
* use this unless you have a very good reason.
|
||||||
|
*/
|
||||||
|
ValueArg( const std::wstring& flag,
|
||||||
|
const std::wstring& name,
|
||||||
|
const std::wstring& desc,
|
||||||
|
bool req,
|
||||||
|
T value,
|
||||||
|
const std::wstring& typeDesc,
|
||||||
|
CmdLineInterface& parser,
|
||||||
|
Visitor* v = NULL );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Labeled ValueArg constructor.
|
||||||
|
* You could conceivably call this constructor with a blank flag,
|
||||||
|
* but that would make you a bad person. It would also cause
|
||||||
|
* an exception to be thrown. If you want an unlabeled argument,
|
||||||
|
* use the other constructor.
|
||||||
|
* \param flag - The one character flag that identifies this
|
||||||
|
* argument on the command line.
|
||||||
|
* \param name - A one word name for the argument. Can be
|
||||||
|
* used as a long flag on the command line.
|
||||||
|
* \param desc - A description of what the argument is for or
|
||||||
|
* does.
|
||||||
|
* \param req - Whether the argument is required on the command
|
||||||
|
* line.
|
||||||
|
* \param value - The default value assigned to this argument if it
|
||||||
|
* is not present on the command line.
|
||||||
|
* \param constraint - A pointer to a Constraint object used
|
||||||
|
* to constrain this Arg.
|
||||||
|
* \param parser - A CmdLine parser object to add this Arg to.
|
||||||
|
* \param v - An optional visitor. You probably should not
|
||||||
|
* use this unless you have a very good reason.
|
||||||
|
*/
|
||||||
|
ValueArg( const std::wstring& flag,
|
||||||
|
const std::wstring& name,
|
||||||
|
const std::wstring& desc,
|
||||||
|
bool req,
|
||||||
|
T value,
|
||||||
|
Constraint<T>* constraint,
|
||||||
|
CmdLineInterface& parser,
|
||||||
|
Visitor* v = NULL );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Labeled ValueArg constructor.
|
||||||
|
* You could conceivably call this constructor with a blank flag,
|
||||||
|
* but that would make you a bad person. It would also cause
|
||||||
|
* an exception to be thrown. If you want an unlabeled argument,
|
||||||
|
* use the other constructor.
|
||||||
|
* \param flag - The one character flag that identifies this
|
||||||
|
* argument on the command line.
|
||||||
|
* \param name - A one word name for the argument. Can be
|
||||||
|
* used as a long flag on the command line.
|
||||||
|
* \param desc - A description of what the argument is for or
|
||||||
|
* does.
|
||||||
|
* \param req - Whether the argument is required on the command
|
||||||
|
* line.
|
||||||
|
* \param value - The default value assigned to this argument if it
|
||||||
|
* is not present on the command line.
|
||||||
|
* \param constraint - A pointer to a Constraint object used
|
||||||
|
* to constrain this Arg.
|
||||||
|
* \param v - An optional visitor. You probably should not
|
||||||
|
* use this unless you have a very good reason.
|
||||||
|
*/
|
||||||
|
ValueArg( const std::wstring& flag,
|
||||||
|
const std::wstring& name,
|
||||||
|
const std::wstring& desc,
|
||||||
|
bool req,
|
||||||
|
T value,
|
||||||
|
Constraint<T>* constraint,
|
||||||
|
Visitor* v = NULL );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handles the processing of the argument.
|
||||||
|
* This re-implements the Arg version of this method to set the
|
||||||
|
* _value of the argument appropriately. It knows the difference
|
||||||
|
* between labeled and unlabeled.
|
||||||
|
* \param i - Pointer the the current argument in the list.
|
||||||
|
* \param args - Mutable list of strings. Passed
|
||||||
|
* in from main().
|
||||||
|
*/
|
||||||
|
virtual bool processArg(int* i, std::vector<std::wstring>& args);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the value of the argument.
|
||||||
|
*/
|
||||||
|
T& getValue() ;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Specialization of shortID.
|
||||||
|
* \param val - value to be used.
|
||||||
|
*/
|
||||||
|
virtual std::wstring shortID(const std::wstring& val = L"val") const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Specialization of longID.
|
||||||
|
* \param val - value to be used.
|
||||||
|
*/
|
||||||
|
virtual std::wstring longID(const std::wstring& val = L"val") const;
|
||||||
|
|
||||||
|
virtual void reset() ;
|
||||||
|
|
||||||
|
private:
|
||||||
|
/**
|
||||||
|
* Prevent accidental copying
|
||||||
|
*/
|
||||||
|
ValueArg<T>(const ValueArg<T>& rhs);
|
||||||
|
ValueArg<T>& operator=(const ValueArg<T>& rhs);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor implementation.
|
||||||
|
*/
|
||||||
|
template<class T>
|
||||||
|
ValueArg<T>::ValueArg(const std::wstring& flag,
|
||||||
|
const std::wstring& name,
|
||||||
|
const std::wstring& desc,
|
||||||
|
bool req,
|
||||||
|
T val,
|
||||||
|
const std::wstring& typeDesc,
|
||||||
|
Visitor* v)
|
||||||
|
: Arg(flag, name, desc, req, true, v),
|
||||||
|
_value( val ),
|
||||||
|
_default( val ),
|
||||||
|
_typeDesc( typeDesc ),
|
||||||
|
_constraint( NULL )
|
||||||
|
{ }
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
ValueArg<T>::ValueArg(const std::wstring& flag,
|
||||||
|
const std::wstring& name,
|
||||||
|
const std::wstring& desc,
|
||||||
|
bool req,
|
||||||
|
T val,
|
||||||
|
const std::wstring& typeDesc,
|
||||||
|
CmdLineInterface& parser,
|
||||||
|
Visitor* v)
|
||||||
|
: Arg(flag, name, desc, req, true, v),
|
||||||
|
_value( val ),
|
||||||
|
_default( val ),
|
||||||
|
_typeDesc( typeDesc ),
|
||||||
|
_constraint( NULL )
|
||||||
|
{
|
||||||
|
parser.add( this );
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
ValueArg<T>::ValueArg(const std::wstring& flag,
|
||||||
|
const std::wstring& name,
|
||||||
|
const std::wstring& desc,
|
||||||
|
bool req,
|
||||||
|
T val,
|
||||||
|
Constraint<T>* constraint,
|
||||||
|
Visitor* v)
|
||||||
|
: Arg(flag, name, desc, req, true, v),
|
||||||
|
_value( val ),
|
||||||
|
_default( val ),
|
||||||
|
_typeDesc( constraint->shortID() ),
|
||||||
|
_constraint( constraint )
|
||||||
|
{ }
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
ValueArg<T>::ValueArg(const std::wstring& flag,
|
||||||
|
const std::wstring& name,
|
||||||
|
const std::wstring& desc,
|
||||||
|
bool req,
|
||||||
|
T val,
|
||||||
|
Constraint<T>* constraint,
|
||||||
|
CmdLineInterface& parser,
|
||||||
|
Visitor* v)
|
||||||
|
: Arg(flag, name, desc, req, true, v),
|
||||||
|
_value( val ),
|
||||||
|
_default( val ),
|
||||||
|
_typeDesc( constraint->shortID() ),
|
||||||
|
_constraint( constraint )
|
||||||
|
{
|
||||||
|
parser.add( this );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Implementation of getValue().
|
||||||
|
*/
|
||||||
|
template<class T>
|
||||||
|
T& ValueArg<T>::getValue() { return _value; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Implementation of processArg().
|
||||||
|
*/
|
||||||
|
template<class T>
|
||||||
|
bool ValueArg<T>::processArg(int *i, std::vector<std::wstring>& args)
|
||||||
|
{
|
||||||
|
if ( _ignoreable && Arg::ignoreRest() )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if ( _hasBlanks( args[*i] ) )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
std::wstring flag = args[*i];
|
||||||
|
|
||||||
|
std::wstring value = L"";
|
||||||
|
trimFlag( flag, value );
|
||||||
|
|
||||||
|
if ( argMatches( flag ) )
|
||||||
|
{
|
||||||
|
if ( _alreadySet )
|
||||||
|
{
|
||||||
|
if ( _xorSet )
|
||||||
|
throw( CmdLineParseException(
|
||||||
|
L"Mutually exclusive argument already set!",
|
||||||
|
toString()) );
|
||||||
|
else
|
||||||
|
throw( CmdLineParseException(L"Argument already set!",
|
||||||
|
toString()) );
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( Arg::delimiter() != L' ' && value == L"" )
|
||||||
|
throw( ArgParseException(
|
||||||
|
L"Couldn't find delimiter for this argument!",
|
||||||
|
toString() ) );
|
||||||
|
|
||||||
|
if ( value == L"" )
|
||||||
|
{
|
||||||
|
(*i)++;
|
||||||
|
if ( static_cast<unsigned int>(*i) < args.size() )
|
||||||
|
_extractValue( args[*i] );
|
||||||
|
else
|
||||||
|
throw( ArgParseException(L"Missing a value for this argument!",
|
||||||
|
toString() ) );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
_extractValue( value );
|
||||||
|
|
||||||
|
_alreadySet = true;
|
||||||
|
_checkWithVisitor();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Implementation of shortID.
|
||||||
|
*/
|
||||||
|
template<class T>
|
||||||
|
std::wstring ValueArg<T>::shortID(const std::wstring& val) const
|
||||||
|
{
|
||||||
|
static_cast<void>(val); // Ignore input, donL't warn
|
||||||
|
return Arg::shortID( _typeDesc );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Implementation of longID.
|
||||||
|
*/
|
||||||
|
template<class T>
|
||||||
|
std::wstring ValueArg<T>::longID(const std::wstring& val) const
|
||||||
|
{
|
||||||
|
static_cast<void>(val); // Ignore input, don't warn
|
||||||
|
return Arg::longID( _typeDesc );
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
void ValueArg<T>::_extractValue( const std::wstring& val )
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
ExtractValue(_value, val, typename ArgTraits<T>::ValueCategory());
|
||||||
|
} catch( ArgParseException &e) {
|
||||||
|
throw ArgParseException(e.error(), toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( _constraint != NULL )
|
||||||
|
if ( ! _constraint->check( _value ) )
|
||||||
|
throw( CmdLineParseException( L"Value '" + val +
|
||||||
|
+ L"' does not meet constraint: "
|
||||||
|
+ _constraint->description(),
|
||||||
|
toString() ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
void ValueArg<T>::reset()
|
||||||
|
{
|
||||||
|
Arg::reset();
|
||||||
|
_value = _default;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace TCLAP
|
||||||
|
|
||||||
|
#endif
|
148
include/tclapw/ValuesConstraint.h
Normal file
148
include/tclapw/ValuesConstraint.h
Normal file
@ -0,0 +1,148 @@
|
|||||||
|
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
*
|
||||||
|
* file: ValuesConstraint.h
|
||||||
|
*
|
||||||
|
* Copyright (c) 2005, 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.
|
||||||
|
*
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
#ifndef TCLAP_VALUESCONSTRAINT_H
|
||||||
|
#define TCLAP_VALUESCONSTRAINT_H
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
#include <tclapw/Constraint.h>
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
#include <config.h>
|
||||||
|
#else
|
||||||
|
#define HAVE_SSTREAM
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(HAVE_SSTREAM)
|
||||||
|
#include <sstream>
|
||||||
|
#elif defined(HAVE_STRSTREAM)
|
||||||
|
#include <strstream>
|
||||||
|
#else
|
||||||
|
#error L"Need a stringstream (sstream or strstream) to compile!"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace TCLAP {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A Constraint that constrains the Arg to only those values specified
|
||||||
|
* in the constraint.
|
||||||
|
*/
|
||||||
|
template<class T>
|
||||||
|
class ValuesConstraint : public Constraint<T>
|
||||||
|
{
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor.
|
||||||
|
* \param allowed - vector of allowed values.
|
||||||
|
*/
|
||||||
|
ValuesConstraint(std::vector<T>& allowed);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Virtual destructor.
|
||||||
|
*/
|
||||||
|
virtual ~ValuesConstraint() {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a description of the Constraint.
|
||||||
|
*/
|
||||||
|
virtual std::wstring description() const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the short ID for the Constraint.
|
||||||
|
*/
|
||||||
|
virtual std::wstring shortID() const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The method used to verify that the value parsed from the command
|
||||||
|
* line meets the constraint.
|
||||||
|
* \param value - The value that will be checked.
|
||||||
|
*/
|
||||||
|
virtual bool check(const T& value) const;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The list of valid values.
|
||||||
|
*/
|
||||||
|
std::vector<T> _allowed;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The string used to describe the allowed values of this constraint.
|
||||||
|
*/
|
||||||
|
std::wstring _typeDesc;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
ValuesConstraint<T>::ValuesConstraint(std::vector<T>& allowed)
|
||||||
|
: _allowed(allowed),
|
||||||
|
_typeDesc(L"")
|
||||||
|
{
|
||||||
|
for ( unsigned int i = 0; i < _allowed.size(); i++ )
|
||||||
|
{
|
||||||
|
|
||||||
|
#if defined(HAVE_SSTREAM)
|
||||||
|
std::wostringstream os;
|
||||||
|
#elif defined(HAVE_STRSTREAM)
|
||||||
|
std::wostrstream os;
|
||||||
|
#else
|
||||||
|
#error L"Need a stringstream (sstream or strstream) to compile!"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
os << _allowed[i];
|
||||||
|
|
||||||
|
std::wstring temp( os.str() );
|
||||||
|
|
||||||
|
if ( i > 0 )
|
||||||
|
_typeDesc += L"|";
|
||||||
|
_typeDesc += temp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
bool ValuesConstraint<T>::check( const T& val ) const
|
||||||
|
{
|
||||||
|
if ( std::find(_allowed.begin(),_allowed.end(),val) == _allowed.end() )
|
||||||
|
return false;
|
||||||
|
else
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
std::wstring ValuesConstraint<T>::shortID() const
|
||||||
|
{
|
||||||
|
return _typeDesc;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
std::wstring ValuesConstraint<T>::description() const
|
||||||
|
{
|
||||||
|
return _typeDesc;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
} //namespace TCLAP
|
||||||
|
#endif
|
||||||
|
|
81
include/tclapw/VersionVisitor.h
Normal file
81
include/tclapw/VersionVisitor.h
Normal file
@ -0,0 +1,81 @@
|
|||||||
|
// -*- Mode: c++; c-basic-offset: 4; tab-width: 4; -*-
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
*
|
||||||
|
* file: VersionVisitor.h
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef TCLAP_VERSION_VISITOR_H
|
||||||
|
#define TCLAP_VERSION_VISITOR_H
|
||||||
|
|
||||||
|
#include <tclapw/CmdLineInterface.h>
|
||||||
|
#include <tclapw/CmdLineOutput.h>
|
||||||
|
#include <tclapw/Visitor.h>
|
||||||
|
|
||||||
|
namespace TCLAP {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A Vistor that will call the version method of the given CmdLineOutput
|
||||||
|
* for the specified CmdLine object and then exit.
|
||||||
|
*/
|
||||||
|
class VersionVisitor: public Visitor
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
/**
|
||||||
|
* Prevent accidental copying
|
||||||
|
*/
|
||||||
|
VersionVisitor(const VersionVisitor& rhs);
|
||||||
|
VersionVisitor& operator=(const VersionVisitor& rhs);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The CmdLine of interest.
|
||||||
|
*/
|
||||||
|
CmdLineInterface* _cmd;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The output object.
|
||||||
|
*/
|
||||||
|
CmdLineOutput** _out;
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor.
|
||||||
|
* \param cmd - The CmdLine the output is generated for.
|
||||||
|
* \param out - The type of output.
|
||||||
|
*/
|
||||||
|
VersionVisitor( CmdLineInterface* cmd, CmdLineOutput** out )
|
||||||
|
: Visitor(), _cmd( cmd ), _out( out ) { }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Calls the version method of the output object using the
|
||||||
|
* specified CmdLine.
|
||||||
|
*/
|
||||||
|
void visit() {
|
||||||
|
(*_out)->version(*_cmd);
|
||||||
|
throw ExitException(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
53
include/tclapw/Visitor.h
Normal file
53
include/tclapw/Visitor.h
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
*
|
||||||
|
* file: Visitor.h
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef TCLAP_VISITOR_H
|
||||||
|
#define TCLAP_VISITOR_H
|
||||||
|
|
||||||
|
namespace TCLAP {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A base class that defines the interface for visitors.
|
||||||
|
*/
|
||||||
|
class Visitor
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor. Does nothing.
|
||||||
|
*/
|
||||||
|
Visitor() { }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Destructor. Does nothing.
|
||||||
|
*/
|
||||||
|
virtual ~Visitor() { }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Does nothing. Should be overridden by child.
|
||||||
|
*/
|
||||||
|
virtual void visit() { }
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
166
include/tclapw/XorHandler.h
Normal file
166
include/tclapw/XorHandler.h
Normal file
@ -0,0 +1,166 @@
|
|||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
*
|
||||||
|
* file: XorHandler.h
|
||||||
|
*
|
||||||
|
* Copyright (c) 2003, Michael E. Smoot .
|
||||||
|
* Copyright (c) 2004, Michael E. Smoot, Daniel Aarno.
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
#ifndef TCLAP_XORHANDLER_H
|
||||||
|
#define TCLAP_XORHANDLER_H
|
||||||
|
|
||||||
|
#include <tclapw/Arg.h>
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
#include <algorithm>
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
namespace TCLAP {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This class handles lists of ArgL's that are to be XOR'd on the command
|
||||||
|
* line. This is used by CmdLine and you shouldnL't ever use it.
|
||||||
|
*/
|
||||||
|
class XorHandler
|
||||||
|
{
|
||||||
|
protected:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The list of of lists of Arg's to be orL'd together.
|
||||||
|
*/
|
||||||
|
std::vector< std::vector<Arg*> > _orList;
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor. Does nothing.
|
||||||
|
*/
|
||||||
|
XorHandler( ) : _orList(std::vector< std::vector<Arg*> >()) {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a list of Arg*'s that will be orred together.
|
||||||
|
* \param ors - list of Arg* that will be xorL'd.
|
||||||
|
*/
|
||||||
|
void add( std::vector<Arg*>& ors );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks whether the specified Arg is in one of the xor lists and
|
||||||
|
* if it does match one, returns the size of the xor list that the
|
||||||
|
* Arg matched. If the Arg matches, then it also sets the rest of
|
||||||
|
* the Arg's in the list. You shouldn't use this.
|
||||||
|
* \param a - The Arg to be checked.
|
||||||
|
*/
|
||||||
|
int check( const Arg* a );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the XOR specific short usage.
|
||||||
|
*/
|
||||||
|
std::wstring shortUsage();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prints the XOR specific long usage.
|
||||||
|
* \param os - Stream to print to.
|
||||||
|
*/
|
||||||
|
void printLongUsage(std::ostream& os);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Simply checks whether the Arg is contained in one of the arg
|
||||||
|
* lists.
|
||||||
|
* \param a - The Arg to be checked.
|
||||||
|
*/
|
||||||
|
bool contains( const Arg* a );
|
||||||
|
|
||||||
|
std::vector< std::vector<Arg*> >& getXorList();
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////
|
||||||
|
//BEGIN XOR.cpp
|
||||||
|
//////////////////////////////////////////////////////////////////////
|
||||||
|
inline void XorHandler::add( std::vector<Arg*>& ors )
|
||||||
|
{
|
||||||
|
_orList.push_back( ors );
|
||||||
|
}
|
||||||
|
|
||||||
|
inline int XorHandler::check( const Arg* a )
|
||||||
|
{
|
||||||
|
// iterate over each XOR list
|
||||||
|
for ( int i = 0; static_cast<unsigned int>(i) < _orList.size(); i++ )
|
||||||
|
{
|
||||||
|
// if the XOR list contains the arg..
|
||||||
|
ArgVectorIterator ait = std::find( _orList[i].begin(),
|
||||||
|
_orList[i].end(), a );
|
||||||
|
if ( ait != _orList[i].end() )
|
||||||
|
{
|
||||||
|
// first check to see if a mutually exclusive switch
|
||||||
|
// has not already been set
|
||||||
|
for ( ArgVectorIterator it = _orList[i].begin();
|
||||||
|
it != _orList[i].end();
|
||||||
|
it++ )
|
||||||
|
if ( a != (*it) && (*it)->isSet() )
|
||||||
|
throw(CmdLineParseException(
|
||||||
|
L"Mutually exclusive argument already set!",
|
||||||
|
(*it)->toString()));
|
||||||
|
|
||||||
|
// 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
|
||||||
|
if ( (*ait)->allowMore() )
|
||||||
|
return 0;
|
||||||
|
else
|
||||||
|
return static_cast<int>(_orList[i].size());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( a->isRequired() )
|
||||||
|
return 1;
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool XorHandler::contains( const Arg* a )
|
||||||
|
{
|
||||||
|
for ( int i = 0; static_cast<unsigned int>(i) < _orList.size(); i++ )
|
||||||
|
for ( ArgVectorIterator it = _orList[i].begin();
|
||||||
|
it != _orList[i].end();
|
||||||
|
it++ )
|
||||||
|
if ( a == (*it) )
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline std::vector< std::vector<Arg*> >& XorHandler::getXorList()
|
||||||
|
{
|
||||||
|
return _orList;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////
|
||||||
|
//END XOR.cpp
|
||||||
|
//////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
} //namespace TCLAP
|
||||||
|
|
||||||
|
#endif
|
323
include/tclapw/ZshCompletionOutput.h
Normal file
323
include/tclapw/ZshCompletionOutput.h
Normal file
@ -0,0 +1,323 @@
|
|||||||
|
// -*- Mode: c++; c-basic-offset: 4; tab-width: 4; -*-
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
*
|
||||||
|
* file: ZshCompletionOutput.h
|
||||||
|
*
|
||||||
|
* Copyright (c) 2006, Oliver Kiddle
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
#ifndef TCLAP_ZSHCOMPLETIONOUTPUT_H
|
||||||
|
#define TCLAP_ZSHCOMPLETIONOUTPUT_H
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
#include <list>
|
||||||
|
#include <iostream>
|
||||||
|
#include <map>
|
||||||
|
|
||||||
|
#include <tclapw/CmdLineInterface.h>
|
||||||
|
#include <tclapw/CmdLineOutput.h>
|
||||||
|
#include <tclapw/XorHandler.h>
|
||||||
|
#include <tclapw/Arg.h>
|
||||||
|
|
||||||
|
namespace TCLAP {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A class that generates a Zsh completion function as output from the usage()
|
||||||
|
* method for the given CmdLine and its Args.
|
||||||
|
*/
|
||||||
|
class ZshCompletionOutput : public CmdLineOutput
|
||||||
|
{
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
ZshCompletionOutput();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prints the usage to stdout. Can be overridden to
|
||||||
|
* produce alternative behavior.
|
||||||
|
* \param c - The CmdLine object the output is generated for.
|
||||||
|
*/
|
||||||
|
virtual void usage(CmdLineInterface& c);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prints the version to stdout. Can be overridden
|
||||||
|
* to produce alternative behavior.
|
||||||
|
* \param c - The CmdLine object the output is generated for.
|
||||||
|
*/
|
||||||
|
virtual void version(CmdLineInterface& c);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prints (to stderr) an error message, short usage
|
||||||
|
* Can be overridden to produce alternative behavior.
|
||||||
|
* \param c - The CmdLine object the output is generated for.
|
||||||
|
* \param e - The ArgException that caused the failure.
|
||||||
|
*/
|
||||||
|
virtual void failure(CmdLineInterface& c,
|
||||||
|
ArgException& e );
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
void basename( std::wstring& s );
|
||||||
|
void quoteSpecialChars( std::wstring& s );
|
||||||
|
|
||||||
|
std::wstring getMutexList( CmdLineInterface& _cmd, Arg* a );
|
||||||
|
void printOption( Arg* it, std::wstring mutex );
|
||||||
|
void printArg( Arg* it );
|
||||||
|
|
||||||
|
std::map<std::wstring, std::wstring> common;
|
||||||
|
wchar_t theDelimiter;
|
||||||
|
};
|
||||||
|
|
||||||
|
ZshCompletionOutput::ZshCompletionOutput()
|
||||||
|
: common(std::map<std::wstring, std::wstring>()),
|
||||||
|
theDelimiter(L'=')
|
||||||
|
{
|
||||||
|
common[L"host"] = L"_hosts";
|
||||||
|
common[L"hostname"] = L"_hosts";
|
||||||
|
common[L"file"] = L"_files";
|
||||||
|
common[L"filename"] = L"_files";
|
||||||
|
common[L"user"] = L"_users";
|
||||||
|
common[L"username"] = L"_users";
|
||||||
|
common[L"directory"] = L"_directories";
|
||||||
|
common[L"path"] = L"_directories";
|
||||||
|
common[L"url"] = L"_urls";
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void ZshCompletionOutput::version(CmdLineInterface& _cmd)
|
||||||
|
{
|
||||||
|
std::cout << _cmd.getVersion() << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void ZshCompletionOutput::usage(CmdLineInterface& _cmd )
|
||||||
|
{
|
||||||
|
std::list<Arg*> argList = _cmd.getArgList();
|
||||||
|
std::wstring progName = _cmd.getProgramName();
|
||||||
|
std::wstring xversion = _cmd.getVersion();
|
||||||
|
theDelimiter = _cmd.getDelimiter();
|
||||||
|
basename(progName);
|
||||||
|
|
||||||
|
std::cout << L"#compdef " << progName << std::endl << std::endl <<
|
||||||
|
L"# " << progName << L" version " << _cmd.getVersion() << std::endl << std::endl <<
|
||||||
|
L"_arguments -s -S";
|
||||||
|
|
||||||
|
for (ArgListIterator it = argList.begin(); it != argList.end(); it++)
|
||||||
|
{
|
||||||
|
if ( (*it)->shortID().at(0) == L'<' )
|
||||||
|
printArg((*it));
|
||||||
|
else if ( (*it)->getFlag() != L"-" )
|
||||||
|
printOption((*it), getMutexList(_cmd, *it));
|
||||||
|
}
|
||||||
|
|
||||||
|
std::cout << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void ZshCompletionOutput::failure( CmdLineInterface& _cmd,
|
||||||
|
ArgException& e )
|
||||||
|
{
|
||||||
|
static_cast<void>(_cmd); // unused
|
||||||
|
std::cout << e.what() << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void ZshCompletionOutput::quoteSpecialChars( std::wstring& s )
|
||||||
|
{
|
||||||
|
size_t idx = s.find_last_of(L':');
|
||||||
|
while ( idx != std::wstring::npos )
|
||||||
|
{
|
||||||
|
s.insert(idx, 1, L'\\');
|
||||||
|
idx = s.find_last_of(L':', idx);
|
||||||
|
}
|
||||||
|
idx = s.find_last_of(L'\'L');
|
||||||
|
while ( idx != std::wstring::npos )
|
||||||
|
{
|
||||||
|
s.insert(idx, "'\\L'");
|
||||||
|
if (idx == 0)
|
||||||
|
idx = std::wstring::npos;
|
||||||
|
else
|
||||||
|
idx = s.find_last_of('\L'', --idx);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void ZshCompletionOutput::basename( std::wstring& s )
|
||||||
|
{
|
||||||
|
size_t p = s.find_last_of(L'/');
|
||||||
|
if ( p != std::wstring::npos )
|
||||||
|
{
|
||||||
|
s.erase(0, p + 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void ZshCompletionOutput::printArg(Arg* a)
|
||||||
|
{
|
||||||
|
static int count = 1;
|
||||||
|
|
||||||
|
std::cout << L" \\" << std::endl << L" '";
|
||||||
|
if ( a->acceptsMultipleValues() )
|
||||||
|
std::cout << L'*';
|
||||||
|
else
|
||||||
|
std::cout << count++;
|
||||||
|
std::cout << L':';
|
||||||
|
if ( !a->isRequired() )
|
||||||
|
std::cout << L':';
|
||||||
|
|
||||||
|
std::cout << a->getName() << L':';
|
||||||
|
std::map<std::wstring, std::wstring>::iterator compArg = common.find(a->getName());
|
||||||
|
if ( compArg != common.end() )
|
||||||
|
{
|
||||||
|
std::cout << compArg->second;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
std::cout << L"_guard \"^-*\L" " << a->getName();
|
||||||
|
}
|
||||||
|
std::cout << L'\'L';
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void ZshCompletionOutput::printOption(Arg* a, std::wstring mutex)
|
||||||
|
{
|
||||||
|
std::wstring flag = a->flagStartChar() + a->getFlag();
|
||||||
|
std::wstring name = a->nameStartString() + a->getName();
|
||||||
|
std::wstring desc = a->getDescription();
|
||||||
|
|
||||||
|
// remove full stop and capitalisation from description as
|
||||||
|
// this is the convention for zsh function
|
||||||
|
if (!desc.compare(0, 12, "(required) "))
|
||||||
|
{
|
||||||
|
desc.erase(0, 12);
|
||||||
|
}
|
||||||
|
if (!desc.compare(0, 15, "(OR required) "))
|
||||||
|
{
|
||||||
|
desc.erase(0, 15);
|
||||||
|
}
|
||||||
|
size_t len = desc.length();
|
||||||
|
if (len && desc.at(--len) == '.L')
|
||||||
|
{
|
||||||
|
desc.erase(len);
|
||||||
|
}
|
||||||
|
if (len)
|
||||||
|
{
|
||||||
|
desc.replace(0, 1, 1, tolower(desc.at(0)));
|
||||||
|
}
|
||||||
|
|
||||||
|
std::cout << " \\" << std::endl << " 'L" << mutex;
|
||||||
|
|
||||||
|
if ( a->getFlag().empty() )
|
||||||
|
{
|
||||||
|
std::cout << name;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
std::cout << "L'{" << flag << ',L' << name << "}'L";
|
||||||
|
}
|
||||||
|
if ( theDelimiter == '=' && a->isValueRequired() )
|
||||||
|
std::cout << "=-L";
|
||||||
|
quoteSpecialChars(desc);
|
||||||
|
std::cout << '[' << desc << ']';
|
||||||
|
|
||||||
|
if ( a->isValueRequired() )
|
||||||
|
{
|
||||||
|
std::wstring arg = a->shortID();
|
||||||
|
arg.erase(0, arg.find_last_of(theDelimiter) + 1);
|
||||||
|
if ( arg.at(arg.length()-1) == ']' )
|
||||||
|
arg.erase(arg.length()-1);
|
||||||
|
if ( arg.at(arg.length()-1) == ']' )
|
||||||
|
{
|
||||||
|
arg.erase(arg.length()-1);
|
||||||
|
}
|
||||||
|
if ( arg.at(0) == '<' )
|
||||||
|
{
|
||||||
|
arg.erase(arg.length()-1);
|
||||||
|
arg.erase(0, 1);
|
||||||
|
}
|
||||||
|
size_t p = arg.find('|');
|
||||||
|
if ( p != std::wstring::npos )
|
||||||
|
{
|
||||||
|
do
|
||||||
|
{
|
||||||
|
arg.replace(p, 1, 1, ' ');
|
||||||
|
}
|
||||||
|
while ( (p = arg.find_first_of('|', p)) != std::wstring::npos );
|
||||||
|
quoteSpecialChars(arg);
|
||||||
|
std::cout << ": :(L" << arg << ')';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
std::cout << ':' << arg;
|
||||||
|
std::map<std::wstring, std::wstring>::iterator compArg = common.find(arg);
|
||||||
|
if ( compArg != common.end() )
|
||||||
|
{
|
||||||
|
std::cout << ':' << compArg->second;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
std::cout << '\'';
|
||||||
|
}
|
||||||
|
|
||||||
|
inline std::wstring ZshCompletionOutput::getMutexList( CmdLineInterface& _cmd, Arg* a)
|
||||||
|
{
|
||||||
|
XorHandler xorHandler = _cmd.getXorHandler();
|
||||||
|
std::vector< std::vector<Arg*> > xorList = xorHandler.getXorList();
|
||||||
|
|
||||||
|
if (a->getName() == "helpL" || a->getName() == "versionL")
|
||||||
|
{
|
||||||
|
return "(-)L";
|
||||||
|
}
|
||||||
|
|
||||||
|
std::ostringstream list;
|
||||||
|
if ( a->acceptsMultipleValues() )
|
||||||
|
{
|
||||||
|
list << '*';
|
||||||
|
}
|
||||||
|
|
||||||
|
for ( int i = 0; static_cast<unsigned int>(i) < xorList.size(); i++ )
|
||||||
|
{
|
||||||
|
for ( ArgVectorIterator it = xorList[i].begin();
|
||||||
|
it != xorList[i].end();
|
||||||
|
it++)
|
||||||
|
if ( a == (*it) )
|
||||||
|
{
|
||||||
|
list << '(';
|
||||||
|
for ( ArgVectorIterator iu = xorList[i].begin();
|
||||||
|
iu != xorList[i].end();
|
||||||
|
iu++ )
|
||||||
|
{
|
||||||
|
bool notCur = (*iu) != a;
|
||||||
|
bool hasFlag = !(*iu)->getFlag().empty();
|
||||||
|
if ( iu != xorList[i].begin() && (notCur || hasFlag) )
|
||||||
|
list << ' ';
|
||||||
|
if (hasFlag)
|
||||||
|
list << (*iu)->flagStartChar() << (*iu)->getFlag() << ' ';
|
||||||
|
if ( notCur || hasFlag )
|
||||||
|
list << (*iu)->nameStartString() << (*iu)->getName();
|
||||||
|
}
|
||||||
|
list << ')';
|
||||||
|
return list.str();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// wasn't found in xor list
|
||||||
|
if (!a->getFlag().empty()) {
|
||||||
|
list << "(" << a->flagStartChar() << a->getFlag() << L' ' <<
|
||||||
|
a->nameStartString() << a->getName() << L')';
|
||||||
|
}
|
||||||
|
|
||||||
|
return list.str();
|
||||||
|
}
|
||||||
|
|
||||||
|
} //namespace TCLAP
|
||||||
|
#endif
|
Loading…
x
Reference in New Issue
Block a user