parent
5bb4d4359a
commit
2f6b317ede
@ -1,7 +0,0 @@
|
|||||||
END
|
|
||||||
TSLoggerDialog.ui
|
|
||||||
K 25
|
|
||||||
svn:wc:ra_dav:version-url
|
|
||||||
V 76
|
|
||||||
/svnroot/universalindent/!svn/ver/1031/trunk/src/debugging/TSLoggerDialog.ui
|
|
||||||
END
|
|
@ -1,251 +0,0 @@
|
|||||||
/***************************************************************************
|
|
||||||
* Copyright (C) 2006-2012 by Thomas Schweitzer *
|
|
||||||
* thomas-schweitzer(at)arcor.de *
|
|
||||||
* *
|
|
||||||
* This program is free software; you can redistribute it and/or modify *
|
|
||||||
* it under the terms of the GNU General Public License version 2.0 as *
|
|
||||||
* published by the Free Software Foundation. *
|
|
||||||
* *
|
|
||||||
* This program is distributed in the hope that it will be useful, *
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
|
||||||
* GNU General Public License for more details. *
|
|
||||||
* *
|
|
||||||
* You should have received a copy of the GNU General Public License *
|
|
||||||
* along with this program in the file LICENSE.GPL; if not, write to the *
|
|
||||||
* Free Software Foundation, Inc., *
|
|
||||||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
|
|
||||||
***************************************************************************/
|
|
||||||
|
|
||||||
#include "TSLogger.h"
|
|
||||||
#include "ui_TSLoggerDialog.h"
|
|
||||||
|
|
||||||
#include "SettingsPaths.h"
|
|
||||||
|
|
||||||
#include <QDateTime>
|
|
||||||
#include <QFile>
|
|
||||||
#include <QFileInfo>
|
|
||||||
#include <QUrl>
|
|
||||||
#include <QTextStream>
|
|
||||||
#include <QDesktopServices>
|
|
||||||
#include <QMessageBox>
|
|
||||||
|
|
||||||
#include <ctime>
|
|
||||||
|
|
||||||
using namespace tschweitzer;
|
|
||||||
using namespace tschweitzer::debugging;
|
|
||||||
|
|
||||||
TSLogger* TSLogger::_instance = NULL;
|
|
||||||
|
|
||||||
/*!
|
|
||||||
\class TSLogger
|
|
||||||
\brief This class handles any kind of data logging, for debugging and whatever purpose.
|
|
||||||
|
|
||||||
Beneath being able of displaying a dialog window containing all log messages of the
|
|
||||||
current session, a log file in the systems temporary directory is used. Its name
|
|
||||||
is "UiGUI_log.html".
|
|
||||||
|
|
||||||
Setting a verbose level allows to only write messages that have the selected minimum
|
|
||||||
priority to the log.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*!
|
|
||||||
\brief Returns the only existing instance of TSLogger. If the instance doesn't exist, it will be created.
|
|
||||||
*/
|
|
||||||
TSLogger* TSLogger::getInstance(int verboseLevel) {
|
|
||||||
if ( _instance == NULL )
|
|
||||||
_instance = new TSLogger(verboseLevel);
|
|
||||||
|
|
||||||
return _instance;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*!
|
|
||||||
\brief Returns the only existing instance of TSLogger. If the instance doesn't exist, it will be created.
|
|
||||||
*/
|
|
||||||
TSLogger* TSLogger::getInstance() {
|
|
||||||
#ifdef _DEBUG
|
|
||||||
return TSLogger::getInstance(QtDebugMsg);
|
|
||||||
#else
|
|
||||||
return TSLogger::getInstance(QtWarningMsg);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*!
|
|
||||||
\brief Initializes the dialog and sets the path to the log file in the systems temporary directory.
|
|
||||||
Sets the default verbose level to warning level.
|
|
||||||
*/
|
|
||||||
TSLogger::TSLogger(int verboseLevel) : QDialog() {
|
|
||||||
_TSLoggerDialogForm = new Ui::TSLoggerDialog();
|
|
||||||
_TSLoggerDialogForm->setupUi(this);
|
|
||||||
#ifdef _DEBUG
|
|
||||||
_verboseLevel = QtDebugMsg;
|
|
||||||
#else
|
|
||||||
_verboseLevel = QtMsgType(verboseLevel);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
_logFileInitState = NOTINITIALZED;
|
|
||||||
|
|
||||||
connect( _TSLoggerDialogForm->openLogFileFolderToolButton, SIGNAL(clicked()), this, SLOT(openLogFileFolder()) );
|
|
||||||
|
|
||||||
// Make the main application not to wait for the logging window to close.
|
|
||||||
setAttribute(Qt::WA_QuitOnClose, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*!
|
|
||||||
\brief Logs all incoming messages \a msg to the dialogs text edit and to the log file.
|
|
||||||
|
|
||||||
Only messages whos \a type have a higher priority than the set verbose level are logged.
|
|
||||||
*/
|
|
||||||
void TSLogger::messageHandler(QtMsgType type, const char *msg) {
|
|
||||||
if ( _instance == NULL )
|
|
||||||
_instance = TSLogger::getInstance();
|
|
||||||
|
|
||||||
/*
|
|
||||||
QMessageBox messageBox;
|
|
||||||
QString messageBoxText = QString::fromUtf8( msg );
|
|
||||||
messageBox.setText( messageBoxText );
|
|
||||||
messageBox.setWindowModality( Qt::ApplicationModal );
|
|
||||||
messageBox.exec();
|
|
||||||
*/
|
|
||||||
|
|
||||||
// Only log messages that have a higher or equal priority than set with the verbose level.
|
|
||||||
if ( type < _instance->_verboseLevel )
|
|
||||||
return;
|
|
||||||
|
|
||||||
// Init log message with prepended date and time.
|
|
||||||
QString message = QDateTime::currentDateTime().toString();
|
|
||||||
|
|
||||||
// Depending on the QtMsgType prepend a different colored Debug, Warning, Critical or Fatal.
|
|
||||||
switch (type) {
|
|
||||||
case QtDebugMsg :
|
|
||||||
message += " <span style=\"font-weight:bold; color:black;\">Debug:</span> ";
|
|
||||||
break;
|
|
||||||
case QtWarningMsg :
|
|
||||||
message += " <span style=\"font-weight:bold; color:gold;\">Warning:</span> ";
|
|
||||||
break;
|
|
||||||
case QtCriticalMsg :
|
|
||||||
message += "<span style=\"font-weight:bold; color:red;\">Critical:</span> ";
|
|
||||||
break;
|
|
||||||
case QtFatalMsg :
|
|
||||||
message += " <span style=\"font-weight:bold; color:#D60000;\">Fatal:</span> ";
|
|
||||||
// This one is no Qt message type, but can be used to send info messages to the log
|
|
||||||
// by calling TSLogger::messageHandler() directly.
|
|
||||||
case TSLoggerInfoMsg :
|
|
||||||
message += " <span style=\"font-weight:bold; color:darkgray;\">Info:</span> ";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Append the to UTF-8 back converted message parameter.
|
|
||||||
message += QString::fromUtf8( msg ) + "<br/>\n";
|
|
||||||
|
|
||||||
// Write the message to the log windows text edit.
|
|
||||||
_instance->_TSLoggerDialogForm->logTextEdit->append( message );
|
|
||||||
|
|
||||||
// Write/append the log message to the log file.
|
|
||||||
_instance->writeToLogFile( message );
|
|
||||||
|
|
||||||
// In case of a fatal error abort the application.
|
|
||||||
if ( type == QtFatalMsg )
|
|
||||||
abort();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*!
|
|
||||||
\brief Calling this the verbose level can be set in a range from 0 to 3
|
|
||||||
which is equal to debug, warning, critical and fatal priority.
|
|
||||||
*/
|
|
||||||
void TSLogger::setVerboseLevel(int level) {
|
|
||||||
if ( level < 0 )
|
|
||||||
_verboseLevel = QtDebugMsg;
|
|
||||||
if ( level > 3 )
|
|
||||||
_verboseLevel = QtFatalMsg;
|
|
||||||
else
|
|
||||||
_verboseLevel = QtMsgType(level);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*!
|
|
||||||
\brief Deletes the existing _instance of TSLogger.
|
|
||||||
*/
|
|
||||||
void TSLogger::deleteInstance() {
|
|
||||||
if ( _instance != NULL ) {
|
|
||||||
delete _instance;
|
|
||||||
_instance = NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*!
|
|
||||||
\brief Opens the folder that contains the created log file with the name "UiGUI_log.html".
|
|
||||||
*/
|
|
||||||
void TSLogger::openLogFileFolder() {
|
|
||||||
QDesktopServices::openUrl( QFileInfo( _logFile ).absolutePath() );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*!
|
|
||||||
\brief Writes the \a message to the used log file.
|
|
||||||
*/
|
|
||||||
void TSLogger::writeToLogFile(const QString &message) {
|
|
||||||
// If the file where all logging messages should go to isn't initilized yet, do that now.
|
|
||||||
if ( _logFileInitState == NOTINITIALZED ) {
|
|
||||||
_logFileInitState = INITIALIZING;
|
|
||||||
|
|
||||||
// On different systems it may be that "QDir::tempPath()" ends with a "/" or not. So check this.
|
|
||||||
// Remove any trailing slashes.
|
|
||||||
QString tempPath = QFileInfo( SettingsPaths::getTempPath() ).absolutePath();
|
|
||||||
while ( tempPath.right(1) == "/" ) {
|
|
||||||
tempPath.chop(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
// To make the temporary log file invulnerable against file symbolic link hacks
|
|
||||||
// append the current date and time up to milliseconds to its name and a random character.
|
|
||||||
QString logFileName = "UiGUI_log_" + QDateTime::currentDateTime().toString("yyyyMMdd");
|
|
||||||
logFileName += "-" + QDateTime::currentDateTime().toString("hhmmsszzz");
|
|
||||||
// By random decide whether to append a number or an upper or lower case character.
|
|
||||||
qsrand( time(NULL) );
|
|
||||||
unsigned char randomChar;
|
|
||||||
switch ( qrand() % 3 ) {
|
|
||||||
// Append a number from 0 to 9.
|
|
||||||
case 0 :
|
|
||||||
randomChar = qrand() % 10 + '0';
|
|
||||||
break;
|
|
||||||
// Append a upper case characer between A and Z.
|
|
||||||
case 1 :
|
|
||||||
randomChar = qrand() % 26 + 'A';
|
|
||||||
break;
|
|
||||||
// Append a lower case characer between a and z.
|
|
||||||
default :
|
|
||||||
randomChar = qrand() % 26 + 'a';
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
logFileName += "_" + QString(randomChar) + ".html";
|
|
||||||
|
|
||||||
_logFile.setFileName( tempPath + "/" + logFileName );
|
|
||||||
|
|
||||||
// Set the tooltip of the open log file folder button to show the unique name of the log file.
|
|
||||||
_TSLoggerDialogForm->openLogFileFolderToolButton->setToolTip( _TSLoggerDialogForm->openLogFileFolderToolButton->toolTip() + " (" + logFileName + ")" );
|
|
||||||
|
|
||||||
_logFileInitState = INITIALZED;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add the message to the message queue.
|
|
||||||
_messageQueue << message;
|
|
||||||
|
|
||||||
// If the logging file is initialzed, write all messages contained in the message queue into the file.
|
|
||||||
if ( _logFileInitState == INITIALZED ) {
|
|
||||||
// Write/append the log message to the log file.
|
|
||||||
if ( _logFile.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Append) ) {
|
|
||||||
QTextStream out(&_logFile);
|
|
||||||
|
|
||||||
while ( !_messageQueue.isEmpty() ) {
|
|
||||||
out << _messageQueue.takeFirst() << "\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
_logFile.close();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,63 +0,0 @@
|
|||||||
/***************************************************************************
|
|
||||||
* Copyright (C) 2006-2012 by Thomas Schweitzer *
|
|
||||||
* thomas-schweitzer(at)arcor.de *
|
|
||||||
* *
|
|
||||||
* This program is free software; you can redistribute it and/or modify *
|
|
||||||
* it under the terms of the GNU General Public License version 2.0 as *
|
|
||||||
* published by the Free Software Foundation. *
|
|
||||||
* *
|
|
||||||
* This program is distributed in the hope that it will be useful, *
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
|
||||||
* GNU General Public License for more details. *
|
|
||||||
* *
|
|
||||||
* You should have received a copy of the GNU General Public License *
|
|
||||||
* along with this program in the file LICENSE.GPL; if not, write to the *
|
|
||||||
* Free Software Foundation, Inc., *
|
|
||||||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
|
|
||||||
***************************************************************************/
|
|
||||||
|
|
||||||
#ifndef TSLogger_H
|
|
||||||
#define TSLogger_H
|
|
||||||
|
|
||||||
#include <QDialog>
|
|
||||||
#include <QFile>
|
|
||||||
|
|
||||||
namespace Ui {
|
|
||||||
class TSLoggerDialog;
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace tschweitzer { namespace debugging {
|
|
||||||
|
|
||||||
#define TSLoggerInfoMsg QtMsgType(4)
|
|
||||||
|
|
||||||
class TSLogger : public QDialog
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
|
|
||||||
public:
|
|
||||||
static TSLogger* getInstance(int verboseLevel);
|
|
||||||
static TSLogger* getInstance();
|
|
||||||
static void messageHandler(QtMsgType type, const char *msg);
|
|
||||||
static void deleteInstance();
|
|
||||||
void setVerboseLevel(int level);
|
|
||||||
|
|
||||||
private slots:
|
|
||||||
void openLogFileFolder();
|
|
||||||
|
|
||||||
private:
|
|
||||||
Ui::TSLoggerDialog *_TSLoggerDialogForm;
|
|
||||||
|
|
||||||
enum LogFileInitState { NOTINITIALZED, INITIALIZING, INITIALZED } _logFileInitState;
|
|
||||||
TSLogger(int verboseLevel);
|
|
||||||
void writeToLogFile(const QString &message);
|
|
||||||
|
|
||||||
static TSLogger* _instance;
|
|
||||||
QtMsgType _verboseLevel;
|
|
||||||
QFile _logFile;
|
|
||||||
QStringList _messageQueue;
|
|
||||||
};
|
|
||||||
|
|
||||||
}} // namespace tschweitzer::debugging
|
|
||||||
|
|
||||||
#endif // TSLogger_H
|
|
@ -1,142 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<ui version="4.0">
|
|
||||||
<class>TSLoggerDialog</class>
|
|
||||||
<widget class="QDialog" name="TSLoggerDialog">
|
|
||||||
<property name="geometry">
|
|
||||||
<rect>
|
|
||||||
<x>0</x>
|
|
||||||
<y>0</y>
|
|
||||||
<width>1030</width>
|
|
||||||
<height>263</height>
|
|
||||||
</rect>
|
|
||||||
</property>
|
|
||||||
<property name="windowTitle">
|
|
||||||
<string>Log</string>
|
|
||||||
</property>
|
|
||||||
<property name="windowIcon">
|
|
||||||
<iconset resource="../resources/Icons.qrc">
|
|
||||||
<normaloff>:/mainWindow/document-properties.png</normaloff>:/mainWindow/document-properties.png</iconset>
|
|
||||||
</property>
|
|
||||||
<layout class="QVBoxLayout">
|
|
||||||
<item>
|
|
||||||
<widget class="QLabel" name="label">
|
|
||||||
<property name="text">
|
|
||||||
<string>Logged messages</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QTextEdit" name="logTextEdit">
|
|
||||||
<property name="readOnly">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
|
||||||
<item>
|
|
||||||
<widget class="QToolButton" name="cleanUpToolButton">
|
|
||||||
<property name="toolTip">
|
|
||||||
<string>Clear log</string>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>...</string>
|
|
||||||
</property>
|
|
||||||
<property name="icon">
|
|
||||||
<iconset resource="../resources/Icons.qrc">
|
|
||||||
<normaloff>:/mainWindow/edit-clear.png</normaloff>:/mainWindow/edit-clear.png</iconset>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QToolButton" name="openLogFileFolderToolButton">
|
|
||||||
<property name="toolTip">
|
|
||||||
<string>Open folder containing log file.</string>
|
|
||||||
</property>
|
|
||||||
<property name="statusTip">
|
|
||||||
<string>Open folder containing log file.</string>
|
|
||||||
</property>
|
|
||||||
<property name="icon">
|
|
||||||
<iconset resource="../resources/Icons.qrc">
|
|
||||||
<normaloff>:/mainWindow/document-open.png</normaloff>:/mainWindow/document-open.png</iconset>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<spacer name="horizontalSpacer">
|
|
||||||
<property name="orientation">
|
|
||||||
<enum>Qt::Horizontal</enum>
|
|
||||||
</property>
|
|
||||||
<property name="sizeHint" stdset="0">
|
|
||||||
<size>
|
|
||||||
<width>40</width>
|
|
||||||
<height>20</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
</spacer>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QDialogButtonBox" name="buttonBox">
|
|
||||||
<property name="standardButtons">
|
|
||||||
<set>QDialogButtonBox::Close</set>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
|
||||||
<resources>
|
|
||||||
<include location="../resources/Icons.qrc"/>
|
|
||||||
</resources>
|
|
||||||
<connections>
|
|
||||||
<connection>
|
|
||||||
<sender>TSLoggerDialog</sender>
|
|
||||||
<signal>finished(int)</signal>
|
|
||||||
<receiver>TSLoggerDialog</receiver>
|
|
||||||
<slot>close()</slot>
|
|
||||||
<hints>
|
|
||||||
<hint type="sourcelabel">
|
|
||||||
<x>2</x>
|
|
||||||
<y>45</y>
|
|
||||||
</hint>
|
|
||||||
<hint type="destinationlabel">
|
|
||||||
<x>5</x>
|
|
||||||
<y>59</y>
|
|
||||||
</hint>
|
|
||||||
</hints>
|
|
||||||
</connection>
|
|
||||||
<connection>
|
|
||||||
<sender>buttonBox</sender>
|
|
||||||
<signal>clicked(QAbstractButton*)</signal>
|
|
||||||
<receiver>TSLoggerDialog</receiver>
|
|
||||||
<slot>close()</slot>
|
|
||||||
<hints>
|
|
||||||
<hint type="sourcelabel">
|
|
||||||
<x>419</x>
|
|
||||||
<y>280</y>
|
|
||||||
</hint>
|
|
||||||
<hint type="destinationlabel">
|
|
||||||
<x>477</x>
|
|
||||||
<y>263</y>
|
|
||||||
</hint>
|
|
||||||
</hints>
|
|
||||||
</connection>
|
|
||||||
<connection>
|
|
||||||
<sender>cleanUpToolButton</sender>
|
|
||||||
<signal>clicked()</signal>
|
|
||||||
<receiver>logTextEdit</receiver>
|
|
||||||
<slot>clear()</slot>
|
|
||||||
<hints>
|
|
||||||
<hint type="sourcelabel">
|
|
||||||
<x>27</x>
|
|
||||||
<y>282</y>
|
|
||||||
</hint>
|
|
||||||
<hint type="destinationlabel">
|
|
||||||
<x>22</x>
|
|
||||||
<y>231</y>
|
|
||||||
</hint>
|
|
||||||
</hints>
|
|
||||||
</connection>
|
|
||||||
</connections>
|
|
||||||
</ui>
|
|
@ -1,161 +0,0 @@
|
|||||||
K 25
|
|
||||||
svn:wc:ra_dav:version-url
|
|
||||||
V 54
|
|
||||||
/svnroot/universalindent/!svn/ver/1011/trunk/src/tclap
|
|
||||||
END
|
|
||||||
SwitchArg.h
|
|
||||||
K 25
|
|
||||||
svn:wc:ra_dav:version-url
|
|
||||||
V 65
|
|
||||||
/svnroot/universalindent/!svn/ver/992/trunk/src/tclap/SwitchArg.h
|
|
||||||
END
|
|
||||||
Makefile.in
|
|
||||||
K 25
|
|
||||||
svn:wc:ra_dav:version-url
|
|
||||||
V 65
|
|
||||||
/svnroot/universalindent/!svn/ver/992/trunk/src/tclap/Makefile.in
|
|
||||||
END
|
|
||||||
CmdLineOutput.h
|
|
||||||
K 25
|
|
||||||
svn:wc:ra_dav:version-url
|
|
||||||
V 69
|
|
||||||
/svnroot/universalindent/!svn/ver/992/trunk/src/tclap/CmdLineOutput.h
|
|
||||||
END
|
|
||||||
CmdLineInterface.h
|
|
||||||
K 25
|
|
||||||
svn:wc:ra_dav:version-url
|
|
||||||
V 72
|
|
||||||
/svnroot/universalindent/!svn/ver/992/trunk/src/tclap/CmdLineInterface.h
|
|
||||||
END
|
|
||||||
Visitor.h
|
|
||||||
K 25
|
|
||||||
svn:wc:ra_dav:version-url
|
|
||||||
V 63
|
|
||||||
/svnroot/universalindent/!svn/ver/992/trunk/src/tclap/Visitor.h
|
|
||||||
END
|
|
||||||
ArgTraits.h
|
|
||||||
K 25
|
|
||||||
svn:wc:ra_dav:version-url
|
|
||||||
V 65
|
|
||||||
/svnroot/universalindent/!svn/ver/992/trunk/src/tclap/ArgTraits.h
|
|
||||||
END
|
|
||||||
UnlabeledMultiArg.h
|
|
||||||
K 25
|
|
||||||
svn:wc:ra_dav:version-url
|
|
||||||
V 73
|
|
||||||
/svnroot/universalindent/!svn/ver/992/trunk/src/tclap/UnlabeledMultiArg.h
|
|
||||||
END
|
|
||||||
IgnoreRestVisitor.h
|
|
||||||
K 25
|
|
||||||
svn:wc:ra_dav:version-url
|
|
||||||
V 73
|
|
||||||
/svnroot/universalindent/!svn/ver/992/trunk/src/tclap/IgnoreRestVisitor.h
|
|
||||||
END
|
|
||||||
DocBookOutput.h
|
|
||||||
K 25
|
|
||||||
svn:wc:ra_dav:version-url
|
|
||||||
V 69
|
|
||||||
/svnroot/universalindent/!svn/ver/992/trunk/src/tclap/DocBookOutput.h
|
|
||||||
END
|
|
||||||
ValuesConstraint.h
|
|
||||||
K 25
|
|
||||||
svn:wc:ra_dav:version-url
|
|
||||||
V 72
|
|
||||||
/svnroot/universalindent/!svn/ver/992/trunk/src/tclap/ValuesConstraint.h
|
|
||||||
END
|
|
||||||
VersionVisitor.h
|
|
||||||
K 25
|
|
||||||
svn:wc:ra_dav:version-url
|
|
||||||
V 70
|
|
||||||
/svnroot/universalindent/!svn/ver/992/trunk/src/tclap/VersionVisitor.h
|
|
||||||
END
|
|
||||||
MultiSwitchArg.h
|
|
||||||
K 25
|
|
||||||
svn:wc:ra_dav:version-url
|
|
||||||
V 70
|
|
||||||
/svnroot/universalindent/!svn/ver/992/trunk/src/tclap/MultiSwitchArg.h
|
|
||||||
END
|
|
||||||
ValueArg.h
|
|
||||||
K 25
|
|
||||||
svn:wc:ra_dav:version-url
|
|
||||||
V 64
|
|
||||||
/svnroot/universalindent/!svn/ver/992/trunk/src/tclap/ValueArg.h
|
|
||||||
END
|
|
||||||
XorHandler.h
|
|
||||||
K 25
|
|
||||||
svn:wc:ra_dav:version-url
|
|
||||||
V 66
|
|
||||||
/svnroot/universalindent/!svn/ver/992/trunk/src/tclap/XorHandler.h
|
|
||||||
END
|
|
||||||
HelpVisitor.h
|
|
||||||
K 25
|
|
||||||
svn:wc:ra_dav:version-url
|
|
||||||
V 67
|
|
||||||
/svnroot/universalindent/!svn/ver/992/trunk/src/tclap/HelpVisitor.h
|
|
||||||
END
|
|
||||||
Arg.h
|
|
||||||
K 25
|
|
||||||
svn:wc:ra_dav:version-url
|
|
||||||
V 59
|
|
||||||
/svnroot/universalindent/!svn/ver/992/trunk/src/tclap/Arg.h
|
|
||||||
END
|
|
||||||
CmdLine.h
|
|
||||||
K 25
|
|
||||||
svn:wc:ra_dav:version-url
|
|
||||||
V 64
|
|
||||||
/svnroot/universalindent/!svn/ver/1011/trunk/src/tclap/CmdLine.h
|
|
||||||
END
|
|
||||||
StdOutput.h
|
|
||||||
K 25
|
|
||||||
svn:wc:ra_dav:version-url
|
|
||||||
V 65
|
|
||||||
/svnroot/universalindent/!svn/ver/992/trunk/src/tclap/StdOutput.h
|
|
||||||
END
|
|
||||||
OptionalUnlabeledTracker.h
|
|
||||||
K 25
|
|
||||||
svn:wc:ra_dav:version-url
|
|
||||||
V 80
|
|
||||||
/svnroot/universalindent/!svn/ver/992/trunk/src/tclap/OptionalUnlabeledTracker.h
|
|
||||||
END
|
|
||||||
ZshCompletionOutput.h
|
|
||||||
K 25
|
|
||||||
svn:wc:ra_dav:version-url
|
|
||||||
V 75
|
|
||||||
/svnroot/universalindent/!svn/ver/992/trunk/src/tclap/ZshCompletionOutput.h
|
|
||||||
END
|
|
||||||
UnlabeledValueArg.h
|
|
||||||
K 25
|
|
||||||
svn:wc:ra_dav:version-url
|
|
||||||
V 73
|
|
||||||
/svnroot/universalindent/!svn/ver/992/trunk/src/tclap/UnlabeledValueArg.h
|
|
||||||
END
|
|
||||||
Makefile.am
|
|
||||||
K 25
|
|
||||||
svn:wc:ra_dav:version-url
|
|
||||||
V 65
|
|
||||||
/svnroot/universalindent/!svn/ver/992/trunk/src/tclap/Makefile.am
|
|
||||||
END
|
|
||||||
MultiArg.h
|
|
||||||
K 25
|
|
||||||
svn:wc:ra_dav:version-url
|
|
||||||
V 64
|
|
||||||
/svnroot/universalindent/!svn/ver/992/trunk/src/tclap/MultiArg.h
|
|
||||||
END
|
|
||||||
Constraint.h
|
|
||||||
K 25
|
|
||||||
svn:wc:ra_dav:version-url
|
|
||||||
V 66
|
|
||||||
/svnroot/universalindent/!svn/ver/992/trunk/src/tclap/Constraint.h
|
|
||||||
END
|
|
||||||
StandardTraits.h
|
|
||||||
K 25
|
|
||||||
svn:wc:ra_dav:version-url
|
|
||||||
V 70
|
|
||||||
/svnroot/universalindent/!svn/ver/992/trunk/src/tclap/StandardTraits.h
|
|
||||||
END
|
|
||||||
ArgException.h
|
|
||||||
K 25
|
|
||||||
svn:wc:ra_dav:version-url
|
|
||||||
V 68
|
|
||||||
/svnroot/universalindent/!svn/ver/992/trunk/src/tclap/ArgException.h
|
|
||||||
END
|
|
@ -1,5 +0,0 @@
|
|||||||
K 13
|
|
||||||
svn:eol-style
|
|
||||||
V 6
|
|
||||||
native
|
|
||||||
END
|
|
@ -1,5 +0,0 @@
|
|||||||
K 13
|
|
||||||
svn:eol-style
|
|
||||||
V 6
|
|
||||||
native
|
|
||||||
END
|
|
@ -1,5 +0,0 @@
|
|||||||
K 13
|
|
||||||
svn:eol-style
|
|
||||||
V 6
|
|
||||||
native
|
|
||||||
END
|
|
@ -1,5 +0,0 @@
|
|||||||
K 13
|
|
||||||
svn:eol-style
|
|
||||||
V 6
|
|
||||||
native
|
|
||||||
END
|
|
@ -1,5 +0,0 @@
|
|||||||
K 13
|
|
||||||
svn:eol-style
|
|
||||||
V 6
|
|
||||||
native
|
|
||||||
END
|
|
@ -1,5 +0,0 @@
|
|||||||
K 13
|
|
||||||
svn:eol-style
|
|
||||||
V 6
|
|
||||||
native
|
|
||||||
END
|
|
@ -1,5 +0,0 @@
|
|||||||
K 13
|
|
||||||
svn:eol-style
|
|
||||||
V 6
|
|
||||||
native
|
|
||||||
END
|
|
@ -1,5 +0,0 @@
|
|||||||
K 13
|
|
||||||
svn:eol-style
|
|
||||||
V 6
|
|
||||||
native
|
|
||||||
END
|
|
@ -1,5 +0,0 @@
|
|||||||
K 13
|
|
||||||
svn:eol-style
|
|
||||||
V 6
|
|
||||||
native
|
|
||||||
END
|
|
@ -1,5 +0,0 @@
|
|||||||
K 13
|
|
||||||
svn:eol-style
|
|
||||||
V 6
|
|
||||||
native
|
|
||||||
END
|
|
@ -1,5 +0,0 @@
|
|||||||
K 13
|
|
||||||
svn:eol-style
|
|
||||||
V 6
|
|
||||||
native
|
|
||||||
END
|
|
@ -1,5 +0,0 @@
|
|||||||
K 13
|
|
||||||
svn:eol-style
|
|
||||||
V 6
|
|
||||||
native
|
|
||||||
END
|
|
@ -1,5 +0,0 @@
|
|||||||
K 13
|
|
||||||
svn:eol-style
|
|
||||||
V 6
|
|
||||||
native
|
|
||||||
END
|
|
@ -1,5 +0,0 @@
|
|||||||
K 13
|
|
||||||
svn:eol-style
|
|
||||||
V 6
|
|
||||||
native
|
|
||||||
END
|
|
@ -1,5 +0,0 @@
|
|||||||
K 13
|
|
||||||
svn:eol-style
|
|
||||||
V 6
|
|
||||||
native
|
|
||||||
END
|
|
@ -1,5 +0,0 @@
|
|||||||
K 13
|
|
||||||
svn:eol-style
|
|
||||||
V 6
|
|
||||||
native
|
|
||||||
END
|
|
@ -1,5 +0,0 @@
|
|||||||
K 13
|
|
||||||
svn:eol-style
|
|
||||||
V 6
|
|
||||||
native
|
|
||||||
END
|
|
@ -1,5 +0,0 @@
|
|||||||
K 13
|
|
||||||
svn:eol-style
|
|
||||||
V 6
|
|
||||||
native
|
|
||||||
END
|
|
@ -1,5 +0,0 @@
|
|||||||
K 13
|
|
||||||
svn:eol-style
|
|
||||||
V 6
|
|
||||||
native
|
|
||||||
END
|
|
@ -1,5 +0,0 @@
|
|||||||
K 13
|
|
||||||
svn:eol-style
|
|
||||||
V 6
|
|
||||||
native
|
|
||||||
END
|
|
@ -1,5 +0,0 @@
|
|||||||
K 13
|
|
||||||
svn:eol-style
|
|
||||||
V 6
|
|
||||||
native
|
|
||||||
END
|
|
@ -1,5 +0,0 @@
|
|||||||
K 13
|
|
||||||
svn:eol-style
|
|
||||||
V 6
|
|
||||||
native
|
|
||||||
END
|
|
@ -1,5 +0,0 @@
|
|||||||
K 13
|
|
||||||
svn:eol-style
|
|
||||||
V 6
|
|
||||||
native
|
|
||||||
END
|
|
@ -1,5 +0,0 @@
|
|||||||
K 13
|
|
||||||
svn:eol-style
|
|
||||||
V 6
|
|
||||||
native
|
|
||||||
END
|
|
@ -1,5 +0,0 @@
|
|||||||
K 13
|
|
||||||
svn:eol-style
|
|
||||||
V 6
|
|
||||||
native
|
|
||||||
END
|
|
@ -1,5 +0,0 @@
|
|||||||
K 13
|
|
||||||
svn:eol-style
|
|
||||||
V 6
|
|
||||||
native
|
|
||||||
END
|
|
@ -1,672 +0,0 @@
|
|||||||
// -*- 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 "Need a stringstream (sstream or strstream) to compile!"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <tclap/ArgException.h>
|
|
||||||
#include <tclap/Visitor.h>
|
|
||||||
#include <tclap/CmdLineInterface.h>
|
|
||||||
#include <tclap/ArgTraits.h>
|
|
||||||
#include <tclap/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:
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 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 char& delimiterRef() { static char delim = ' '; return delim; }
|
|
||||||
|
|
||||||
protected:
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The single char 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::string _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::string _name;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Description of the argument.
|
|
||||||
*/
|
|
||||||
std::string _description;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Indicating whether the argument is required.
|
|
||||||
*/
|
|
||||||
bool _required;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Label to be used in usage description. Normally set to
|
|
||||||
* "required", but can be changed when necessary.
|
|
||||||
*/
|
|
||||||
std::string _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::string& flag,
|
|
||||||
const std::string& name,
|
|
||||||
const std::string& 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 "--" argument was specified.
|
|
||||||
*/
|
|
||||||
static void beginIgnoring() { ignoreRestRef() = true; }
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Whether to ignore the rest.
|
|
||||||
*/
|
|
||||||
static bool ignoreRest() { return ignoreRestRef(); }
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The delimiter that separates an argument flag/name from the
|
|
||||||
* value.
|
|
||||||
*/
|
|
||||||
static char delimiter() { return delimiterRef(); }
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The char used as a place holder when SwitchArgs are combined.
|
|
||||||
* Currently set to the bell char (ASCII 7).
|
|
||||||
*/
|
|
||||||
static char blankChar() { return (char)7; }
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The char that indicates the beginning of a flag. Currently '-'.
|
|
||||||
*/
|
|
||||||
static char flagStartChar() { return '-'; }
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The sting that indicates the beginning of a flag. Currently "-".
|
|
||||||
* Should be identical to flagStartChar.
|
|
||||||
*/
|
|
||||||
static const std::string flagStartString() { return "-"; }
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The sting that indicates the beginning of a name. Currently "--".
|
|
||||||
* Should be flagStartChar twice.
|
|
||||||
*/
|
|
||||||
static const std::string nameStartString() { return "--"; }
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The name used to identify the ignore rest argument.
|
|
||||||
*/
|
|
||||||
static const std::string ignoreNameString() { return "ignore_rest"; }
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the delimiter for all arguments.
|
|
||||||
* \param c - The character that delimits flags/names from values.
|
|
||||||
*/
|
|
||||||
static void setDelimiter( char 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::string>& 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::string& getFlag() const;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the argument name.
|
|
||||||
*/
|
|
||||||
const std::string& getName() const;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the argument description.
|
|
||||||
*/
|
|
||||||
std::string 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::string& s ) const;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns a simple string representation of the argument.
|
|
||||||
* Primarily for debugging.
|
|
||||||
*/
|
|
||||||
virtual std::string toString() const;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns a short ID for the usage.
|
|
||||||
* \param valueId - The value used in the id.
|
|
||||||
*/
|
|
||||||
virtual std::string shortID( const std::string& valueId = "val" ) const;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns a long ID for the usage.
|
|
||||||
* \param valueId - The value used in the id.
|
|
||||||
*/
|
|
||||||
virtual std::string longID( const std::string& valueId = "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::string& flag, std::string& 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::string& s ) const;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the requireLabel. Used by XorHandler. You shouldn't ever
|
|
||||||
* use this.
|
|
||||||
* \param s - Set the requireLabel to this value.
|
|
||||||
*/
|
|
||||||
void setRequireLabel( const std::string& 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::string& strVal, ValueLike vl)
|
|
||||||
{
|
|
||||||
static_cast<void>(vl); // Avoid warning about unused vl
|
|
||||||
std::istringstream 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("Couldn't read argument value "
|
|
||||||
"from string '" + strVal + "'"));
|
|
||||||
|
|
||||||
|
|
||||||
if ( valuesRead > 1 )
|
|
||||||
throw( ArgParseException("More than one valid value parsed from "
|
|
||||||
"string '" + strVal + "'"));
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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.
|
|
||||||
* StringLike uses assignment (operator=) to assign from strVal.
|
|
||||||
*/
|
|
||||||
template<typename T> void
|
|
||||||
ExtractValue(T &destVal, const std::string& strVal, StringLike sl)
|
|
||||||
{
|
|
||||||
static_cast<void>(sl); // Avoid warning about unused sl
|
|
||||||
SetString(destVal, strVal);
|
|
||||||
}
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////
|
|
||||||
//BEGIN Arg.cpp
|
|
||||||
//////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
inline Arg::Arg(const std::string& flag,
|
|
||||||
const std::string& name,
|
|
||||||
const std::string& desc,
|
|
||||||
bool req,
|
|
||||||
bool valreq,
|
|
||||||
Visitor* v) :
|
|
||||||
_flag(flag),
|
|
||||||
_name(name),
|
|
||||||
_description(desc),
|
|
||||||
_required(req),
|
|
||||||
_requireLabel("required"),
|
|
||||||
_valueRequired(valreq),
|
|
||||||
_alreadySet(false),
|
|
||||||
_visitor( v ),
|
|
||||||
_ignoreable(true),
|
|
||||||
_xorSet(false),
|
|
||||||
_acceptsMultipleValues(false)
|
|
||||||
{
|
|
||||||
if ( _flag.length() > 1 )
|
|
||||||
throw(SpecificationException(
|
|
||||||
"Argument flag can only be one character long", toString() ) );
|
|
||||||
|
|
||||||
if ( _name != ignoreNameString() &&
|
|
||||||
( _flag == Arg::flagStartString() ||
|
|
||||||
_flag == Arg::nameStartString() ||
|
|
||||||
_flag == " " ) )
|
|
||||||
throw(SpecificationException("Argument flag cannot be either '" +
|
|
||||||
Arg::flagStartString() + "' or '" +
|
|
||||||
Arg::nameStartString() + "' or a space.",
|
|
||||||
toString() ) );
|
|
||||||
|
|
||||||
if ( ( _name.substr( 0, Arg::flagStartString().length() ) == Arg::flagStartString() ) ||
|
|
||||||
( _name.substr( 0, Arg::nameStartString().length() ) == Arg::nameStartString() ) ||
|
|
||||||
( _name.find( " ", 0 ) != std::string::npos ) )
|
|
||||||
throw(SpecificationException("Argument name begin with either '" +
|
|
||||||
Arg::flagStartString() + "' or '" +
|
|
||||||
Arg::nameStartString() + "' or space.",
|
|
||||||
toString() ) );
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
inline Arg::~Arg() { }
|
|
||||||
|
|
||||||
inline std::string Arg::shortID( const std::string& valueId ) const
|
|
||||||
{
|
|
||||||
std::string id = "";
|
|
||||||
|
|
||||||
if ( _flag != "" )
|
|
||||||
id = Arg::flagStartString() + _flag;
|
|
||||||
else
|
|
||||||
id = Arg::nameStartString() + _name;
|
|
||||||
|
|
||||||
if ( _valueRequired )
|
|
||||||
id += std::string( 1, Arg::delimiter() ) + "<" + valueId + ">";
|
|
||||||
|
|
||||||
if ( !_required )
|
|
||||||
id = "[" + id + "]";
|
|
||||||
|
|
||||||
return id;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline std::string Arg::longID( const std::string& valueId ) const
|
|
||||||
{
|
|
||||||
std::string id = "";
|
|
||||||
|
|
||||||
if ( _flag != "" )
|
|
||||||
{
|
|
||||||
id += Arg::flagStartString() + _flag;
|
|
||||||
|
|
||||||
if ( _valueRequired )
|
|
||||||
id += std::string( 1, Arg::delimiter() ) + "<" + valueId + ">";
|
|
||||||
|
|
||||||
id += ", ";
|
|
||||||
}
|
|
||||||
|
|
||||||
id += Arg::nameStartString() + _name;
|
|
||||||
|
|
||||||
if ( _valueRequired )
|
|
||||||
id += std::string( 1, Arg::delimiter() ) + "<" + valueId + ">";
|
|
||||||
|
|
||||||
return id;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
inline bool Arg::operator==(const Arg& a) const
|
|
||||||
{
|
|
||||||
if ( ( _flag != "" && _flag == a._flag ) || _name == a._name)
|
|
||||||
return true;
|
|
||||||
else
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline std::string Arg::getDescription() const
|
|
||||||
{
|
|
||||||
std::string desc = "";
|
|
||||||
if ( _required )
|
|
||||||
desc = "(" + _requireLabel + ") ";
|
|
||||||
|
|
||||||
// if ( _valueRequired )
|
|
||||||
// desc += "(value required) ";
|
|
||||||
|
|
||||||
desc += _description;
|
|
||||||
return desc;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline const std::string& Arg::getFlag() const { return _flag; }
|
|
||||||
|
|
||||||
inline const std::string& 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::string& s)
|
|
||||||
{
|
|
||||||
_requireLabel = s;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline bool Arg::argMatches( const std::string& argFlag ) const
|
|
||||||
{
|
|
||||||
if ( ( argFlag == Arg::flagStartString() + _flag && _flag != "" ) ||
|
|
||||||
argFlag == Arg::nameStartString() + _name )
|
|
||||||
return true;
|
|
||||||
else
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline std::string Arg::toString() const
|
|
||||||
{
|
|
||||||
std::string s = "";
|
|
||||||
|
|
||||||
if ( _flag != "" )
|
|
||||||
s += Arg::flagStartString() + _flag + " ";
|
|
||||||
|
|
||||||
s += "(" + Arg::nameStartString() + _name + ")";
|
|
||||||
|
|
||||||
return s;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void Arg::_checkWithVisitor() const
|
|
||||||
{
|
|
||||||
if ( _visitor != NULL )
|
|
||||||
_visitor->visit();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Implementation of trimFlag.
|
|
||||||
*/
|
|
||||||
inline void Arg::trimFlag(std::string& flag, std::string& 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::string& 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
|
|
||||||
|
|
@ -1,200 +0,0 @@
|
|||||||
// -*- 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::string& text = "undefined exception",
|
|
||||||
const std::string& id = "undefined",
|
|
||||||
const std::string& td = "Generic ArgException")
|
|
||||||
: std::exception(),
|
|
||||||
_errorText(text),
|
|
||||||
_argId( id ),
|
|
||||||
_typeDescription(td)
|
|
||||||
{ }
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Destructor.
|
|
||||||
*/
|
|
||||||
virtual ~ArgException() throw() { }
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the error text.
|
|
||||||
*/
|
|
||||||
std::string error() const { return ( _errorText ); }
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the argument id.
|
|
||||||
*/
|
|
||||||
std::string argId() const
|
|
||||||
{
|
|
||||||
if ( _argId == "undefined" )
|
|
||||||
return " ";
|
|
||||||
else
|
|
||||||
return ( "Argument: " + _argId );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the arg id and error text.
|
|
||||||
*/
|
|
||||||
const char* what() const throw()
|
|
||||||
{
|
|
||||||
static std::string ex;
|
|
||||||
ex = _argId + " -- " + _errorText;
|
|
||||||
return ex.c_str();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the type of the exception. Used to explain and distinguish
|
|
||||||
* between different child exceptions.
|
|
||||||
*/
|
|
||||||
std::string typeDescription() const
|
|
||||||
{
|
|
||||||
return _typeDescription;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private:
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The text of the exception message.
|
|
||||||
*/
|
|
||||||
std::string _errorText;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The argument related to this exception.
|
|
||||||
*/
|
|
||||||
std::string _argId;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Describes the type of the exception. Used to distinguish
|
|
||||||
* between different child exceptions.
|
|
||||||
*/
|
|
||||||
std::string _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::string& text = "undefined exception",
|
|
||||||
const std::string& id = "undefined" )
|
|
||||||
: ArgException( text,
|
|
||||||
id,
|
|
||||||
std::string( "Exception found while parsing " ) +
|
|
||||||
std::string( "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::string& text = "undefined exception",
|
|
||||||
const std::string& id = "undefined" )
|
|
||||||
: ArgException( text,
|
|
||||||
id,
|
|
||||||
std::string( "Exception found when the values ") +
|
|
||||||
std::string( "on the command line do not meet ") +
|
|
||||||
std::string( "the requirements of the defined ") +
|
|
||||||
std::string( "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::string& text = "undefined exception",
|
|
||||||
const std::string& id = "undefined" )
|
|
||||||
: ArgException( text,
|
|
||||||
id,
|
|
||||||
std::string("Exception found when an Arg object ")+
|
|
||||||
std::string("is improperly defined by the ") +
|
|
||||||
std::string("developer." ))
|
|
||||||
{ }
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
class ExitException {
|
|
||||||
public:
|
|
||||||
ExitException(int estat) : _estat(estat) {}
|
|
||||||
|
|
||||||
int getExitStatus() const { return _estat; }
|
|
||||||
|
|
||||||
private:
|
|
||||||
int _estat;
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace TCLAP
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
@ -1,81 +0,0 @@
|
|||||||
// -*- 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 tclap 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;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 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 {};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 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;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 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;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 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 string like and value like.
|
|
||||||
*/
|
|
||||||
template<typename T>
|
|
||||||
struct ArgTraits {
|
|
||||||
typedef typename T::ValueCategory ValueCategory;
|
|
||||||
//typedef ValueLike ValueCategory;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
} // namespace
|
|
@ -1,621 +0,0 @@
|
|||||||
// -*- 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 <tclap/SwitchArg.h>
|
|
||||||
#include <tclap/MultiSwitchArg.h>
|
|
||||||
#include <tclap/UnlabeledValueArg.h>
|
|
||||||
#include <tclap/UnlabeledMultiArg.h>
|
|
||||||
|
|
||||||
#include <tclap/XorHandler.h>
|
|
||||||
#include <tclap/HelpVisitor.h>
|
|
||||||
#include <tclap/VersionVisitor.h>
|
|
||||||
#include <tclap/IgnoreRestVisitor.h>
|
|
||||||
|
|
||||||
#include <tclap/CmdLineOutput.h>
|
|
||||||
#include <tclap/StdOutput.h>
|
|
||||||
|
|
||||||
#include <tclap/Constraint.h>
|
|
||||||
#include <tclap/ValuesConstraint.h>
|
|
||||||
|
|
||||||
#include <string>
|
|
||||||
#include <vector>
|
|
||||||
#include <list>
|
|
||||||
#include <iostream>
|
|
||||||
#include <iomanip>
|
|
||||||
#include <algorithm>
|
|
||||||
#include <stdlib.h> // Needed for exit(), which isn'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::string _progName;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A message used to describe the program. Used in the usage output.
|
|
||||||
*/
|
|
||||||
std::string _message;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The version to be displayed with the --version switch.
|
|
||||||
*/
|
|
||||||
std::string _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 ' ' (space).
|
|
||||||
*/
|
|
||||||
char _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::string& 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:
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 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 ' ' (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::string& message,
|
|
||||||
const char delimiter = ' ',
|
|
||||||
const std::string& version = "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 xor'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 xor'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 xor'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 char * 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::string>& args);
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
CmdLineOutput* getOutput();
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
void setOutput(CmdLineOutput* co);
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
std::string& getVersion();
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
std::string& getProgramName();
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
std::list<Arg*>& getArgList();
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
XorHandler& getXorHandler();
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
char getDelimiter();
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
std::string& 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::string& m,
|
|
||||||
char delim,
|
|
||||||
const std::string& v,
|
|
||||||
bool help )
|
|
||||||
: _progName("not_set_yet"),
|
|
||||||
_message(m),
|
|
||||||
_version(v),
|
|
||||||
_numRequired(0),
|
|
||||||
_delimiter(delim),
|
|
||||||
_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("h","help",
|
|
||||||
"Displays usage information and exits.",
|
|
||||||
false, v);
|
|
||||||
add( help );
|
|
||||||
deleteOnExit(help);
|
|
||||||
deleteOnExit(v);
|
|
||||||
|
|
||||||
v = new VersionVisitor( this, &_output );
|
|
||||||
SwitchArg* vers = new SwitchArg("","version",
|
|
||||||
"Displays version information and exits.",
|
|
||||||
false, v);
|
|
||||||
add( vers );
|
|
||||||
deleteOnExit(vers);
|
|
||||||
deleteOnExit(v);
|
|
||||||
}
|
|
||||||
|
|
||||||
v = new IgnoreRestVisitor();
|
|
||||||
SwitchArg* ignore = new SwitchArg(Arg::flagStartString(),
|
|
||||||
Arg::ignoreNameString(),
|
|
||||||
"Ignores the rest of the labeled arguments following this flag.",
|
|
||||||
false, v);
|
|
||||||
add( ignore );
|
|
||||||
deleteOnExit(ignore);
|
|
||||||
deleteOnExit(v);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void CmdLine::xorAdd( std::vector<Arg*>& ors )
|
|
||||||
{
|
|
||||||
_xorHandler.add( ors );
|
|
||||||
|
|
||||||
for (ArgVectorIterator it = ors.begin(); it != ors.end(); it++)
|
|
||||||
{
|
|
||||||
(*it)->forceRequired();
|
|
||||||
(*it)->setRequireLabel( "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(
|
|
||||||
"Argument with same flag/name already exists!",
|
|
||||||
a->longID() ) );
|
|
||||||
|
|
||||||
a->addToList( _argList );
|
|
||||||
|
|
||||||
if ( a->isRequired() )
|
|
||||||
_numRequired++;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
inline void CmdLine::parse(int argc, const char * const * argv)
|
|
||||||
{
|
|
||||||
// this step is necessary so that we have easy access to
|
|
||||||
// mutable strings.
|
|
||||||
std::vector<std::string> args;
|
|
||||||
for (int i = 0; i < argc; i++)
|
|
||||||
args.push_back(argv[i]);
|
|
||||||
|
|
||||||
parse(args);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void CmdLine::parse(std::vector<std::string>& 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 we've actually matched it
|
|
||||||
if ( !matched && _emptyCombined( args[i] ) )
|
|
||||||
matched = true;
|
|
||||||
|
|
||||||
if ( !matched && !Arg::ignoreRest() )
|
|
||||||
throw(CmdLineParseException("Couldn't find match "
|
|
||||||
"for argument",
|
|
||||||
args[i]));
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( requiredCount < _numRequired )
|
|
||||||
missingArgsException();
|
|
||||||
|
|
||||||
if ( requiredCount > _numRequired )
|
|
||||||
throw(CmdLineParseException("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::string& 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::string missingArgList;
|
|
||||||
for (ArgListIterator it = _argList.begin(); it != _argList.end(); it++)
|
|
||||||
{
|
|
||||||
if ( (*it)->isRequired() && !(*it)->isSet() )
|
|
||||||
{
|
|
||||||
missingArgList += (*it)->getName();
|
|
||||||
missingArgList += ", ";
|
|
||||||
count++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
missingArgList = missingArgList.substr(0,missingArgList.length()-2);
|
|
||||||
|
|
||||||
std::string msg;
|
|
||||||
if ( count > 1 )
|
|
||||||
msg = "Required arguments missing: ";
|
|
||||||
else
|
|
||||||
msg = "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)
|
|
||||||
{
|
|
||||||
_userSetOutput = true;
|
|
||||||
_output = co;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline std::string& CmdLine::getVersion()
|
|
||||||
{
|
|
||||||
return _version;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline std::string& CmdLine::getProgramName()
|
|
||||||
{
|
|
||||||
return _progName;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline std::list<Arg*>& CmdLine::getArgList()
|
|
||||||
{
|
|
||||||
return _argList;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline XorHandler& CmdLine::getXorHandler()
|
|
||||||
{
|
|
||||||
return _xorHandler;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline char CmdLine::getDelimiter()
|
|
||||||
{
|
|
||||||
return _delimiter;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline std::string& 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
|
|
@ -1,150 +0,0 @@
|
|||||||
|
|
||||||
/******************************************************************************
|
|
||||||
*
|
|
||||||
* 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 xor'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 xor'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 char * 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::string>& 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::string& getVersion()=0;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the program name string.
|
|
||||||
*/
|
|
||||||
virtual std::string& getProgramName()=0;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the argList.
|
|
||||||
*/
|
|
||||||
virtual std::list<Arg*>& getArgList()=0;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the XorHandler.
|
|
||||||
*/
|
|
||||||
virtual XorHandler& getXorHandler()=0;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the delimiter string.
|
|
||||||
*/
|
|
||||||
virtual char getDelimiter()=0;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the message string.
|
|
||||||
*/
|
|
||||||
virtual std::string& 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
|
|
@ -1,74 +0,0 @@
|
|||||||
|
|
||||||
|
|
||||||
/******************************************************************************
|
|
||||||
*
|
|
||||||
* 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
|
|
@ -1,68 +0,0 @@
|
|||||||
|
|
||||||
/******************************************************************************
|
|
||||||
*
|
|
||||||
* 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::string description() const =0;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the short ID for the Constraint.
|
|
||||||
*/
|
|
||||||
virtual std::string 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
|
|
@ -1,299 +0,0 @@
|
|||||||
// -*- 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 <tclap/CmdLineInterface.h>
|
|
||||||
#include <tclap/CmdLineOutput.h>
|
|
||||||
#include <tclap/XorHandler.h>
|
|
||||||
#include <tclap/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 char r for string x in string s.
|
|
||||||
* \param s - The string to operate on.
|
|
||||||
* \param r - The char to replace.
|
|
||||||
* \param x - What to replace r with.
|
|
||||||
*/
|
|
||||||
void substituteSpecialChars( std::string& s, char r, std::string& x );
|
|
||||||
void removeChar( std::string& s, char r);
|
|
||||||
void basename( std::string& s );
|
|
||||||
|
|
||||||
void printShortArg(Arg* it);
|
|
||||||
void printLongArg(Arg* it);
|
|
||||||
|
|
||||||
char 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::string progName = _cmd.getProgramName();
|
|
||||||
std::string version = _cmd.getVersion();
|
|
||||||
theDelimiter = _cmd.getDelimiter();
|
|
||||||
XorHandler xorHandler = _cmd.getXorHandler();
|
|
||||||
std::vector< std::vector<Arg*> > xorList = xorHandler.getXorList();
|
|
||||||
basename(progName);
|
|
||||||
|
|
||||||
std::cout << "<?xml version='1.0'?>" << std::endl;
|
|
||||||
std::cout << "<!DOCTYPE refentry PUBLIC \"-//OASIS//DTD DocBook XML V4.2//EN\"" << std::endl;
|
|
||||||
std::cout << "\t\"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd\">" << std::endl << std::endl;
|
|
||||||
|
|
||||||
std::cout << "<refentry>" << std::endl;
|
|
||||||
|
|
||||||
std::cout << "<refmeta>" << std::endl;
|
|
||||||
std::cout << "<refentrytitle>" << progName << "</refentrytitle>" << std::endl;
|
|
||||||
std::cout << "<manvolnum>1</manvolnum>" << std::endl;
|
|
||||||
std::cout << "</refmeta>" << std::endl;
|
|
||||||
|
|
||||||
std::cout << "<refnamediv>" << std::endl;
|
|
||||||
std::cout << "<refname>" << progName << "</refname>" << std::endl;
|
|
||||||
std::cout << "<refpurpose>" << _cmd.getMessage() << "</refpurpose>" << std::endl;
|
|
||||||
std::cout << "</refnamediv>" << std::endl;
|
|
||||||
|
|
||||||
std::cout << "<refsynopsisdiv>" << std::endl;
|
|
||||||
std::cout << "<cmdsynopsis>" << std::endl;
|
|
||||||
|
|
||||||
std::cout << "<command>" << progName << "</command>" << std::endl;
|
|
||||||
|
|
||||||
// xor
|
|
||||||
for ( int i = 0; (unsigned int)i < xorList.size(); i++ )
|
|
||||||
{
|
|
||||||
std::cout << "<group choice='req'>" << std::endl;
|
|
||||||
for ( ArgVectorIterator it = xorList[i].begin();
|
|
||||||
it != xorList[i].end(); it++ )
|
|
||||||
printShortArg((*it));
|
|
||||||
|
|
||||||
std::cout << "</group>" << std::endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
// rest of args
|
|
||||||
for (ArgListIterator it = argList.begin(); it != argList.end(); it++)
|
|
||||||
if ( !xorHandler.contains( (*it) ) )
|
|
||||||
printShortArg((*it));
|
|
||||||
|
|
||||||
std::cout << "</cmdsynopsis>" << std::endl;
|
|
||||||
std::cout << "</refsynopsisdiv>" << std::endl;
|
|
||||||
|
|
||||||
std::cout << "<refsect1>" << std::endl;
|
|
||||||
std::cout << "<title>Description</title>" << std::endl;
|
|
||||||
std::cout << "<para>" << std::endl;
|
|
||||||
std::cout << _cmd.getMessage() << std::endl;
|
|
||||||
std::cout << "</para>" << std::endl;
|
|
||||||
std::cout << "</refsect1>" << std::endl;
|
|
||||||
|
|
||||||
std::cout << "<refsect1>" << std::endl;
|
|
||||||
std::cout << "<title>Options</title>" << std::endl;
|
|
||||||
|
|
||||||
std::cout << "<variablelist>" << std::endl;
|
|
||||||
|
|
||||||
for (ArgListIterator it = argList.begin(); it != argList.end(); it++)
|
|
||||||
printLongArg((*it));
|
|
||||||
|
|
||||||
std::cout << "</variablelist>" << std::endl;
|
|
||||||
std::cout << "</refsect1>" << std::endl;
|
|
||||||
|
|
||||||
std::cout << "<refsect1>" << std::endl;
|
|
||||||
std::cout << "<title>Version</title>" << std::endl;
|
|
||||||
std::cout << "<para>" << std::endl;
|
|
||||||
std::cout << version << std::endl;
|
|
||||||
std::cout << "</para>" << std::endl;
|
|
||||||
std::cout << "</refsect1>" << std::endl;
|
|
||||||
|
|
||||||
std::cout << "</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::string& s,
|
|
||||||
char r,
|
|
||||||
std::string& x )
|
|
||||||
{
|
|
||||||
size_t p;
|
|
||||||
while ( (p = s.find_first_of(r)) != std::string::npos )
|
|
||||||
{
|
|
||||||
s.erase(p,1);
|
|
||||||
s.insert(p,x);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void DocBookOutput::removeChar( std::string& s, char r)
|
|
||||||
{
|
|
||||||
size_t p;
|
|
||||||
while ( (p = s.find_first_of(r)) != std::string::npos )
|
|
||||||
{
|
|
||||||
s.erase(p,1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void DocBookOutput::basename( std::string& s )
|
|
||||||
{
|
|
||||||
size_t p = s.find_last_of('/');
|
|
||||||
if ( p != std::string::npos )
|
|
||||||
{
|
|
||||||
s.erase(0, p + 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void DocBookOutput::printShortArg(Arg* a)
|
|
||||||
{
|
|
||||||
std::string lt = "<";
|
|
||||||
std::string gt = ">";
|
|
||||||
|
|
||||||
std::string id = a->shortID();
|
|
||||||
substituteSpecialChars(id,'<',lt);
|
|
||||||
substituteSpecialChars(id,'>',gt);
|
|
||||||
removeChar(id,'[');
|
|
||||||
removeChar(id,']');
|
|
||||||
|
|
||||||
std::string choice = "opt";
|
|
||||||
if ( a->isRequired() )
|
|
||||||
choice = "plain";
|
|
||||||
|
|
||||||
std::cout << "<arg choice='" << choice << '\'';
|
|
||||||
if ( a->acceptsMultipleValues() )
|
|
||||||
std::cout << " rep='repeat'";
|
|
||||||
|
|
||||||
|
|
||||||
std::cout << '>';
|
|
||||||
if ( !a->getFlag().empty() )
|
|
||||||
std::cout << a->flagStartChar() << a->getFlag();
|
|
||||||
else
|
|
||||||
std::cout << a->nameStartString() << a->getName();
|
|
||||||
if ( a->isValueRequired() )
|
|
||||||
{
|
|
||||||
std::string arg = a->shortID();
|
|
||||||
removeChar(arg,'[');
|
|
||||||
removeChar(arg,']');
|
|
||||||
removeChar(arg,'<');
|
|
||||||
removeChar(arg,'>');
|
|
||||||
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::string lt = "<";
|
|
||||||
std::string gt = ">";
|
|
||||||
|
|
||||||
std::string desc = a->getDescription();
|
|
||||||
substituteSpecialChars(desc,'<',lt);
|
|
||||||
substituteSpecialChars(desc,'>',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::string arg = a->shortID();
|
|
||||||
removeChar(arg,'[');
|
|
||||||
removeChar(arg,']');
|
|
||||||
removeChar(arg,'<');
|
|
||||||
removeChar(arg,'>');
|
|
||||||
arg.erase(0, arg.find_last_of(theDelimiter) + 1);
|
|
||||||
std::cout << theDelimiter;
|
|
||||||
std::cout << "<replaceable>" << arg << "</replaceable>";
|
|
||||||
}
|
|
||||||
std::cout << "</option>" << std::endl;
|
|
||||||
std::cout << "</term>" << std::endl;
|
|
||||||
|
|
||||||
std::cout << "<listitem>" << std::endl;
|
|
||||||
std::cout << "<para>" << std::endl;
|
|
||||||
std::cout << desc << std::endl;
|
|
||||||
std::cout << "</para>" << std::endl;
|
|
||||||
std::cout << "</listitem>" << std::endl;
|
|
||||||
|
|
||||||
std::cout << "</varlistentry>" << std::endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
} //namespace TCLAP
|
|
||||||
#endif
|
|
@ -1,69 +0,0 @@
|
|||||||
|
|
||||||
/******************************************************************************
|
|
||||||
*
|
|
||||||
* 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 <tclap/CmdLineInterface.h>
|
|
||||||
#include <tclap/CmdLineOutput.h>
|
|
||||||
#include <tclap/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
|
|
||||||
{
|
|
||||||
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
|
|
@ -1,52 +0,0 @@
|
|||||||
|
|
||||||
/******************************************************************************
|
|
||||||
*
|
|
||||||
* 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 <tclap/Visitor.h>
|
|
||||||
#include <tclap/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
|
|
@ -1,28 +0,0 @@
|
|||||||
|
|
||||||
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
|
|
||||||
|
|
@ -1,387 +0,0 @@
|
|||||||
# Makefile.in generated by automake 1.9.2 from Makefile.am.
|
|
||||||
# @configure_input@
|
|
||||||
|
|
||||||
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
|
|
||||||
# 2003, 2004 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@
|
|
||||||
|
|
||||||
srcdir = @srcdir@
|
|
||||||
top_srcdir = @top_srcdir@
|
|
||||||
VPATH = @srcdir@
|
|
||||||
pkgdatadir = $(datadir)/@PACKAGE@
|
|
||||||
pkglibdir = $(libdir)/@PACKAGE@
|
|
||||||
pkgincludedir = $(includedir)/@PACKAGE@
|
|
||||||
top_builddir = ../..
|
|
||||||
am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
|
|
||||||
INSTALL = @INSTALL@
|
|
||||||
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/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@
|
|
||||||
AMDEP_FALSE = @AMDEP_FALSE@
|
|
||||||
AMDEP_TRUE = @AMDEP_TRUE@
|
|
||||||
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@
|
|
||||||
DOC_FALSE = @DOC_FALSE@
|
|
||||||
DOC_TRUE = @DOC_TRUE@
|
|
||||||
DOT = @DOT@
|
|
||||||
DOXYGEN = @DOXYGEN@
|
|
||||||
ECHO_C = @ECHO_C@
|
|
||||||
ECHO_N = @ECHO_N@
|
|
||||||
ECHO_T = @ECHO_T@
|
|
||||||
EGREP = @EGREP@
|
|
||||||
EXEEXT = @EXEEXT@
|
|
||||||
HAVE_GNU_COMPILERS_FALSE = @HAVE_GNU_COMPILERS_FALSE@
|
|
||||||
HAVE_GNU_COMPILERS_TRUE = @HAVE_GNU_COMPILERS_TRUE@
|
|
||||||
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@
|
|
||||||
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@
|
|
||||||
ac_ct_CXX = @ac_ct_CXX@
|
|
||||||
ac_ct_RANLIB = @ac_ct_RANLIB@
|
|
||||||
ac_ct_STRIP = @ac_ct_STRIP@
|
|
||||||
am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
|
|
||||||
am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
|
|
||||||
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@
|
|
||||||
datadir = @datadir@
|
|
||||||
exec_prefix = @exec_prefix@
|
|
||||||
host_alias = @host_alias@
|
|
||||||
includedir = @includedir@
|
|
||||||
infodir = @infodir@
|
|
||||||
install_sh = @install_sh@
|
|
||||||
libdir = @libdir@
|
|
||||||
libexecdir = @libexecdir@
|
|
||||||
localstatedir = @localstatedir@
|
|
||||||
mandir = @mandir@
|
|
||||||
mkdir_p = @mkdir_p@
|
|
||||||
oldincludedir = @oldincludedir@
|
|
||||||
prefix = @prefix@
|
|
||||||
program_transform_name = @program_transform_name@
|
|
||||||
sbindir = @sbindir@
|
|
||||||
sharedstatedir = @sharedstatedir@
|
|
||||||
sysconfdir = @sysconfdir@
|
|
||||||
target_alias = @target_alias@
|
|
||||||
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
|
|
||||||
uninstall-info-am:
|
|
||||||
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)'; for file in $$list; do \
|
|
||||||
case $$file in \
|
|
||||||
$(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
|
|
||||||
$(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
|
|
||||||
esac; \
|
|
||||||
if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
|
|
||||||
dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
|
|
||||||
if test "$$dir" != "$$file" && test "$$dir" != "."; then \
|
|
||||||
dir="/$$dir"; \
|
|
||||||
$(mkdir_p) "$(distdir)$$dir"; \
|
|
||||||
else \
|
|
||||||
dir=''; \
|
|
||||||
fi; \
|
|
||||||
if test -d $$d/$$file; then \
|
|
||||||
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-exec-am:
|
|
||||||
|
|
||||||
install-info: install-info-am
|
|
||||||
|
|
||||||
install-man:
|
|
||||||
|
|
||||||
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-info-am uninstall-libtclapincludeHEADERS
|
|
||||||
|
|
||||||
.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-exec install-exec-am \
|
|
||||||
install-info install-info-am install-libtclapincludeHEADERS \
|
|
||||||
install-man 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-info-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:
|
|
@ -1,422 +0,0 @@
|
|||||||
/******************************************************************************
|
|
||||||
*
|
|
||||||
* 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 <tclap/Arg.h>
|
|
||||||
#include <tclap/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::string _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::string& 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::string& flag,
|
|
||||||
const std::string& name,
|
|
||||||
const std::string& desc,
|
|
||||||
bool req,
|
|
||||||
const std::string& 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::string& flag,
|
|
||||||
const std::string& name,
|
|
||||||
const std::string& desc,
|
|
||||||
bool req,
|
|
||||||
const std::string& 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::string& flag,
|
|
||||||
const std::string& name,
|
|
||||||
const std::string& 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::string& flag,
|
|
||||||
const std::string& name,
|
|
||||||
const std::string& 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::string>& 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::string shortID(const std::string& val="val") const;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the a long id string. Used in the usage.
|
|
||||||
* \param val - value to be used.
|
|
||||||
*/
|
|
||||||
virtual std::string longID(const std::string& val="val") const;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Once we've matched the first value, then the arg is no longer
|
|
||||||
* required.
|
|
||||||
*/
|
|
||||||
virtual bool isRequired() const;
|
|
||||||
|
|
||||||
virtual bool allowMore();
|
|
||||||
|
|
||||||
virtual void reset();
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
template<class T>
|
|
||||||
MultiArg<T>::MultiArg(const std::string& flag,
|
|
||||||
const std::string& name,
|
|
||||||
const std::string& desc,
|
|
||||||
bool req,
|
|
||||||
const std::string& typeDesc,
|
|
||||||
Visitor* v)
|
|
||||||
: Arg( flag, name, desc, req, true, v ),
|
|
||||||
_typeDesc( typeDesc ),
|
|
||||||
_constraint( NULL ),
|
|
||||||
_allowMore(false)
|
|
||||||
{
|
|
||||||
_acceptsMultipleValues = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
template<class T>
|
|
||||||
MultiArg<T>::MultiArg(const std::string& flag,
|
|
||||||
const std::string& name,
|
|
||||||
const std::string& desc,
|
|
||||||
bool req,
|
|
||||||
const std::string& typeDesc,
|
|
||||||
CmdLineInterface& parser,
|
|
||||||
Visitor* v)
|
|
||||||
: Arg( flag, name, desc, req, true, v ),
|
|
||||||
_typeDesc( typeDesc ),
|
|
||||||
_constraint( NULL ),
|
|
||||||
_allowMore(false)
|
|
||||||
{
|
|
||||||
parser.add( this );
|
|
||||||
_acceptsMultipleValues = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
template<class T>
|
|
||||||
MultiArg<T>::MultiArg(const std::string& flag,
|
|
||||||
const std::string& name,
|
|
||||||
const std::string& desc,
|
|
||||||
bool req,
|
|
||||||
Constraint<T>* constraint,
|
|
||||||
Visitor* v)
|
|
||||||
: Arg( flag, name, desc, req, true, v ),
|
|
||||||
_typeDesc( constraint->shortID() ),
|
|
||||||
_constraint( constraint ),
|
|
||||||
_allowMore(false)
|
|
||||||
{
|
|
||||||
_acceptsMultipleValues = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
template<class T>
|
|
||||||
MultiArg<T>::MultiArg(const std::string& flag,
|
|
||||||
const std::string& name,
|
|
||||||
const std::string& desc,
|
|
||||||
bool req,
|
|
||||||
Constraint<T>* constraint,
|
|
||||||
CmdLineInterface& parser,
|
|
||||||
Visitor* v)
|
|
||||||
: Arg( flag, name, desc, req, true, v ),
|
|
||||||
_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::string>& args)
|
|
||||||
{
|
|
||||||
if ( _ignoreable && Arg::ignoreRest() )
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if ( _hasBlanks( args[*i] ) )
|
|
||||||
return false;
|
|
||||||
|
|
||||||
std::string flag = args[*i];
|
|
||||||
std::string value = "";
|
|
||||||
|
|
||||||
trimFlag( flag, value );
|
|
||||||
|
|
||||||
if ( argMatches( flag ) )
|
|
||||||
{
|
|
||||||
if ( Arg::delimiter() != ' ' && value == "" )
|
|
||||||
throw( ArgParseException(
|
|
||||||
"Couldn't find delimiter for this argument!",
|
|
||||||
toString() ) );
|
|
||||||
|
|
||||||
// always take the first one, regardless of start string
|
|
||||||
if ( value == "" )
|
|
||||||
{
|
|
||||||
(*i)++;
|
|
||||||
if ( static_cast<unsigned int>(*i) < args.size() )
|
|
||||||
_extractValue( args[*i] );
|
|
||||||
else
|
|
||||||
throw( ArgParseException("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::string MultiArg<T>::shortID(const std::string& val) const
|
|
||||||
{
|
|
||||||
static_cast<void>(val); // Ignore input, don't warn
|
|
||||||
return Arg::shortID(_typeDesc) + " ... ";
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
template<class T>
|
|
||||||
std::string MultiArg<T>::longID(const std::string& val) const
|
|
||||||
{
|
|
||||||
static_cast<void>(val); // Ignore input, don't warn
|
|
||||||
return Arg::longID(_typeDesc) + " (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::string& 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( "Value '" + val +
|
|
||||||
"' 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
|
|
@ -1,216 +0,0 @@
|
|||||||
|
|
||||||
/******************************************************************************
|
|
||||||
*
|
|
||||||
* 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 <tclap/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::string& flag,
|
|
||||||
const std::string& name,
|
|
||||||
const std::string& 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::string& flag,
|
|
||||||
const std::string& name,
|
|
||||||
const std::string& 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::string>& args);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns int, the number of times the switch has been set.
|
|
||||||
*/
|
|
||||||
int getValue();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the shortID for this Arg.
|
|
||||||
*/
|
|
||||||
std::string shortID(const std::string& val) const;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the longID for this Arg.
|
|
||||||
*/
|
|
||||||
std::string longID(const std::string& val) const;
|
|
||||||
|
|
||||||
void reset();
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////
|
|
||||||
//BEGIN MultiSwitchArg.cpp
|
|
||||||
//////////////////////////////////////////////////////////////////////
|
|
||||||
inline MultiSwitchArg::MultiSwitchArg(const std::string& flag,
|
|
||||||
const std::string& name,
|
|
||||||
const std::string& desc,
|
|
||||||
int init,
|
|
||||||
Visitor* v )
|
|
||||||
: SwitchArg(flag, name, desc, false, v),
|
|
||||||
_value( init ),
|
|
||||||
_default( init )
|
|
||||||
{ }
|
|
||||||
|
|
||||||
inline MultiSwitchArg::MultiSwitchArg(const std::string& flag,
|
|
||||||
const std::string& name,
|
|
||||||
const std::string& 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::string>& 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::string
|
|
||||||
MultiSwitchArg::shortID(const std::string& val) const
|
|
||||||
{
|
|
||||||
return Arg::shortID(val) + " ... ";
|
|
||||||
}
|
|
||||||
|
|
||||||
inline std::string
|
|
||||||
MultiSwitchArg::longID(const std::string& val) const
|
|
||||||
{
|
|
||||||
return Arg::longID(val) + " (accepted multiple times)";
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void
|
|
||||||
MultiSwitchArg::reset()
|
|
||||||
{
|
|
||||||
MultiSwitchArg::_value = MultiSwitchArg::_default;
|
|
||||||
}
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////
|
|
||||||
//END MultiSwitchArg.cpp
|
|
||||||
//////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
} //namespace TCLAP
|
|
||||||
|
|
||||||
#endif
|
|
@ -1,62 +0,0 @@
|
|||||||
|
|
||||||
|
|
||||||
/******************************************************************************
|
|
||||||
*
|
|
||||||
* 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::string& 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::string& argName )
|
|
||||||
{
|
|
||||||
if ( OptionalUnlabeledTracker::alreadyOptional() )
|
|
||||||
throw( SpecificationException(
|
|
||||||
"You can't specify ANY Unlabeled Arg following an optional Unlabeled Arg",
|
|
||||||
argName ) );
|
|
||||||
|
|
||||||
if ( !req )
|
|
||||||
OptionalUnlabeledTracker::gotOptional();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
} // namespace TCLAP
|
|
||||||
|
|
||||||
#endif
|
|
@ -1,186 +0,0 @@
|
|||||||
// -*- 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 tclap 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
|
|
||||||
|
|
||||||
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;
|
|
||||||
};
|
|
||||||
|
|
||||||
#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.
|
|
||||||
*/
|
|
||||||
/*
|
|
||||||
template<>
|
|
||||||
struct ArgTraits<wchar_t> {
|
|
||||||
typedef ValueLike ValueCategory;
|
|
||||||
};
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Strings have string like argument traits.
|
|
||||||
*/
|
|
||||||
template<>
|
|
||||||
struct ArgTraits<std::string> {
|
|
||||||
typedef StringLike ValueCategory;
|
|
||||||
};
|
|
||||||
|
|
||||||
template<typename T>
|
|
||||||
void SetString(T &dst, const std::string &src)
|
|
||||||
{
|
|
||||||
dst = src;
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
@ -1,298 +0,0 @@
|
|||||||
// -*- 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 <tclap/CmdLineInterface.h>
|
|
||||||
#include <tclap/CmdLineOutput.h>
|
|
||||||
#include <tclap/XorHandler.h>
|
|
||||||
#include <tclap/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::ostream& 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::ostream& 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::ostream& os,
|
|
||||||
const std::string& s,
|
|
||||||
int maxWidth,
|
|
||||||
int indentSpaces,
|
|
||||||
int secondLineOffset ) const;
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
inline void StdOutput::version(CmdLineInterface& _cmd)
|
|
||||||
{
|
|
||||||
std::string progName = _cmd.getProgramName();
|
|
||||||
std::string version = _cmd.getVersion();
|
|
||||||
|
|
||||||
std::cout << std::endl << progName << " version: "
|
|
||||||
<< version << std::endl << std::endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void StdOutput::usage(CmdLineInterface& _cmd )
|
|
||||||
{
|
|
||||||
std::cout << std::endl << "USAGE: " << std::endl << std::endl;
|
|
||||||
|
|
||||||
_shortUsage( _cmd, std::cout );
|
|
||||||
|
|
||||||
std::cout << std::endl << std::endl << "Where: " << std::endl << std::endl;
|
|
||||||
|
|
||||||
_longUsage( _cmd, std::cout );
|
|
||||||
|
|
||||||
std::cout << std::endl;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void StdOutput::failure( CmdLineInterface& _cmd,
|
|
||||||
ArgException& e )
|
|
||||||
{
|
|
||||||
std::string progName = _cmd.getProgramName();
|
|
||||||
|
|
||||||
std::cerr << "PARSE ERROR: " << e.argId() << std::endl
|
|
||||||
<< " " << e.error() << std::endl << std::endl;
|
|
||||||
|
|
||||||
if ( _cmd.hasHelpAndVersion() )
|
|
||||||
{
|
|
||||||
std::cerr << "Brief USAGE: " << std::endl;
|
|
||||||
|
|
||||||
_shortUsage( _cmd, std::cerr );
|
|
||||||
|
|
||||||
std::cerr << std::endl << "For complete USAGE and HELP type: "
|
|
||||||
<< std::endl << " " << progName << " --help"
|
|
||||||
<< std::endl << std::endl;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
usage(_cmd);
|
|
||||||
|
|
||||||
throw ExitException(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void
|
|
||||||
StdOutput::_shortUsage( CmdLineInterface& _cmd,
|
|
||||||
std::ostream& os ) const
|
|
||||||
{
|
|
||||||
std::list<Arg*> argList = _cmd.getArgList();
|
|
||||||
std::string progName = _cmd.getProgramName();
|
|
||||||
XorHandler xorHandler = _cmd.getXorHandler();
|
|
||||||
std::vector< std::vector<Arg*> > xorList = xorHandler.getXorList();
|
|
||||||
|
|
||||||
std::string s = progName + " ";
|
|
||||||
|
|
||||||
// first the xor
|
|
||||||
for ( int i = 0; static_cast<unsigned int>(i) < xorList.size(); i++ )
|
|
||||||
{
|
|
||||||
s += " {";
|
|
||||||
for ( ArgVectorIterator it = xorList[i].begin();
|
|
||||||
it != xorList[i].end(); it++ )
|
|
||||||
s += (*it)->shortID() + "|";
|
|
||||||
|
|
||||||
s[s.length()-1] = '}';
|
|
||||||
}
|
|
||||||
|
|
||||||
// then the rest
|
|
||||||
for (ArgListIterator it = argList.begin(); it != argList.end(); it++)
|
|
||||||
if ( !xorHandler.contains( (*it) ) )
|
|
||||||
s += " " + (*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::ostream& os ) const
|
|
||||||
{
|
|
||||||
std::list<Arg*> argList = _cmd.getArgList();
|
|
||||||
std::string 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, "-- 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::ostream& os,
|
|
||||||
const std::string& 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 doesn't end in middle of a word
|
|
||||||
if ( stringLen == allowedLen )
|
|
||||||
while ( stringLen >= 0 &&
|
|
||||||
s[stringLen+start] != ' ' &&
|
|
||||||
s[stringLen+start] != ',' &&
|
|
||||||
s[stringLen+start] != '|' )
|
|
||||||
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] == '\n' )
|
|
||||||
stringLen = i+1;
|
|
||||||
|
|
||||||
// print the indent
|
|
||||||
for ( int i = 0; i < indentSpaces; i++ )
|
|
||||||
os << " ";
|
|
||||||
|
|
||||||
if ( start == 0 )
|
|
||||||
{
|
|
||||||
// handle second line offsets
|
|
||||||
indentSpaces += secondLineOffset;
|
|
||||||
|
|
||||||
// adjust allowed len
|
|
||||||
allowedLen -= secondLineOffset;
|
|
||||||
}
|
|
||||||
|
|
||||||
os << s.substr(start,stringLen) << std::endl;
|
|
||||||
|
|
||||||
// so we don't start a line with a space
|
|
||||||
while ( s[stringLen+start] == ' ' && start < len )
|
|
||||||
start++;
|
|
||||||
|
|
||||||
start += stringLen;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
for ( int i = 0; i < indentSpaces; i++ )
|
|
||||||
os << " ";
|
|
||||||
os << s << std::endl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
} //namespace TCLAP
|
|
||||||
#endif
|
|
@ -1,228 +0,0 @@
|
|||||||
|
|
||||||
/******************************************************************************
|
|
||||||
*
|
|
||||||
* 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 <tclap/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::string& flag,
|
|
||||||
const std::string& name,
|
|
||||||
const std::string& 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::string& flag,
|
|
||||||
const std::string& name,
|
|
||||||
const std::string& 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::string>& args);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Checks a string to see if any of the chars in the string
|
|
||||||
* match the flag for this Switch.
|
|
||||||
*/
|
|
||||||
bool combinedSwitchesMatch(std::string& combined);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns bool, whether or not the switch has been set.
|
|
||||||
*/
|
|
||||||
bool getValue();
|
|
||||||
|
|
||||||
virtual void reset();
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////
|
|
||||||
//BEGIN SwitchArg.cpp
|
|
||||||
//////////////////////////////////////////////////////////////////////
|
|
||||||
inline SwitchArg::SwitchArg(const std::string& flag,
|
|
||||||
const std::string& name,
|
|
||||||
const std::string& desc,
|
|
||||||
bool default_val,
|
|
||||||
Visitor* v )
|
|
||||||
: Arg(flag, name, desc, false, false, v),
|
|
||||||
_value( default_val ),
|
|
||||||
_default( default_val )
|
|
||||||
{ }
|
|
||||||
|
|
||||||
inline SwitchArg::SwitchArg(const std::string& flag,
|
|
||||||
const std::string& name,
|
|
||||||
const std::string& 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::combinedSwitchesMatch(std::string& 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 isn't in the string
|
|
||||||
if ( combinedSwitches.find_first_of( Arg::delimiter() ) != std::string::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 bool SwitchArg::processArg(int *i, std::vector<std::string>& args)
|
|
||||||
{
|
|
||||||
if ( _ignoreable && Arg::ignoreRest() )
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if ( argMatches( args[*i] ) || combinedSwitchesMatch( args[*i] ) )
|
|
||||||
{
|
|
||||||
// If we match on a combined switch, then we want to return false
|
|
||||||
// so that other switches in the combination will also have a
|
|
||||||
// chance to match.
|
|
||||||
bool ret = false;
|
|
||||||
if ( argMatches( args[*i] ) )
|
|
||||||
ret = true;
|
|
||||||
|
|
||||||
if ( _alreadySet || ( !ret && combinedSwitchesMatch( args[*i] ) ) )
|
|
||||||
throw(CmdLineParseException("Argument already set!", toString()));
|
|
||||||
|
|
||||||
_alreadySet = true;
|
|
||||||
|
|
||||||
if ( _value == true )
|
|
||||||
_value = false;
|
|
||||||
else
|
|
||||||
_value = true;
|
|
||||||
|
|
||||||
_checkWithVisitor();
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void SwitchArg::reset()
|
|
||||||
{
|
|
||||||
Arg::reset();
|
|
||||||
_value = _default;
|
|
||||||
}
|
|
||||||
//////////////////////////////////////////////////////////////////////
|
|
||||||
//End SwitchArg.cpp
|
|
||||||
//////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
} //namespace TCLAP
|
|
||||||
|
|
||||||
#endif
|
|
@ -1,301 +0,0 @@
|
|||||||
|
|
||||||
/******************************************************************************
|
|
||||||
*
|
|
||||||
* 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 <tclap/MultiArg.h>
|
|
||||||
#include <tclap/OptionalUnlabeledTracker.h>
|
|
||||||
|
|
||||||
namespace TCLAP {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Just like a MultiArg, except that the arguments are unlabeled. Basically,
|
|
||||||
* this Arg will slurp up everything that hasn'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::string& name,
|
|
||||||
const std::string& desc,
|
|
||||||
bool req,
|
|
||||||
const std::string& 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::string& name,
|
|
||||||
const std::string& desc,
|
|
||||||
bool req,
|
|
||||||
const std::string& 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::string& name,
|
|
||||||
const std::string& 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::string& name,
|
|
||||||
const std::string& 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::string>& args);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the a short id string. Used in the usage.
|
|
||||||
* \param val - value to be used.
|
|
||||||
*/
|
|
||||||
virtual std::string shortID(const std::string& val="val") const;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the a long id string. Used in the usage.
|
|
||||||
* \param val - value to be used.
|
|
||||||
*/
|
|
||||||
virtual std::string longID(const std::string& 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::string& name,
|
|
||||||
const std::string& desc,
|
|
||||||
bool req,
|
|
||||||
const std::string& 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::string& name,
|
|
||||||
const std::string& desc,
|
|
||||||
bool req,
|
|
||||||
const std::string& typeDesc,
|
|
||||||
CmdLineInterface& parser,
|
|
||||||
bool ignoreable,
|
|
||||||
Visitor* v)
|
|
||||||
: MultiArg<T>("", name, desc, req, typeDesc, v)
|
|
||||||
{
|
|
||||||
_ignoreable = ignoreable;
|
|
||||||
OptionalUnlabeledTracker::check(true, toString());
|
|
||||||
parser.add( this );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
template<class T>
|
|
||||||
UnlabeledMultiArg<T>::UnlabeledMultiArg(const std::string& name,
|
|
||||||
const std::string& 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::string& name,
|
|
||||||
const std::string& 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::string>& 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::string UnlabeledMultiArg<T>::shortID(const std::string& val) const
|
|
||||||
{
|
|
||||||
static_cast<void>(val); // Ignore input, don't warn
|
|
||||||
return std::string("<") + _typeDesc + "> ...";
|
|
||||||
}
|
|
||||||
|
|
||||||
template<class T>
|
|
||||||
std::string UnlabeledMultiArg<T>::longID(const std::string& val) const
|
|
||||||
{
|
|
||||||
static_cast<void>(val); // Ignore input, don't warn
|
|
||||||
return std::string("<") + _typeDesc + "> (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
|
|
@ -1,340 +0,0 @@
|
|||||||
|
|
||||||
/******************************************************************************
|
|
||||||
*
|
|
||||||
* 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 <tclap/ValueArg.h>
|
|
||||||
#include <tclap/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 '--' 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::string& name,
|
|
||||||
const std::string& desc,
|
|
||||||
bool req,
|
|
||||||
T value,
|
|
||||||
const std::string& 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 '--' 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::string& name,
|
|
||||||
const std::string& desc,
|
|
||||||
bool req,
|
|
||||||
T value,
|
|
||||||
const std::string& 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 '--' 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::string& name,
|
|
||||||
const std::string& 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 '--' 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::string& name,
|
|
||||||
const std::string& 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::string>& args);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Overrides shortID for specific behavior.
|
|
||||||
*/
|
|
||||||
virtual std::string shortID(const std::string& val="val") const;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Overrides longID for specific behavior.
|
|
||||||
*/
|
|
||||||
virtual std::string longID(const std::string& val="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::string& name,
|
|
||||||
const std::string& desc,
|
|
||||||
bool req,
|
|
||||||
T val,
|
|
||||||
const std::string& typeDesc,
|
|
||||||
bool ignoreable,
|
|
||||||
Visitor* v)
|
|
||||||
: ValueArg<T>("", name, desc, req, val, typeDesc, v)
|
|
||||||
{
|
|
||||||
_ignoreable = ignoreable;
|
|
||||||
|
|
||||||
OptionalUnlabeledTracker::check(req, toString());
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
template<class T>
|
|
||||||
UnlabeledValueArg<T>::UnlabeledValueArg(const std::string& name,
|
|
||||||
const std::string& desc,
|
|
||||||
bool req,
|
|
||||||
T val,
|
|
||||||
const std::string& typeDesc,
|
|
||||||
CmdLineInterface& parser,
|
|
||||||
bool ignoreable,
|
|
||||||
Visitor* v)
|
|
||||||
: ValueArg<T>("", 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::string& name,
|
|
||||||
const std::string& desc,
|
|
||||||
bool req,
|
|
||||||
T val,
|
|
||||||
Constraint<T>* constraint,
|
|
||||||
bool ignoreable,
|
|
||||||
Visitor* v)
|
|
||||||
: ValueArg<T>("", name, desc, req, val, constraint, v)
|
|
||||||
{
|
|
||||||
_ignoreable = ignoreable;
|
|
||||||
OptionalUnlabeledTracker::check(req, toString());
|
|
||||||
}
|
|
||||||
|
|
||||||
template<class T>
|
|
||||||
UnlabeledValueArg<T>::UnlabeledValueArg(const std::string& name,
|
|
||||||
const std::string& desc,
|
|
||||||
bool req,
|
|
||||||
T val,
|
|
||||||
Constraint<T>* constraint,
|
|
||||||
CmdLineInterface& parser,
|
|
||||||
bool ignoreable,
|
|
||||||
Visitor* v)
|
|
||||||
: ValueArg<T>("", 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::string>& 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::string UnlabeledValueArg<T>::shortID(const std::string& val) const
|
|
||||||
{
|
|
||||||
static_cast<void>(val); // Ignore input, don't warn
|
|
||||||
return std::string("<") + _typeDesc + ">";
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Overriding longID for specific output.
|
|
||||||
*/
|
|
||||||
template<class T>
|
|
||||||
std::string UnlabeledValueArg<T>::longID(const std::string& 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 "names" of the types.
|
|
||||||
return std::string("<") + _typeDesc + ">";
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 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
|
|
@ -1,411 +0,0 @@
|
|||||||
/******************************************************************************
|
|
||||||
*
|
|
||||||
* 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 <tclap/Arg.h>
|
|
||||||
#include <tclap/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::string _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::string& 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::string& flag,
|
|
||||||
const std::string& name,
|
|
||||||
const std::string& desc,
|
|
||||||
bool req,
|
|
||||||
T value,
|
|
||||||
const std::string& 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::string& flag,
|
|
||||||
const std::string& name,
|
|
||||||
const std::string& desc,
|
|
||||||
bool req,
|
|
||||||
T value,
|
|
||||||
const std::string& 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::string& flag,
|
|
||||||
const std::string& name,
|
|
||||||
const std::string& 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::string& flag,
|
|
||||||
const std::string& name,
|
|
||||||
const std::string& 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::string>& args);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the value of the argument.
|
|
||||||
*/
|
|
||||||
T& getValue() ;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Specialization of shortID.
|
|
||||||
* \param val - value to be used.
|
|
||||||
*/
|
|
||||||
virtual std::string shortID(const std::string& val = "val") const;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Specialization of longID.
|
|
||||||
* \param val - value to be used.
|
|
||||||
*/
|
|
||||||
virtual std::string longID(const std::string& val = "val") const;
|
|
||||||
|
|
||||||
virtual void reset() ;
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructor implementation.
|
|
||||||
*/
|
|
||||||
template<class T>
|
|
||||||
ValueArg<T>::ValueArg(const std::string& flag,
|
|
||||||
const std::string& name,
|
|
||||||
const std::string& desc,
|
|
||||||
bool req,
|
|
||||||
T val,
|
|
||||||
const std::string& 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::string& flag,
|
|
||||||
const std::string& name,
|
|
||||||
const std::string& desc,
|
|
||||||
bool req,
|
|
||||||
T val,
|
|
||||||
const std::string& 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::string& flag,
|
|
||||||
const std::string& name,
|
|
||||||
const std::string& 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::string& flag,
|
|
||||||
const std::string& name,
|
|
||||||
const std::string& 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::string>& args)
|
|
||||||
{
|
|
||||||
if ( _ignoreable && Arg::ignoreRest() )
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if ( _hasBlanks( args[*i] ) )
|
|
||||||
return false;
|
|
||||||
|
|
||||||
std::string flag = args[*i];
|
|
||||||
|
|
||||||
std::string value = "";
|
|
||||||
trimFlag( flag, value );
|
|
||||||
|
|
||||||
if ( argMatches( flag ) )
|
|
||||||
{
|
|
||||||
if ( _alreadySet )
|
|
||||||
throw( CmdLineParseException("Argument already set!", toString()) );
|
|
||||||
|
|
||||||
if ( Arg::delimiter() != ' ' && value == "" )
|
|
||||||
throw( ArgParseException(
|
|
||||||
"Couldn't find delimiter for this argument!",
|
|
||||||
toString() ) );
|
|
||||||
|
|
||||||
if ( value == "" )
|
|
||||||
{
|
|
||||||
(*i)++;
|
|
||||||
if ( static_cast<unsigned int>(*i) < args.size() )
|
|
||||||
_extractValue( args[*i] );
|
|
||||||
else
|
|
||||||
throw( ArgParseException("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::string ValueArg<T>::shortID(const std::string& val) const
|
|
||||||
{
|
|
||||||
static_cast<void>(val); // Ignore input, don't warn
|
|
||||||
return Arg::shortID( _typeDesc );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Implementation of longID.
|
|
||||||
*/
|
|
||||||
template<class T>
|
|
||||||
std::string ValueArg<T>::longID(const std::string& val) const
|
|
||||||
{
|
|
||||||
static_cast<void>(val); // Ignore input, don't warn
|
|
||||||
return Arg::longID( _typeDesc );
|
|
||||||
}
|
|
||||||
|
|
||||||
template<class T>
|
|
||||||
void ValueArg<T>::_extractValue( const std::string& 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( "Value '" + val +
|
|
||||||
+ "' does not meet constraint: "
|
|
||||||
+ _constraint->description(),
|
|
||||||
toString() ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
template<class T>
|
|
||||||
void ValueArg<T>::reset()
|
|
||||||
{
|
|
||||||
Arg::reset();
|
|
||||||
_value = _default;
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace TCLAP
|
|
||||||
|
|
||||||
#endif
|
|
@ -1,147 +0,0 @@
|
|||||||
|
|
||||||
|
|
||||||
/******************************************************************************
|
|
||||||
*
|
|
||||||
* 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 <tclap/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 "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::string description() const;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the short ID for the Constraint.
|
|
||||||
*/
|
|
||||||
virtual std::string 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::string _typeDesc;
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
template<class T>
|
|
||||||
ValuesConstraint<T>::ValuesConstraint(std::vector<T>& allowed)
|
|
||||||
: _allowed(allowed)
|
|
||||||
{
|
|
||||||
for ( unsigned int i = 0; i < _allowed.size(); i++ )
|
|
||||||
{
|
|
||||||
|
|
||||||
#if defined(HAVE_SSTREAM)
|
|
||||||
std::ostringstream os;
|
|
||||||
#elif defined(HAVE_STRSTREAM)
|
|
||||||
std::ostrstream os;
|
|
||||||
#else
|
|
||||||
#error "Need a stringstream (sstream or strstream) to compile!"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
os << _allowed[i];
|
|
||||||
|
|
||||||
std::string temp( os.str() );
|
|
||||||
|
|
||||||
if ( i > 0 )
|
|
||||||
_typeDesc += "|";
|
|
||||||
_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::string ValuesConstraint<T>::shortID() const
|
|
||||||
{
|
|
||||||
return _typeDesc;
|
|
||||||
}
|
|
||||||
|
|
||||||
template<class T>
|
|
||||||
std::string ValuesConstraint<T>::description() const
|
|
||||||
{
|
|
||||||
return _typeDesc;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
} //namespace TCLAP
|
|
||||||
#endif
|
|
||||||
|
|
@ -1,74 +0,0 @@
|
|||||||
// -*- 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 <tclap/CmdLineInterface.h>
|
|
||||||
#include <tclap/CmdLineOutput.h>
|
|
||||||
#include <tclap/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
|
|
||||||
{
|
|
||||||
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
|
|
@ -1,53 +0,0 @@
|
|||||||
|
|
||||||
/******************************************************************************
|
|
||||||
*
|
|
||||||
* 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
|
|
@ -1,156 +0,0 @@
|
|||||||
|
|
||||||
/******************************************************************************
|
|
||||||
*
|
|
||||||
* 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 <tclap/Arg.h>
|
|
||||||
#include <string>
|
|
||||||
#include <vector>
|
|
||||||
#include <algorithm>
|
|
||||||
#include <iostream>
|
|
||||||
|
|
||||||
namespace TCLAP {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This class handles lists of Arg's that are to be XOR'd on the command
|
|
||||||
* line. This is used by CmdLine and you shouldn't ever use it.
|
|
||||||
*/
|
|
||||||
class XorHandler
|
|
||||||
{
|
|
||||||
protected:
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The list of of lists of Arg's to be or'd together.
|
|
||||||
*/
|
|
||||||
std::vector< std::vector<Arg*> > _orList;
|
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructor. Does nothing.
|
|
||||||
*/
|
|
||||||
XorHandler( ) {}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Add a list of Arg*'s that will be orred together.
|
|
||||||
* \param ors - list of Arg* that will be xor'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::string 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() )
|
|
||||||
{
|
|
||||||
// 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
|
|
@ -1,321 +0,0 @@
|
|||||||
// -*- 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 <tclap/CmdLineInterface.h>
|
|
||||||
#include <tclap/CmdLineOutput.h>
|
|
||||||
#include <tclap/XorHandler.h>
|
|
||||||
#include <tclap/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::string& s );
|
|
||||||
void quoteSpecialChars( std::string& s );
|
|
||||||
|
|
||||||
std::string getMutexList( CmdLineInterface& _cmd, Arg* a );
|
|
||||||
void printOption( Arg* it, std::string mutex );
|
|
||||||
void printArg( Arg* it );
|
|
||||||
|
|
||||||
std::map<std::string, std::string> common;
|
|
||||||
char theDelimiter;
|
|
||||||
};
|
|
||||||
|
|
||||||
ZshCompletionOutput::ZshCompletionOutput()
|
|
||||||
{
|
|
||||||
common["host"] = "_hosts";
|
|
||||||
common["hostname"] = "_hosts";
|
|
||||||
common["file"] = "_files";
|
|
||||||
common["filename"] = "_files";
|
|
||||||
common["user"] = "_users";
|
|
||||||
common["username"] = "_users";
|
|
||||||
common["directory"] = "_directories";
|
|
||||||
common["path"] = "_directories";
|
|
||||||
common["url"] = "_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::string progName = _cmd.getProgramName();
|
|
||||||
std::string version = _cmd.getVersion();
|
|
||||||
theDelimiter = _cmd.getDelimiter();
|
|
||||||
basename(progName);
|
|
||||||
|
|
||||||
std::cout << "#compdef " << progName << std::endl << std::endl <<
|
|
||||||
"# " << progName << " version " << _cmd.getVersion() << std::endl << std::endl <<
|
|
||||||
"_arguments -s -S";
|
|
||||||
|
|
||||||
for (ArgListIterator it = argList.begin(); it != argList.end(); it++)
|
|
||||||
{
|
|
||||||
if ( (*it)->shortID().at(0) == '<' )
|
|
||||||
printArg((*it));
|
|
||||||
else if ( (*it)->getFlag() != "-" )
|
|
||||||
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::string& s )
|
|
||||||
{
|
|
||||||
size_t idx = s.find_last_of(':');
|
|
||||||
while ( idx != std::string::npos )
|
|
||||||
{
|
|
||||||
s.insert(idx, 1, '\\');
|
|
||||||
idx = s.find_last_of(':', idx);
|
|
||||||
}
|
|
||||||
idx = s.find_last_of('\'');
|
|
||||||
while ( idx != std::string::npos )
|
|
||||||
{
|
|
||||||
s.insert(idx, "'\\'");
|
|
||||||
if (idx == 0)
|
|
||||||
idx = std::string::npos;
|
|
||||||
else
|
|
||||||
idx = s.find_last_of('\'', --idx);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void ZshCompletionOutput::basename( std::string& s )
|
|
||||||
{
|
|
||||||
size_t p = s.find_last_of('/');
|
|
||||||
if ( p != std::string::npos )
|
|
||||||
{
|
|
||||||
s.erase(0, p + 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void ZshCompletionOutput::printArg(Arg* a)
|
|
||||||
{
|
|
||||||
static int count = 1;
|
|
||||||
|
|
||||||
std::cout << " \\" << std::endl << " '";
|
|
||||||
if ( a->acceptsMultipleValues() )
|
|
||||||
std::cout << '*';
|
|
||||||
else
|
|
||||||
std::cout << count++;
|
|
||||||
std::cout << ':';
|
|
||||||
if ( !a->isRequired() )
|
|
||||||
std::cout << ':';
|
|
||||||
|
|
||||||
std::cout << a->getName() << ':';
|
|
||||||
std::map<std::string, std::string>::iterator compArg = common.find(a->getName());
|
|
||||||
if ( compArg != common.end() )
|
|
||||||
{
|
|
||||||
std::cout << compArg->second;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
std::cout << "_guard \"^-*\" " << a->getName();
|
|
||||||
}
|
|
||||||
std::cout << '\'';
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void ZshCompletionOutput::printOption(Arg* a, std::string mutex)
|
|
||||||
{
|
|
||||||
std::string flag = a->flagStartChar() + a->getFlag();
|
|
||||||
std::string name = a->nameStartString() + a->getName();
|
|
||||||
std::string 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) == '.')
|
|
||||||
{
|
|
||||||
desc.erase(len);
|
|
||||||
}
|
|
||||||
if (len)
|
|
||||||
{
|
|
||||||
desc.replace(0, 1, 1, tolower(desc.at(0)));
|
|
||||||
}
|
|
||||||
|
|
||||||
std::cout << " \\" << std::endl << " '" << mutex;
|
|
||||||
|
|
||||||
if ( a->getFlag().empty() )
|
|
||||||
{
|
|
||||||
std::cout << name;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
std::cout << "'{" << flag << ',' << name << "}'";
|
|
||||||
}
|
|
||||||
if ( theDelimiter == '=' && a->isValueRequired() )
|
|
||||||
std::cout << "=-";
|
|
||||||
quoteSpecialChars(desc);
|
|
||||||
std::cout << '[' << desc << ']';
|
|
||||||
|
|
||||||
if ( a->isValueRequired() )
|
|
||||||
{
|
|
||||||
std::string 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::string::npos )
|
|
||||||
{
|
|
||||||
do
|
|
||||||
{
|
|
||||||
arg.replace(p, 1, 1, ' ');
|
|
||||||
}
|
|
||||||
while ( (p = arg.find_first_of('|', p)) != std::string::npos );
|
|
||||||
quoteSpecialChars(arg);
|
|
||||||
std::cout << ": :(" << arg << ')';
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
std::cout << ':' << arg;
|
|
||||||
std::map<std::string, std::string>::iterator compArg = common.find(arg);
|
|
||||||
if ( compArg != common.end() )
|
|
||||||
{
|
|
||||||
std::cout << ':' << compArg->second;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
std::cout << '\'';
|
|
||||||
}
|
|
||||||
|
|
||||||
inline std::string ZshCompletionOutput::getMutexList( CmdLineInterface& _cmd, Arg* a)
|
|
||||||
{
|
|
||||||
XorHandler xorHandler = _cmd.getXorHandler();
|
|
||||||
std::vector< std::vector<Arg*> > xorList = xorHandler.getXorList();
|
|
||||||
|
|
||||||
if (a->getName() == "help" || a->getName() == "version")
|
|
||||||
{
|
|
||||||
return "(-)";
|
|
||||||
}
|
|
||||||
|
|
||||||
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() << ' ' <<
|
|
||||||
a->nameStartString() << a->getName() << ')';
|
|
||||||
}
|
|
||||||
|
|
||||||
return list.str();
|
|
||||||
}
|
|
||||||
|
|
||||||
} //namespace TCLAP
|
|
||||||
#endif
|
|
Loading…
Reference in new issue