mirror of
https://github.com/cuberite/TCLAP.git
synced 2025-09-08 03:40:21 -04:00
added support for parsing hex and octal ints as well as small fix to support gcc 4.4
This commit is contained in:
parent
3251c3e40d
commit
352a838666
496
docs/manual.html
496
docs/manual.html
@ -1,27 +1,27 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><title>Templatized C++ Command Line Parser Manual</title><link rel="stylesheet" href="style.css" type="text/css" /><meta name="generator" content="DocBook XSL Stylesheets V1.71.1" /></head><body><div class="book" lang="en" xml:lang="en"><div class="titlepage"><div><div><h1 class="title"><a id="id838858"></a>Templatized C++ Command Line Parser Manual</h1></div><div><div class="author"><h3 class="author"><span class="firstname">Michael</span> <span class="othername">E</span> <span class="surname">Smoot</span></h3></div></div><div><p class="copyright">Copyright © 2003,2004,2005,2006 Michael E. Smoot</p></div></div><hr /></div><div class="toc"><p><b>Table of Contents</b></p><dl><dt><span class="chapter"><a href="#id856549">1. Basic Usage</a></span></dt><dd><dl><dt><span class="sect1"><a href="#id856554">Overview</a></span></dt><dt><span class="sect1"><a href="#id856614">Example</a></span></dt><dd><dl><dt><span class="sect2"><a href="#id856644">Library Properties</a></span></dt><dt><span class="sect2"><a href="#ARG_PROPERTIES">Common Argument Properties</a></span></dt></dl></dd><dt><span class="sect1"><a href="#COMPILING">Compiling</a></span></dt></dl></dd><dt><span class="chapter"><a href="#FUNDAMENTAL_CLASSES">2. Fundamental Classes</a></span></dt><dd><dl><dt><span class="sect1"><a href="#COMMAND_LINE"><code class="classname">CmdLine</code></a></span></dt><dt><span class="sect1"><a href="#id857113"><code class="classname">SwitchArg</code></a></span></dt><dt><span class="sect1"><a href="#id857146"><code class="classname">ValueArg</code></a></span></dt><dt><span class="sect1"><a href="#id857193"><code class="classname">MultiArg</code></a></span></dt><dt><span class="sect1"><a href="#id857294"><code class="classname">MultiSwitchArg</code></a></span></dt><dt><span class="sect1"><a href="#UNLABELED_MULTI_ARG"><code class="classname">UnlabeledValueArg</code></a></span></dt><dt><span class="sect1"><a href="#id857468"><code class="classname">UnlabeledMultiArg</code></a></span></dt></dl></dd><dt><span class="chapter"><a href="#COMPLICATIONS">3. Complications</a></span></dt><dd><dl><dt><span class="sect1"><a href="#COMBINE_SWITCHES">I want to combine multiple switches into one argument...</a></span></dt><dt><span class="sect1"><a href="#XOR">I want one argument or the other, but not both...</a></span></dt><dt><span class="sect1"><a href="#NO_FLAG">I have more arguments than single flags make sense for...</a></span></dt><dt><span class="sect1"><a href="#CONSTRAINT">I want to constrain the values allowed for a particular
|
||||
argument...</a></span></dt><dt><span class="sect1"><a href="#ARG_ADD_CMDLINE">I want the Args to add themselves to the CmdLine...</a></span></dt><dt><span class="sect1"><a href="#CHANGE_OUTPUT">I want different output than what is provided...</a></span></dt><dt><span class="sect1"><a href="#NO_HELP_VERSION">I don't want the --help and --version switches to be created automatically...</a></span></dt></dl></dd><dt><span class="chapter"><a href="#NOTES">4. Notes</a></span></dt><dd><dl><dt><span class="sect1"><a href="#DESCRIPTION_EXCEPTIONS">Type Descriptions</a></span></dt><dt><span class="sect1"><a href="#VISITORS">Visitors</a></span></dt><dt><span class="sect1"><a href="#MORE_INFO">More Information</a></span></dt></dl></dd></dl></div><div class="chapter" lang="en" xml:lang="en"><div class="titlepage"><div><div><h2 class="title"><a id="id856549"></a>Chapter 1. Basic Usage</h2></div></div></div><div class="toc"><p><b>Table of Contents</b></p><dl><dt><span class="sect1"><a href="#id856554">Overview</a></span></dt><dt><span class="sect1"><a href="#id856614">Example</a></span></dt><dd><dl><dt><span class="sect2"><a href="#id856644">Library Properties</a></span></dt><dt><span class="sect2"><a href="#ARG_PROPERTIES">Common Argument Properties</a></span></dt></dl></dd><dt><span class="sect1"><a href="#COMPILING">Compiling</a></span></dt></dl></div><div class="sect1" lang="en" xml:lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="id856554"></a>Overview</h2></div></div></div><p>
|
||||
<html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><title>Templatized C++ Command Line Parser Manual</title><link rel="stylesheet" href="style.css" type="text/css" /><meta name="generator" content="DocBook XSL Stylesheets V1.65.1" /></head><body><div class="book" lang="en" xml:lang="en"><div class="titlepage"><div><div><h1 class="title"><a id="id2414372"></a>Templatized C++ Command Line Parser Manual</h1></div><div><div class="author"><h3 class="author"><span class="firstname">Michael</span> <span class="othername">E</span> <span class="surname">Smoot</span></h3></div></div><div><p class="copyright">Copyright © 2003,2004,2005,2006 Michael E. Smoot</p></div></div><div></div><hr /></div><div class="toc"><p><b>Table of Contents</b></p><dl><dt><span class="chapter"><a href="#id2463205">1. Basic Usage</a></span></dt><dd><dl><dt><span class="sect1"><a href="#id2463211">Overview</a></span></dt><dt><span class="sect1"><a href="#id2463275">Example</a></span></dt><dd><dl><dt><span class="sect2"><a href="#id2463300">Library Properties</a></span></dt><dt><span class="sect2"><a href="#ARG_PROPERTIES">Common Argument Properties</a></span></dt></dl></dd><dt><span class="sect1"><a href="#COMPILING">Compiling</a></span></dt></dl></dd><dt><span class="chapter"><a href="#FUNDAMENTAL_CLASSES">2. Fundamental Classes</a></span></dt><dd><dl><dt><span class="sect1"><a href="#COMMAND_LINE">CmdLine</a></span></dt><dt><span class="sect1"><a href="#id2415463">SwitchArg</a></span></dt><dt><span class="sect1"><a href="#id2415496">ValueArg</a></span></dt><dt><span class="sect1"><a href="#id2415543">MultiArg</a></span></dt><dt><span class="sect1"><a href="#id2415643">MultiSwitchArg</a></span></dt><dt><span class="sect1"><a href="#UNLABELED_MULTI_ARG">UnlabeledValueArg</a></span></dt><dt><span class="sect1"><a href="#id2475949">UnlabeledMultiArg</a></span></dt></dl></dd><dt><span class="chapter"><a href="#COMPLICATIONS">3. Complications</a></span></dt><dd><dl><dt><span class="sect1"><a href="#COMBINE_SWITCHES">I want to combine multiple switches into one argument...</a></span></dt><dt><span class="sect1"><a href="#XOR">I want one argument or the other, but not both...</a></span></dt><dt><span class="sect1"><a href="#NO_FLAG">I have more arguments than single flags make sense for...</a></span></dt><dt><span class="sect1"><a href="#CONSTRAINT">I want to constrain the values allowed for a particular
|
||||
argument...</a></span></dt><dt><span class="sect1"><a href="#ARG_ADD_CMDLINE">I want the Args to add themselves to the CmdLine...</a></span></dt><dt><span class="sect1"><a href="#CHANGE_OUTPUT">I want different output than what is provided...</a></span></dt><dt><span class="sect1"><a href="#NO_HELP_VERSION">I don't want the --help and --version switches to be created automatically...</a></span></dt><dt><span class="sect1"><a href="#IGNORE_ARGS">I want to ignore certain arguments...</a></span></dt><dt><span class="sect1"><a href="#READING_HEX_INTEGERS">I want to read hex integers as arguments...</a></span></dt></dl></dd><dt><span class="chapter"><a href="#NOTES">4. Notes</a></span></dt><dd><dl><dt><span class="sect1"><a href="#DESCRIPTION_EXCEPTIONS">Type Descriptions</a></span></dt><dt><span class="sect1"><a href="#VISITORS">Visitors</a></span></dt><dt><span class="sect1"><a href="#MORE_INFO">More Information</a></span></dt></dl></dd></dl></div><div class="chapter" lang="en" xml:lang="en"><div class="titlepage"><div><div><h2 class="title"><a id="id2463205"></a>Chapter 1. Basic Usage</h2></div></div><div></div></div><div class="toc"><p><b>Table of Contents</b></p><dl><dt><span class="sect1"><a href="#id2463211">Overview</a></span></dt><dt><span class="sect1"><a href="#id2463275">Example</a></span></dt><dd><dl><dt><span class="sect2"><a href="#id2463300">Library Properties</a></span></dt><dt><span class="sect2"><a href="#ARG_PROPERTIES">Common Argument Properties</a></span></dt></dl></dd><dt><span class="sect1"><a href="#COMPILING">Compiling</a></span></dt></dl></div><div class="sect1" lang="en" xml:lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="id2463211"></a>Overview</h2></div></div><div></div></div><p>
|
||||
<span class="emphasis"><em>TCLAP</em></span> has a few key classes to be aware of.
|
||||
The first is the
|
||||
<code class="classname">CmdLine</code> (command line) class. This class parses
|
||||
<tt class="classname">CmdLine</tt> (command line) class. This class parses
|
||||
the command line passed to it according to the arguments that it
|
||||
contains. Arguments are separate objects that are added to the
|
||||
<code class="classname">CmdLine</code> object one at a time. The six
|
||||
argument classes are: <code class="classname">ValueArg</code>,
|
||||
<code class="classname">UnlabeledValueArg</code>,
|
||||
<code class="classname">SwitchArg</code>, <code class="classname">MultiSwitchArg</code>,
|
||||
<code class="classname">MultiArg</code> and
|
||||
<code class="classname">UnlabeledMultiArg</code>.
|
||||
<tt class="classname">CmdLine</tt> object one at a time. The six
|
||||
argument classes are: <tt class="classname">ValueArg</tt>,
|
||||
<tt class="classname">UnlabeledValueArg</tt>,
|
||||
<tt class="classname">SwitchArg</tt>, <tt class="classname">MultiSwitchArg</tt>,
|
||||
<tt class="classname">MultiArg</tt> and
|
||||
<tt class="classname">UnlabeledMultiArg</tt>.
|
||||
These classes are templatized, which means they can be defined to parse
|
||||
a value of any <a href="#FOOTNOTES"> type**</a>. Once you add the
|
||||
arguments to the <code class="classname">CmdLine</code> object, it parses the
|
||||
arguments to the <tt class="classname">CmdLine</tt> object, it parses the
|
||||
command line
|
||||
and assigns the data it finds to the specific argument objects it
|
||||
contains. Your program accesses the values parsed by
|
||||
calls to the <code class="methodname">getValue()</code> methods of the
|
||||
calls to the <tt class="methodname">getValue()</tt> methods of the
|
||||
argument objects.
|
||||
</p></div><div class="sect1" lang="en" xml:lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="id856614"></a>Example</h2></div></div></div><p>
|
||||
</p></div><div class="sect1" lang="en" xml:lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="id2463275"></a>Example</h2></div></div><div></div></div><p>
|
||||
Here is a simple <a href="test1.cpp" target="_top"> example</a> ...
|
||||
|
||||
</p><pre class="programlisting">
|
||||
@ -137,18 +137,18 @@ Where:
|
||||
Command description message
|
||||
|
||||
</pre><p>
|
||||
</p><div class="sect2" lang="en" xml:lang="en"><div class="titlepage"><div><div><h3 class="title"><a id="id856644"></a>Library Properties</h3></div></div></div><p>
|
||||
</p><div class="sect2" lang="en" xml:lang="en"><div class="titlepage"><div><div><h3 class="title"><a id="id2463300"></a>Library Properties</h3></div></div><div></div></div><p>
|
||||
This example shows a number of different properties of the
|
||||
library...
|
||||
</p><div class="itemizedlist"><ul type="disc"><li>Arguments can appear in any order (...mostly,
|
||||
<a href="#COMPLICATIONS" title="Chapter 3. Complications"> more</a> on this later).</li><li>The <em class="parameter"><code>help</code></em>, <em class="parameter"><code>version</code></em>
|
||||
and <em class="parameter"><code>--</code></em><code class="classname">SwitchArg</code>s
|
||||
are specified automatically. Using either the <em class="parameter"><code>-h</code></em> or
|
||||
<em class="parameter"><code>--help</code></em> flag will cause the USAGE message to be displayed,
|
||||
<em class="parameter"><code>-v</code></em> or <em class="parameter"><code>--version</code></em> will cause
|
||||
<a href="#COMPLICATIONS" title="Chapter 3. Complications"> more</a> on this later).</li><li>The <i class="parameter"><tt>help</tt></i>, <i class="parameter"><tt>version</tt></i>
|
||||
and <i class="parameter"><tt>--</tt></i><tt class="classname">SwitchArg</tt>s
|
||||
are specified automatically. Using either the <i class="parameter"><tt>-h</tt></i> or
|
||||
<i class="parameter"><tt>--help</tt></i> flag will cause the USAGE message to be displayed,
|
||||
<i class="parameter"><tt>-v</tt></i> or <i class="parameter"><tt>--version</tt></i> will cause
|
||||
any version information to
|
||||
be displayed, and <em class="parameter"><code>--</code></em> or
|
||||
<em class="parameter"><code>--ignore_rest</code></em> will cause the
|
||||
be displayed, and <i class="parameter"><tt>--</tt></i> or
|
||||
<i class="parameter"><tt>--ignore_rest</tt></i> will cause the
|
||||
remaining labeled arguments to be ignored. These switches are
|
||||
included by default on every command line. You can <a href="#">disable this functionality</a> if desired (although we don't recommend it).
|
||||
How we generate the behavior behind these flags is described
|
||||
@ -157,24 +157,24 @@ How we generate the behavior behind these flags is described
|
||||
argument isn't provided), the program exits and displays a brief
|
||||
USAGE and an error message.</li><li>The program name is assumed to always be argv[0], so it isn't
|
||||
specified directly.</li><li>A value delimiter character can be specified. This means that if you
|
||||
prefer arguments of the style <em class="parameter"><code>-s=asdf</code></em> instead of
|
||||
<em class="parameter"><code>-s asdf</code></em>, you can do so.</li><li><span class="emphasis"><em>Always wrap everything in a try block that catches
|
||||
prefer arguments of the style <i class="parameter"><tt>-s=asdf</tt></i> instead of
|
||||
<i class="parameter"><tt>-s asdf</tt></i>, you can do so.</li><li><span class="emphasis"><em>Always wrap everything in a try block that catches
|
||||
ArgExceptions!</em></span> Any problems found in constructing the
|
||||
<code class="classname">CmdLine</code>, constructing the <code class="classname">Arg</code>s,
|
||||
<tt class="classname">CmdLine</tt>, constructing the <tt class="classname">Arg</tt>s,
|
||||
or parsing the command line will throw an
|
||||
<code class="classname">ArgException</code>.</li></ul></div><p>
|
||||
</p></div><div class="sect2" lang="en" xml:lang="en"><div class="titlepage"><div><div><h3 class="title"><a id="ARG_PROPERTIES"></a>Common Argument Properties</h3></div></div></div><p>
|
||||
<tt class="classname">ArgException</tt>.</li></ul></div><p>
|
||||
</p></div><div class="sect2" lang="en" xml:lang="en"><div class="titlepage"><div><div><h3 class="title"><a id="ARG_PROPERTIES"></a>Common Argument Properties</h3></div></div><div></div></div><p>
|
||||
Arguments, whatever their type, have a few common properties.
|
||||
These properties are set in the constructors of the arguments.
|
||||
</p><div class="itemizedlist"><ul type="disc"><li>First is the flag or the character preceded by a dash(-) that
|
||||
signals the beginning of the argument on the command line.</li><li>Arguments also have names, which can also be used
|
||||
as an alternative flag on the command line, this time preceded by two dashes
|
||||
(--) [like the familiar <code class="function">getopt_long()</code>].</li><li>Next is the description of the argument. This is a short
|
||||
(--) [like the familiar <tt class="function">getopt_long()</tt>].</li><li>Next is the description of the argument. This is a short
|
||||
description of the argument displayed in the help/usage message
|
||||
when needed.</li><li>The following parameters in the constructors vary depending on
|
||||
the type of argument. Some possible values include:
|
||||
<div class="itemizedlist"><ul type="circle"><li>A boolean value indicating whether the Arg is required or not. </li><li>A default value.</li><li>A <a href="#DESCRIPTION_EXCEPTIONS" title="Type Descriptions">description</a> of the type of value expected.</li><li>A <a href="#CONSTRAINT" title="I want to constrain the values allowed for a particular argument...">constraint</a> on the value expected.</li><li>The CmdLine instance that the Arg should be added to.</li><li>A <a href="#VISITORS" title="Visitors">Visitor</a>.</li></ul></div></li><li>See the <a href="html/index.html" target="_top">API Documentation</a> for more detail.</li></ul></div><p>
|
||||
</p></div></div><div class="sect1" lang="en" xml:lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="COMPILING"></a>Compiling</h2></div></div></div><p>
|
||||
<div class="itemizedlist"><ul type="circle"><li>A boolean value indicating whether the Arg is required or not. </li><li>A default value.</li><li>A <a href="#DESCRIPTION_EXCEPTIONS" title="Type Descriptions">description</a> of the type of value expected.</li><li>A <a href="#CONSTRAINT" title="I want to constrain the values allowed for a particular argument...">constraint</a> on the value expected.</li><li>The CmdLine instance that the Arg should be added to.</li><li>A <a href="#VISITORS" title="Visitors">Visitor</a>.</li></ul></div></li><li>See the <a href="html/index.html" target="_top">API Documentation</a> for more detail.</li></ul></div><p>
|
||||
</p></div></div><div class="sect1" lang="en" xml:lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="COMPILING"></a>Compiling</h2></div></div><div></div></div><p>
|
||||
<span class="emphasis"><em>TCLAP</em></span> is implemented entirely in header files
|
||||
which means you only need to include CmdLine.h to use the library.
|
||||
</p><pre class="programlisting">
|
||||
@ -204,62 +204,62 @@ to work on Windows, Sun and Alpha platforms. We've made every
|
||||
effort to keep the library compliant with the ANSI C++ standard so
|
||||
if your compiler meets the standard, then this library should work
|
||||
for you. Please let us know if this is not the case!
|
||||
</p><div class="sect2" lang="en" xml:lang="en"><div class="titlepage"><div><div><h3 class="title"><a id="id856960"></a>Windows Note</h3></div></div></div><p>
|
||||
</p><div class="sect2" lang="en" xml:lang="en"><div class="titlepage"><div><div><h3 class="title"><a id="id2415310"></a>Windows Note</h3></div></div><div></div></div><p>
|
||||
As we understand things, Visual C++ does not have the file
|
||||
<code class="filename">config.h</code> which is used to make platform
|
||||
<tt class="filename">config.h</tt> which is used to make platform
|
||||
specific definitions. In this situation, we assume that you
|
||||
have access to <code class="classname">sstream</code>. Our understanding is that
|
||||
have access to <tt class="classname">sstream</tt>. Our understanding is that
|
||||
this should not be a problem for VC++ 7.x. However, if this
|
||||
is not the case and you need to use <code class="classname">strstream</code>,
|
||||
is not the case and you need to use <tt class="classname">strstream</tt>,
|
||||
then simply tell your compiler to define the variable
|
||||
<code class="constant">HAVE_STRSTREAM</code> and undefine
|
||||
<code class="constant">HAVE_SSTREAM</code> That
|
||||
<tt class="constant">HAVE_STRSTREAM</tt> and undefine
|
||||
<tt class="constant">HAVE_SSTREAM</tt> That
|
||||
<span class="emphasis"><em>should</em></span> work. We think. Alternatively, just edit
|
||||
the files <code class="filename">ValueArg.h</code> and <code class="filename">MultiArg.h</code>.
|
||||
the files <tt class="filename">ValueArg.h</tt> and <tt class="filename">MultiArg.h</tt>.
|
||||
</p></div><p>
|
||||
</p><div class="sect2" lang="en" xml:lang="en"><div class="titlepage"><div><div><h3 class="title"><a id="id857012"></a>Random Note</h3></div></div></div><p>
|
||||
If your compiler doesn't support the <code class="methodname">using</code> syntax used
|
||||
in <code class="classname">UnlabeledValueArg</code> and
|
||||
<code class="classname">UnlabeledMultiArg</code> to support two stage name lookup,
|
||||
</p><div class="sect2" lang="en" xml:lang="en"><div class="titlepage"><div><div><h3 class="title"><a id="id2415363"></a>Random Note</h3></div></div><div></div></div><p>
|
||||
If your compiler doesn't support the <tt class="methodname">using</tt> syntax used
|
||||
in <tt class="classname">UnlabeledValueArg</tt> and
|
||||
<tt class="classname">UnlabeledMultiArg</tt> to support two stage name lookup,
|
||||
then you have two options. Either comment out the statements if you don't
|
||||
need two stage name lookup, or do a bunch of search and replace and use
|
||||
the <code class="methodname">this</code> pointer syntax: e.g.
|
||||
<code class="methodname">this->_ignoreable</code> instead
|
||||
of just <code class="methodname">_ignorable</code> (do this for each variable
|
||||
or method referenced by <code class="methodname">using</code>).
|
||||
the <tt class="methodname">this</tt> pointer syntax: e.g.
|
||||
<tt class="methodname">this->_ignoreable</tt> instead
|
||||
of just <tt class="methodname">_ignorable</tt> (do this for each variable
|
||||
or method referenced by <tt class="methodname">using</tt>).
|
||||
</p></div><p>
|
||||
</p></div></div><div class="chapter" lang="en" xml:lang="en"><div class="titlepage"><div><div><h2 class="title"><a id="FUNDAMENTAL_CLASSES"></a>Chapter 2. Fundamental Classes</h2></div></div></div><div class="toc"><p><b>Table of Contents</b></p><dl><dt><span class="sect1"><a href="#COMMAND_LINE"><code class="classname">CmdLine</code></a></span></dt><dt><span class="sect1"><a href="#id857113"><code class="classname">SwitchArg</code></a></span></dt><dt><span class="sect1"><a href="#id857146"><code class="classname">ValueArg</code></a></span></dt><dt><span class="sect1"><a href="#id857193"><code class="classname">MultiArg</code></a></span></dt><dt><span class="sect1"><a href="#id857294"><code class="classname">MultiSwitchArg</code></a></span></dt><dt><span class="sect1"><a href="#UNLABELED_MULTI_ARG"><code class="classname">UnlabeledValueArg</code></a></span></dt><dt><span class="sect1"><a href="#id857468"><code class="classname">UnlabeledMultiArg</code></a></span></dt></dl></div><div class="sect1" lang="en" xml:lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="COMMAND_LINE"></a><code class="classname">CmdLine</code></h2></div></div></div><p>
|
||||
The <code class="classname">CmdLine</code> class contains the arguments that define
|
||||
</p></div></div><div class="chapter" lang="en" xml:lang="en"><div class="titlepage"><div><div><h2 class="title"><a id="FUNDAMENTAL_CLASSES"></a>Chapter 2. Fundamental Classes</h2></div></div><div></div></div><div class="toc"><p><b>Table of Contents</b></p><dl><dt><span class="sect1"><a href="#COMMAND_LINE">CmdLine</a></span></dt><dt><span class="sect1"><a href="#id2415463">SwitchArg</a></span></dt><dt><span class="sect1"><a href="#id2415496">ValueArg</a></span></dt><dt><span class="sect1"><a href="#id2415543">MultiArg</a></span></dt><dt><span class="sect1"><a href="#id2415643">MultiSwitchArg</a></span></dt><dt><span class="sect1"><a href="#UNLABELED_MULTI_ARG">UnlabeledValueArg</a></span></dt><dt><span class="sect1"><a href="#id2475949">UnlabeledMultiArg</a></span></dt></dl></div><div class="sect1" lang="en" xml:lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="COMMAND_LINE"></a><tt class="classname">CmdLine</tt></h2></div></div><div></div></div><p>
|
||||
The <tt class="classname">CmdLine</tt> class contains the arguments that define
|
||||
the command line and manages the parsing of the command line. The
|
||||
<code class="classname">CmdLine</code> doesn't parse the command line itself it only
|
||||
<tt class="classname">CmdLine</tt> doesn't parse the command line itself it only
|
||||
manages the parsing. The actual parsing of individual arguments occurs within
|
||||
the arguments themselves. The <code class="classname">CmdLine</code> keeps track of
|
||||
the arguments themselves. The <tt class="classname">CmdLine</tt> keeps track of
|
||||
of the required arguments, <a href="#XOR" title="I want one argument or the other, but not both...">relationships</a>
|
||||
between arguments, and <a href="#CHANGE_OUTPUT" title="I want different output than what is provided...">output</a> generation.
|
||||
</p></div><div class="sect1" lang="en" xml:lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="id857113"></a><code class="classname">SwitchArg</code></h2></div></div></div><p><code class="classname">SwitchArg</code>s are what the name implies:
|
||||
simple, on/off, boolean switches. Use <code class="classname">SwitchArg</code>s
|
||||
</p></div><div class="sect1" lang="en" xml:lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="id2415463"></a><tt class="classname">SwitchArg</tt></h2></div></div><div></div></div><p><tt class="classname">SwitchArg</tt>s are what the name implies:
|
||||
simple, on/off, boolean switches. Use <tt class="classname">SwitchArg</tt>s
|
||||
anytime you want to turn
|
||||
some sort of system property on or off. <code class="classname">SwitchArg</code>s
|
||||
don't parse a value. They return <code class="constant">TRUE</code> or
|
||||
<code class="constant">FALSE</code>, depending on whether the switch has been found
|
||||
on the command line and what the default value was defined as.</p></div><div class="sect1" lang="en" xml:lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="id857146"></a><code class="classname">ValueArg</code></h2></div></div></div><p><code class="classname">ValueArg</code>s are arguments that read a
|
||||
some sort of system property on or off. <tt class="classname">SwitchArg</tt>s
|
||||
don't parse a value. They return <tt class="constant">TRUE</tt> or
|
||||
<tt class="constant">FALSE</tt>, depending on whether the switch has been found
|
||||
on the command line and what the default value was defined as.</p></div><div class="sect1" lang="en" xml:lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="id2415496"></a><tt class="classname">ValueArg</tt></h2></div></div><div></div></div><p><tt class="classname">ValueArg</tt>s are arguments that read a
|
||||
value of some type
|
||||
from the command line. Any time you need a file name, a number,
|
||||
etc. use a <code class="classname">ValueArg</code> or one of its variants.
|
||||
All <code class="classname">ValueArg</code>s are
|
||||
etc. use a <tt class="classname">ValueArg</tt> or one of its variants.
|
||||
All <tt class="classname">ValueArg</tt>s are
|
||||
<a href="#FOOTNOTES"> templatized**</a> and will attempt to parse
|
||||
the string its flag matches on the command line as the type it is
|
||||
specified as. <code class="classname">ValueArg<int></code>
|
||||
specified as. <tt class="classname">ValueArg<int></tt>
|
||||
will attempt to parse an
|
||||
int, <code class="classname">ValueArg<float></code> will attempt to
|
||||
parse a float, etc. If <code class="methodname">operator>></code>
|
||||
int, <tt class="classname">ValueArg<float></tt> will attempt to
|
||||
parse a float, etc. If <tt class="methodname">operator>></tt>
|
||||
for the specified type doesn't
|
||||
recognize the string on the command line as its defined type, then
|
||||
an exception will be thrown.
|
||||
</p></div><div class="sect1" lang="en" xml:lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="id857193"></a><code class="classname">MultiArg</code></h2></div></div></div><p>
|
||||
A <code class="classname">MultiArg</code> is a <code class="classname">ValueArg</code> that
|
||||
</p></div><div class="sect1" lang="en" xml:lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="id2415543"></a><tt class="classname">MultiArg</tt></h2></div></div><div></div></div><p>
|
||||
A <tt class="classname">MultiArg</tt> is a <tt class="classname">ValueArg</tt> that
|
||||
can be specified more than once on a command line and instead of returning
|
||||
a single value, returns a <code class="classname">vector</code> of values.
|
||||
a single value, returns a <tt class="classname">vector</tt> of values.
|
||||
</p><p>
|
||||
Imagine a compiler that allows you to specify multiple directories
|
||||
to search for libraries...
|
||||
@ -267,35 +267,35 @@ to search for libraries...
|
||||
% fooCompiler -L /dir/num1 -L /dir/num2 file.foo
|
||||
</pre><p>
|
||||
Exceptions will occur if you try to do this
|
||||
with a <code class="classname">ValueArg</code> or a <code class="classname">SwitchArg</code>.
|
||||
with a <tt class="classname">ValueArg</tt> or a <tt class="classname">SwitchArg</tt>.
|
||||
In situations like this, you will want to use a
|
||||
<code class="classname">MultiArg</code>. A
|
||||
<code class="classname">MultiArg</code> is essentially a
|
||||
<code class="classname">ValueArg</code> that appends any
|
||||
<tt class="classname">MultiArg</tt>. A
|
||||
<tt class="classname">MultiArg</tt> is essentially a
|
||||
<tt class="classname">ValueArg</tt> that appends any
|
||||
value that it matches and parses onto a vector of values. When the
|
||||
<code class="methodname">getValue()</code> method is called, a vector of
|
||||
<tt class="methodname">getValue()</tt> method is called, a vector of
|
||||
values, instead of a single value is returned. A
|
||||
<code class="classname">MultiArg</code> is declared much like
|
||||
a <code class="classname">ValueArg</code>:
|
||||
<tt class="classname">MultiArg</tt> is declared much like
|
||||
a <tt class="classname">ValueArg</tt>:
|
||||
|
||||
|
||||
</p><pre class="programlisting">
|
||||
MultiArg<int> itest("i", "intTest", "multi int test", false,"int" );
|
||||
cmd.add( itest );
|
||||
</pre><p>
|
||||
Note that <code class="classname">MultiArg</code>s can be added to the
|
||||
<code class="classname">CmdLine</code> in any order (unlike
|
||||
Note that <tt class="classname">MultiArg</tt>s can be added to the
|
||||
<tt class="classname">CmdLine</tt> in any order (unlike
|
||||
<a href="#UNLABELED_MULTI_ARG" title="UnlabeledValueArg"> UnlabeledMultiArg</a>).
|
||||
</p></div><div class="sect1" lang="en" xml:lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="id857294"></a><code class="classname">MultiSwitchArg</code></h2></div></div></div><p>
|
||||
A <code class="classname">MultiSwitchArg</code> is a <code class="classname">SwitchArg</code>
|
||||
</p></div><div class="sect1" lang="en" xml:lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="id2415643"></a><tt class="classname">MultiSwitchArg</tt></h2></div></div><div></div></div><p>
|
||||
A <tt class="classname">MultiSwitchArg</tt> is a <tt class="classname">SwitchArg</tt>
|
||||
that can be specified more than once on a command line.
|
||||
This can be useful
|
||||
when command lines are constructed automatically from within other applications
|
||||
or when a switch occurring
|
||||
more than once indicates a value (-V means a little verbose -V -V -V means a lot
|
||||
verbose), You can use a <code class="classname">MultiSwitchArg</code>.
|
||||
verbose), You can use a <tt class="classname">MultiSwitchArg</tt>.
|
||||
The call
|
||||
to <code class="methodname">getValue()</code> for a <code class="classname">MultiSwitchArg</code> returns the number (int) of times
|
||||
to <tt class="methodname">getValue()</tt> for a <tt class="classname">MultiSwitchArg</tt> returns the number (int) of times
|
||||
the switch has been found on the command line in addition to the default value.
|
||||
Here is an example using the default initial value of 0:
|
||||
</p><pre class="programlisting">
|
||||
@ -307,22 +307,22 @@ Alternatively, you can specify your own initial value:
|
||||
MultiSwitchArg quiet("q","quiet","Reduce the volume of output",5);
|
||||
cmd.add( quiet );
|
||||
</pre><p>
|
||||
</p></div><div class="sect1" lang="en" xml:lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="UNLABELED_MULTI_ARG"></a><code class="classname">UnlabeledValueArg</code></h2></div></div></div><p>
|
||||
An <code class="classname">UnlabeledValueArg</code> is a <code class="classname">ValueArg</code> that is not identified by a flag on the command line. Instead
|
||||
<code class="classname">UnlabeledValueArg</code>s are identified by their position in
|
||||
</p></div><div class="sect1" lang="en" xml:lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="UNLABELED_MULTI_ARG"></a><tt class="classname">UnlabeledValueArg</tt></h2></div></div><div></div></div><p>
|
||||
An <tt class="classname">UnlabeledValueArg</tt> is a <tt class="classname">ValueArg</tt> that is not identified by a flag on the command line. Instead
|
||||
<tt class="classname">UnlabeledValueArg</tt>s are identified by their position in
|
||||
the argv array.
|
||||
</p><p>
|
||||
To this point all of our arguments have had labels (flags)
|
||||
identifying them on the command line, but there are some
|
||||
situations where flags are burdensome and not worth the effort. One
|
||||
example might be if you want to implement a magical command we'll
|
||||
call <span><strong class="command">copy</strong></span>. All <span><strong class="command">copy</strong></span> does is
|
||||
call <span><b class="command">copy</b></span>. All <span><b class="command">copy</b></span> does is
|
||||
copy the file specified
|
||||
in the first argument to the file specified in the second argument.
|
||||
We can do this using <code class="classname">UnlabeledValueArg</code>s which are pretty
|
||||
much just <code class="classname">ValueArg</code>s without the flag specified,
|
||||
We can do this using <tt class="classname">UnlabeledValueArg</tt>s which are pretty
|
||||
much just <tt class="classname">ValueArg</tt>s without the flag specified,
|
||||
which tells
|
||||
the <code class="classname">CmdLine</code> object to treat them accordingly.
|
||||
the <tt class="classname">CmdLine</tt> object to treat them accordingly.
|
||||
The code would look like this:
|
||||
|
||||
</p><pre class="programlisting">
|
||||
@ -335,28 +335,28 @@ The code would look like this:
|
||||
|
||||
Everything else is handled identically to what is seen above. The
|
||||
only difference to be aware of, and this is important: <span class="emphasis"><em>the order
|
||||
that UnlabeledValueArgs are added to the <code class="classname">CmdLine</code>
|
||||
that UnlabeledValueArgs are added to the <tt class="classname">CmdLine</tt>
|
||||
is the order that they will be parsed!!!!</em></span>
|
||||
This is <span class="emphasis"><em>not</em></span> the case for normal
|
||||
<code class="classname">SwitchArg</code>s and <code class="classname">ValueArg</code>s.
|
||||
<tt class="classname">SwitchArg</tt>s and <tt class="classname">ValueArg</tt>s.
|
||||
What happens internally is the first argument that the
|
||||
<code class="classname">CmdLine</code> doesn't recognize is assumed to be
|
||||
the first <code class="classname">UnlabeledValueArg</code> and
|
||||
<tt class="classname">CmdLine</tt> doesn't recognize is assumed to be
|
||||
the first <tt class="classname">UnlabeledValueArg</tt> and
|
||||
parses it as such. Note that you are allowed to intersperse labeled
|
||||
args (SwitchArgs and ValueArgs) in between
|
||||
<code class="classname">UnlabeledValueArgs</code> (either on the command line
|
||||
or in the declaration), but the <code class="classname">UnlabeledValueArgs</code>
|
||||
<tt class="classname">UnlabeledValueArgs</tt> (either on the command line
|
||||
or in the declaration), but the <tt class="classname">UnlabeledValueArgs</tt>
|
||||
will still be parsed in the order they are added. Just remember that order is
|
||||
important for unlabeled arguments.
|
||||
</p></div><div class="sect1" lang="en" xml:lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="id857468"></a><code class="classname">UnlabeledMultiArg</code></h2></div></div></div><p>
|
||||
An <code class="classname">UnlabeledMultiArg</code> is an <code class="classname">UnlabeledValueArg</code> that allows more than one value to be specified. Only one
|
||||
<code class="classname">UnlabeledMultiArg</code> can be specified per command line.
|
||||
The <code class="classname">UnlabeledMultiArg</code> simply reads the remaining
|
||||
</p></div><div class="sect1" lang="en" xml:lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="id2475949"></a><tt class="classname">UnlabeledMultiArg</tt></h2></div></div><div></div></div><p>
|
||||
An <tt class="classname">UnlabeledMultiArg</tt> is an <tt class="classname">UnlabeledValueArg</tt> that allows more than one value to be specified. Only one
|
||||
<tt class="classname">UnlabeledMultiArg</tt> can be specified per command line.
|
||||
The <tt class="classname">UnlabeledMultiArg</tt> simply reads the remaining
|
||||
values from argv up until -- or the end of the array is reached.
|
||||
</p><p>
|
||||
Say you want a strange command
|
||||
that searches each file specified for a given string (let's call it
|
||||
<span><strong class="command">grep</strong></span>), but you don't want to have to type in all of the file
|
||||
<span><b class="command">grep</b></span>), but you don't want to have to type in all of the file
|
||||
names or write a script to do it for you. Say,
|
||||
|
||||
</p><pre class="programlisting">
|
||||
@ -364,7 +364,7 @@ names or write a script to do it for you. Say,
|
||||
</pre><p>
|
||||
|
||||
First remember that the <span class="emphasis"><em>*</em></span> is handled by the shell and
|
||||
expanded accordingly, so what the program <span><strong class="command">grep</strong></span> sees is
|
||||
expanded accordingly, so what the program <span><b class="command">grep</b></span> sees is
|
||||
really something like:
|
||||
|
||||
</p><pre class="programlisting">
|
||||
@ -372,13 +372,13 @@ really something like:
|
||||
</pre><p>
|
||||
|
||||
To handle situations where multiple, unlabeled arguments are needed,
|
||||
we provide the <code class="classname">UnlabeledMultiArg</code>.
|
||||
<code class="classname">UnlabeledMultiArg</code>s
|
||||
we provide the <tt class="classname">UnlabeledMultiArg</tt>.
|
||||
<tt class="classname">UnlabeledMultiArg</tt>s
|
||||
are declared much like everything else, but with only a description
|
||||
of the arguments. By default, if an <code class="classname">UnlabeledMultiArg</code>
|
||||
of the arguments. By default, if an <tt class="classname">UnlabeledMultiArg</tt>
|
||||
is specified, then at least one is required to be present or an
|
||||
exception will be thrown. The most important thing to remember is,
|
||||
that like <code class="classname">UnlabeledValueArg</code>s: order matters!
|
||||
that like <tt class="classname">UnlabeledValueArg</tt>s: order matters!
|
||||
In fact, <span class="emphasis"><em>an UnlabeledMultiArg must be the last argument added to the
|
||||
CmdLine!</em></span>. Here is what a declaration looks like:
|
||||
|
||||
@ -395,30 +395,30 @@ CmdLine!</em></span>. Here is what a declaration looks like:
|
||||
|
||||
</pre><p>
|
||||
|
||||
You must only ever specify one (1) <code class="classname">UnlabeledMultiArg</code>.
|
||||
One <code class="classname">UnlabeledMultiArg</code> will read every unlabeled
|
||||
You must only ever specify one (1) <tt class="classname">UnlabeledMultiArg</tt>.
|
||||
One <tt class="classname">UnlabeledMultiArg</tt> will read every unlabeled
|
||||
Arg that wasn't already processed by a
|
||||
<code class="classname">UnlabeledValueArg</code> into a
|
||||
<code class="classname">vector</code> of type T. Any
|
||||
<code class="classname">UnlabeledValueArg</code> or other
|
||||
<code class="classname">UnlabeledMultiArg</code> specified after the first
|
||||
<code class="classname">UnlabeledMultiArg</code> will be ignored, and if
|
||||
<tt class="classname">UnlabeledValueArg</tt> into a
|
||||
<tt class="classname">vector</tt> of type T. Any
|
||||
<tt class="classname">UnlabeledValueArg</tt> or other
|
||||
<tt class="classname">UnlabeledMultiArg</tt> specified after the first
|
||||
<tt class="classname">UnlabeledMultiArg</tt> will be ignored, and if
|
||||
they are required,
|
||||
exceptions will be thrown. When you call the
|
||||
<code class="methodname">getValue()</code>
|
||||
method of the <code class="classname">UnlabeledValueArg</code> argument,
|
||||
a <code class="classname">vector</code>
|
||||
<tt class="methodname">getValue()</tt>
|
||||
method of the <tt class="classname">UnlabeledValueArg</tt> argument,
|
||||
a <tt class="classname">vector</tt>
|
||||
will be returned. If you can imagine a situation where there will
|
||||
be multiple args of multiple types (stings, ints, floats, etc.)
|
||||
then just declare the <code class="classname">UnlabeledMultiArg</code> as type
|
||||
<code class="classname">string</code> and parse the different values yourself or use
|
||||
several <code class="classname">UnlabeledValueArg</code>s.
|
||||
</p></div></div><div class="chapter" lang="en" xml:lang="en"><div class="titlepage"><div><div><h2 class="title"><a id="COMPLICATIONS"></a>Chapter 3. Complications</h2></div></div></div><div class="toc"><p><b>Table of Contents</b></p><dl><dt><span class="sect1"><a href="#COMBINE_SWITCHES">I want to combine multiple switches into one argument...</a></span></dt><dt><span class="sect1"><a href="#XOR">I want one argument or the other, but not both...</a></span></dt><dt><span class="sect1"><a href="#NO_FLAG">I have more arguments than single flags make sense for...</a></span></dt><dt><span class="sect1"><a href="#CONSTRAINT">I want to constrain the values allowed for a particular
|
||||
argument...</a></span></dt><dt><span class="sect1"><a href="#ARG_ADD_CMDLINE">I want the Args to add themselves to the CmdLine...</a></span></dt><dt><span class="sect1"><a href="#CHANGE_OUTPUT">I want different output than what is provided...</a></span></dt><dt><span class="sect1"><a href="#NO_HELP_VERSION">I don't want the --help and --version switches to be created automatically...</a></span></dt></dl></div><p>
|
||||
then just declare the <tt class="classname">UnlabeledMultiArg</tt> as type
|
||||
<tt class="classname">string</tt> and parse the different values yourself or use
|
||||
several <tt class="classname">UnlabeledValueArg</tt>s.
|
||||
</p></div></div><div class="chapter" lang="en" xml:lang="en"><div class="titlepage"><div><div><h2 class="title"><a id="COMPLICATIONS"></a>Chapter 3. Complications</h2></div></div><div></div></div><div class="toc"><p><b>Table of Contents</b></p><dl><dt><span class="sect1"><a href="#COMBINE_SWITCHES">I want to combine multiple switches into one argument...</a></span></dt><dt><span class="sect1"><a href="#XOR">I want one argument or the other, but not both...</a></span></dt><dt><span class="sect1"><a href="#NO_FLAG">I have more arguments than single flags make sense for...</a></span></dt><dt><span class="sect1"><a href="#CONSTRAINT">I want to constrain the values allowed for a particular
|
||||
argument...</a></span></dt><dt><span class="sect1"><a href="#ARG_ADD_CMDLINE">I want the Args to add themselves to the CmdLine...</a></span></dt><dt><span class="sect1"><a href="#CHANGE_OUTPUT">I want different output than what is provided...</a></span></dt><dt><span class="sect1"><a href="#NO_HELP_VERSION">I don't want the --help and --version switches to be created automatically...</a></span></dt><dt><span class="sect1"><a href="#IGNORE_ARGS">I want to ignore certain arguments...</a></span></dt><dt><span class="sect1"><a href="#READING_HEX_INTEGERS">I want to read hex integers as arguments...</a></span></dt></dl></div><p>
|
||||
Naturally, what we have seen to this point doesn't satisfy all of
|
||||
our needs.
|
||||
</p><div class="sect1" lang="en" xml:lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="COMBINE_SWITCHES"></a>I want to combine multiple switches into one argument...</h2></div></div></div><p>
|
||||
Multiple <code class="classname">SwitchArg</code>s can be combined into a
|
||||
</p><div class="sect1" lang="en" xml:lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="COMBINE_SWITCHES"></a>I want to combine multiple switches into one argument...</h2></div></div><div></div></div><p>
|
||||
Multiple <tt class="classname">SwitchArg</tt>s can be combined into a
|
||||
single argument on the command line. If you have switches -a, -b and -c
|
||||
it is valid to do either:
|
||||
|
||||
@ -440,7 +440,7 @@ it is valid to do either:
|
||||
|
||||
This is to make this library more in line with the POSIX and GNU
|
||||
standards (as I understand them).
|
||||
</p></div><div class="sect1" lang="en" xml:lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="XOR"></a>I want one argument or the other, but not both...</h2></div></div></div><p>
|
||||
</p></div><div class="sect1" lang="en" xml:lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="XOR"></a>I want one argument or the other, but not both...</h2></div></div><div></div></div><p>
|
||||
Suppose you have a command that must read input from one of two
|
||||
possible locations, either a local file or a URL. The command
|
||||
<span class="emphasis"><em>must</em></span> read something, so <span class="emphasis"><em>one</em></span>
|
||||
@ -448,43 +448,41 @@ argument is required, but
|
||||
not both, yet neither argument is strictly necessary by itself.
|
||||
This is called "exclusive or" or "XOR". To accommodate this
|
||||
situation, there is now an option to add two or more
|
||||
<code class="classname">Arg</code>s to
|
||||
a <code class="classname">CmdLine</code> that are exclusively or'd with one another:
|
||||
<code class="methodname">xorAdd()</code>. This means that exactly one of the
|
||||
<code class="classname">Arg</code>s must be set and no more.
|
||||
<tt class="classname">Arg</tt>s to
|
||||
a <tt class="classname">CmdLine</tt> that are exclusively or'd with one another:
|
||||
<tt class="methodname">xorAdd()</tt>. This means that exactly one of the
|
||||
<tt class="classname">Arg</tt>s must be set and no more.
|
||||
</p><p>
|
||||
<code class="methodname">xorAdd()</code> comes in two flavors, either
|
||||
<code class="methodname">xorAdd(Arg& a, Arg& b)</code>
|
||||
to add just two <code class="classname">Arg</code>s to be xor'd and
|
||||
<code class="methodname">xorAdd( vector<Arg*> xorList )</code>
|
||||
to add more than two <code class="classname">Arg</code>s.
|
||||
<tt class="methodname">xorAdd()</tt> comes in two flavors, either
|
||||
<tt class="methodname">xorAdd(Arg& a, Arg& b)</tt>
|
||||
to add just two <tt class="classname">Arg</tt>s to be xor'd and
|
||||
<tt class="methodname">xorAdd( vector<Arg*> xorList )</tt>
|
||||
to add more than two <tt class="classname">Arg</tt>s.
|
||||
|
||||
</p><pre class="programlisting">
|
||||
|
||||
|
||||
ValueArg<string> fileArg("f","file","File name to read",true,"homer",
|
||||
"filename");
|
||||
ValueArg<string> urlArg("u","url","URL to load",true,
|
||||
"http://example.com", "URL");
|
||||
ValueArg<string> fileArg("f","file","File name to read",true,"/dev/null", "filename");
|
||||
ValueArg<string> urlArg("u","url","URL to load",true, "http://example.com", "URL");
|
||||
|
||||
cmd.xorAdd( fileArg, urlArg );
|
||||
cmd.parse(argc, argv);
|
||||
|
||||
</pre><p>
|
||||
|
||||
Once one <code class="classname">Arg</code> in the xor list is matched on the
|
||||
<code class="classname">CmdLine</code> then the others in the xor list will be
|
||||
Once one <tt class="classname">Arg</tt> in the xor list is matched on the
|
||||
<tt class="classname">CmdLine</tt> then the others in the xor list will be
|
||||
marked as set. The question then, is how to determine which of the
|
||||
<code class="classname">Arg</code>s has been set? This is accomplished by calling the
|
||||
isSet() method for each <code class="classname">Arg</code>. If the
|
||||
<code class="classname">Arg</code> has been
|
||||
matched on the command line, the <code class="methodname">isSet()</code> will return
|
||||
<code class="constant">TRUE</code>, whereas if the <code class="classname">Arg</code>
|
||||
has been set as a result of matching the other <code class="classname">Arg</code>
|
||||
that was xor'd <code class="methodname">isSet()</code> will
|
||||
return <code class="constant">FALSE</code>.
|
||||
(Of course, if the <code class="classname">Arg</code> was not xor'd and
|
||||
wasn't matched, it will also return <code class="constant">FALSE</code>.)
|
||||
<tt class="classname">Arg</tt>s has been set? This is accomplished by calling the
|
||||
isSet() method for each <tt class="classname">Arg</tt>. If the
|
||||
<tt class="classname">Arg</tt> has been
|
||||
matched on the command line, the <tt class="methodname">isSet()</tt> will return
|
||||
<tt class="constant">TRUE</tt>, whereas if the <tt class="classname">Arg</tt>
|
||||
has been set as a result of matching the other <tt class="classname">Arg</tt>
|
||||
that was xor'd <tt class="methodname">isSet()</tt> will
|
||||
return <tt class="constant">FALSE</tt>.
|
||||
(Of course, if the <tt class="classname">Arg</tt> was not xor'd and
|
||||
wasn't matched, it will also return <tt class="constant">FALSE</tt>.)
|
||||
|
||||
</p><pre class="programlisting">
|
||||
|
||||
@ -498,12 +496,34 @@ wasn't matched, it will also return <code class="constant">FALSE</code>.)
|
||||
throw("Very bad things...");
|
||||
|
||||
</pre><p>
|
||||
</p></div><div class="sect1" lang="en" xml:lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="NO_FLAG"></a>I have more arguments than single flags make sense for...</h2></div></div></div><p>
|
||||
|
||||
It is helpful to note that <tt class="classname">Arg</tt>s of any type can be xor'd together.
|
||||
This means that you can xor a <tt class="classname">SwitchArg</tt> with a <tt class="classname">ValueArg</tt>.
|
||||
This is helpful in situations where one of several options is necessary and one of the options
|
||||
requires additional information.
|
||||
|
||||
</p><pre class="programlisting">
|
||||
|
||||
SwitchArg stdinArg("s", "stdin", "Read from STDIN", false);
|
||||
ValueArg<string> fileArg("f","file","File name to read",true,"/dev/null", "filename");
|
||||
ValueArg<string> urlArg("u","url","URL to load",true, "http://example.com", "URL");
|
||||
|
||||
vector<Arg*> xorlist;
|
||||
xorlist.push_back(&stdinArg);
|
||||
xorlist.push_back(&fileArg);
|
||||
xorlist.push_back(&urlArg);
|
||||
|
||||
cmd.xorAdd( xorlist );
|
||||
|
||||
</pre><p>
|
||||
|
||||
|
||||
</p></div><div class="sect1" lang="en" xml:lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="NO_FLAG"></a>I have more arguments than single flags make sense for...</h2></div></div><div></div></div><p>
|
||||
Some commands have so many options that single flags no longer map
|
||||
sensibly to the available options. In this case, it is desirable to
|
||||
specify <code class="classname">Arg</code>s using only long options. This one is easy to
|
||||
accomplish, just make the flag value blank in the <code class="classname">Arg</code>
|
||||
constructor. This will tell the <code class="classname">Arg</code> that only the long
|
||||
specify <tt class="classname">Arg</tt>s using only long options. This one is easy to
|
||||
accomplish, just make the flag value blank in the <tt class="classname">Arg</tt>
|
||||
constructor. This will tell the <tt class="classname">Arg</tt> that only the long
|
||||
option should be matched and will force users to specify the long
|
||||
option on the command line. The help output is updated accordingly.
|
||||
|
||||
@ -515,26 +535,26 @@ option on the command line. The help output is updated accordingly.
|
||||
|
||||
</pre><p>
|
||||
</p></div><div class="sect1" lang="en" xml:lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="CONSTRAINT"></a>I want to constrain the values allowed for a particular
|
||||
argument...</h2></div></div></div><p>
|
||||
argument...</h2></div></div><div></div></div><p>
|
||||
<span class="emphasis"><em>Interface Change!!!</em></span> Sorry folks, but we've changed
|
||||
the interface since version 1.0.X for constraining <code class="classname">Arg</code>s.
|
||||
Constraints are now hidden behind the <code class="classname">Constraint</code>
|
||||
the interface since version 1.0.X for constraining <tt class="classname">Arg</tt>s.
|
||||
Constraints are now hidden behind the <tt class="classname">Constraint</tt>
|
||||
interface. To
|
||||
constrain an <code class="classname">Arg</code> simply implement the interface
|
||||
constrain an <tt class="classname">Arg</tt> simply implement the interface
|
||||
and specify the new class in the constructor as before.
|
||||
</p><p>
|
||||
You can still constrain <code class="classname">Arg</code>s based on
|
||||
a list of values. Instead of adding a <code class="classname">vector</code> of
|
||||
allowed values to the <code class="classname">Arg</code> directly,
|
||||
create a <code class="classname">ValuesConstraint</code> object
|
||||
with a <code class="classname">vector</code> of values and add that to the
|
||||
<code class="classname">Arg</code>. The <code class="classname">Arg</code> constructors
|
||||
You can still constrain <tt class="classname">Arg</tt>s based on
|
||||
a list of values. Instead of adding a <tt class="classname">vector</tt> of
|
||||
allowed values to the <tt class="classname">Arg</tt> directly,
|
||||
create a <tt class="classname">ValuesConstraint</tt> object
|
||||
with a <tt class="classname">vector</tt> of values and add that to the
|
||||
<tt class="classname">Arg</tt>. The <tt class="classname">Arg</tt> constructors
|
||||
have been modified accordingly.
|
||||
</p><p>
|
||||
When the value for the
|
||||
<code class="classname">Arg</code> is parsed,
|
||||
<tt class="classname">Arg</tt> is parsed,
|
||||
it is checked against the list of values specified in the
|
||||
<code class="classname">ValuesConstraint</code>.
|
||||
<tt class="classname">ValuesConstraint</tt>.
|
||||
If the value is in the list then it is accepted. If
|
||||
not, then an exception is thrown. Here is a simple example:
|
||||
|
||||
@ -551,31 +571,31 @@ not, then an exception is thrown. Here is a simple example:
|
||||
cmd.add( nameArg );
|
||||
</pre><p>
|
||||
|
||||
When a <code class="classname">ValuesConstraint</code> is specified,
|
||||
When a <tt class="classname">ValuesConstraint</tt> is specified,
|
||||
instead of a type description being specified in the
|
||||
<code class="classname">Arg</code>, a
|
||||
<tt class="classname">Arg</tt>, a
|
||||
type description is created by concatenating the values in the
|
||||
allowed list using operator<< for the specified type. The
|
||||
help/usage for the <code class="classname">Arg</code> therefore lists the
|
||||
help/usage for the <tt class="classname">Arg</tt> therefore lists the
|
||||
allowable values. Because of this, you might want to keep the list
|
||||
relatively small, however there is no limit on this.
|
||||
</p><p>
|
||||
Obviously, a list of allowed values isn't always the best way to
|
||||
constrain things. For instance, one might wish to allow only
|
||||
integers greater than 0. In this case, simply create a class that
|
||||
implements the <code class="classname">Constraint<int></code> interface and
|
||||
implements the <tt class="classname">Constraint<int></tt> interface and
|
||||
checks whether the value parsed is greater than 0 (done in the
|
||||
<code class="methodname">check()</code> method) and create your
|
||||
<code class="classname">Arg</code> with your new <code class="classname">Constraint</code>.
|
||||
</p></div><div class="sect1" lang="en" xml:lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="ARG_ADD_CMDLINE"></a>I want the Args to add themselves to the CmdLine...</h2></div></div></div><p>
|
||||
New constructors have been added for each <code class="classname">Arg</code>
|
||||
that take a <code class="classname">CmdLine</code> object as an argument.
|
||||
Each <code class="classname">Arg</code> then
|
||||
<code class="methodname">add</code>s itself to the <code class="classname">CmdLine</code>
|
||||
object. There is no difference in how the <code class="classname">Arg</code>
|
||||
<tt class="methodname">check()</tt> method) and create your
|
||||
<tt class="classname">Arg</tt> with your new <tt class="classname">Constraint</tt>.
|
||||
</p></div><div class="sect1" lang="en" xml:lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="ARG_ADD_CMDLINE"></a>I want the Args to add themselves to the CmdLine...</h2></div></div><div></div></div><p>
|
||||
New constructors have been added for each <tt class="classname">Arg</tt>
|
||||
that take a <tt class="classname">CmdLine</tt> object as an argument.
|
||||
Each <tt class="classname">Arg</tt> then
|
||||
<tt class="methodname">add</tt>s itself to the <tt class="classname">CmdLine</tt>
|
||||
object. There is no difference in how the <tt class="classname">Arg</tt>
|
||||
is handled between this method and calling the
|
||||
<code class="methodname">add()</code> method directly. At the moment, there is
|
||||
no way to do an <code class="methodname">xorAdd()</code> from the constructor. Here
|
||||
<tt class="methodname">add()</tt> method directly. At the moment, there is
|
||||
no way to do an <tt class="methodname">xorAdd()</tt> from the constructor. Here
|
||||
is an example:
|
||||
|
||||
</p><pre class="programlisting">
|
||||
@ -598,14 +618,14 @@ is an example:
|
||||
cmd.parse(argc,argv);
|
||||
|
||||
</pre><p>
|
||||
</p></div><div class="sect1" lang="en" xml:lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="CHANGE_OUTPUT"></a>I want different output than what is provided...</h2></div></div></div><p>
|
||||
</p></div><div class="sect1" lang="en" xml:lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="CHANGE_OUTPUT"></a>I want different output than what is provided...</h2></div></div><div></div></div><p>
|
||||
It is straightforward to change the output generated by
|
||||
<span class="emphasis"><em>TCLAP</em></span>. Either subclass the
|
||||
<code class="classname">StdOutput</code> class and re-implement the methods you choose,
|
||||
<tt class="classname">StdOutput</tt> class and re-implement the methods you choose,
|
||||
or write your own class that implements the
|
||||
<code class="classname">CmdLineOutput</code> interface. Once you have done this,
|
||||
then use the <code class="classname">CmdLine</code> <code class="methodname">setOutput</code>
|
||||
method to tell the <code class="classname">CmdLine</code> to use your new output
|
||||
<tt class="classname">CmdLineOutput</tt> interface. Once you have done this,
|
||||
then use the <tt class="classname">CmdLine</tt> <tt class="methodname">setOutput</tt>
|
||||
method to tell the <tt class="classname">CmdLine</tt> to use your new output
|
||||
class. Here is a simple example:
|
||||
</p><pre class="programlisting">
|
||||
class MyOutput : public StdOutput
|
||||
@ -644,86 +664,132 @@ int main(int argc, char** argv)
|
||||
// proceed normally ...
|
||||
</pre><p>
|
||||
|
||||
See <code class="filename">test4.cpp</code> in the examples directory for the full
|
||||
See <tt class="filename">test4.cpp</tt> in the examples directory for the full
|
||||
example. <span class="emphasis"><em>NOTE</em></span>: if you supply your own Output object, we
|
||||
will not delete it in the <code class="classname">CmdLine</code> destructor. This
|
||||
will not delete it in the <tt class="classname">CmdLine</tt> destructor. This
|
||||
could lead to a (very small) memory leak if you don't take care of the object
|
||||
yourself. Also note that the <code class="methodname">failure</code> method is
|
||||
yourself. Also note that the <tt class="methodname">failure</tt> method is
|
||||
now responsible for exiting the application (assuming that is the desired
|
||||
behavior).
|
||||
</p></div><div class="sect1" lang="en" xml:lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="NO_HELP_VERSION"></a>I don't want the --help and --version switches to be created automatically...</h2></div></div></div><p>
|
||||
</p></div><div class="sect1" lang="en" xml:lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="NO_HELP_VERSION"></a>I don't want the --help and --version switches to be created automatically...</h2></div></div><div></div></div><p>
|
||||
Help and version information is useful for nearly all command line applications
|
||||
and as such we generate flags that provide those options automatically.
|
||||
However, there are situations when these flags are undesirable. For these
|
||||
cases we've added we've added a forth parameter to the
|
||||
<code class="classname">CmdLine</code> constructor. Making this boolean parameter
|
||||
<tt class="classname">CmdLine</tt> constructor. Making this boolean parameter
|
||||
false will disable automatic help and version generation.
|
||||
</p><pre class="programlisting">
|
||||
CmdLine cmd("this is a message", ' ', "0.99", false );
|
||||
</pre><p>
|
||||
</p></div></div><div class="sect1" lang="en" xml:lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="IGNORE_ARGS"></a>Ignoring arguments</h2></div></div></div><p>
|
||||
The <em class="parameter"><code>--</code></em> flag is automatically included in the
|
||||
<code class="classname">CmdLine</code>.
|
||||
</p></div><div class="sect1" lang="en" xml:lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="IGNORE_ARGS"></a>I want to ignore certain arguments...</h2></div></div><div></div></div><p>
|
||||
The <i class="parameter"><tt>--</tt></i> flag is automatically included in the
|
||||
<tt class="classname">CmdLine</tt>.
|
||||
As (almost) per POSIX and GNU standards, any argument specified
|
||||
after the <em class="parameter"><code>--</code></em> flag is ignored.
|
||||
after the <i class="parameter"><tt>--</tt></i> flag is ignored.
|
||||
<span class="emphasis"><em>Almost</em></span> because if an
|
||||
<code class="classname">UnlabeledValueArg</code> that has not been set or an
|
||||
<code class="classname">UnlabeledMultiArg</code> has been specified, by default
|
||||
we will assign any arguments beyond the <em class="parameter"><code>--</code></em>
|
||||
<tt class="classname">UnlabeledValueArg</tt> that has not been set or an
|
||||
<tt class="classname">UnlabeledMultiArg</tt> has been specified, by default
|
||||
we will assign any arguments beyond the <i class="parameter"><tt>--</tt></i>
|
||||
to the those arguments as
|
||||
per the rules above. This is primarily useful if you want to pass
|
||||
in arguments with a dash as the first character of the argument. It
|
||||
should be noted that even if the <em class="parameter"><code>--</code></em> flag is
|
||||
passed on the command line, the <code class="classname">CmdLine</code> will
|
||||
should be noted that even if the <i class="parameter"><tt>--</tt></i> flag is
|
||||
passed on the command line, the <tt class="classname">CmdLine</tt> will
|
||||
<span class="emphasis"><em>still</em></span> test to make sure all of the required
|
||||
arguments are present.
|
||||
</p><p>
|
||||
Of course, this isn't how POSIX/GNU handle things, they explicitly
|
||||
ignore arguments after the <em class="parameter"><code>--</code></em>. To accommodate this,
|
||||
we can make both <code class="classname">UnlabeledValueArg</code>s and
|
||||
<code class="classname">UnlabeledMultiArg</code>s ignoreable in their constructors.
|
||||
ignore arguments after the <i class="parameter"><tt>--</tt></i>. To accommodate this,
|
||||
we can make both <tt class="classname">UnlabeledValueArg</tt>s and
|
||||
<tt class="classname">UnlabeledMultiArg</tt>s ignoreable in their constructors.
|
||||
See the <a href="html/index.html" target="_top"> API Documentation</a> for details.
|
||||
</p></div><div class="chapter" lang="en" xml:lang="en"><div class="titlepage"><div><div><h2 class="title"><a id="NOTES"></a>Chapter 4. Notes</h2></div></div></div><div class="toc"><p><b>Table of Contents</b></p><dl><dt><span class="sect1"><a href="#DESCRIPTION_EXCEPTIONS">Type Descriptions</a></span></dt><dt><span class="sect1"><a href="#VISITORS">Visitors</a></span></dt><dt><span class="sect1"><a href="#MORE_INFO">More Information</a></span></dt></dl></div><p>
|
||||
</p></div><div class="sect1" lang="en" xml:lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="READING_HEX_INTEGERS"></a>I want to read hex integers as arguments...</h2></div></div><div></div></div><p>
|
||||
Sometimes it's desirable to read integers formatted in decimal, hexadecimal,
|
||||
and octal format. This is now possible by #defining the <i class="parameter"><tt>TCLAP_SETBASE_ZERO</tt></i>
|
||||
directive. Simply define this directive in your code and integer arguments will be parsed
|
||||
in each base.
|
||||
</p><pre class="programlisting">
|
||||
|
||||
#define TCLAP_SETBASE_ZERO 1
|
||||
|
||||
#include "tclap/CmdLine.h"
|
||||
#include <iostream>
|
||||
|
||||
using namespace TCLAP;
|
||||
using namespace std;
|
||||
|
||||
int main(int argc, char** argv)
|
||||
{
|
||||
|
||||
try {
|
||||
|
||||
CmdLine cmd("this is a message", ' ', "0.99" );
|
||||
|
||||
ValueArg<int> itest("i", "intTest", "integer test", true, 5, "int");
|
||||
cmd.add( itest );
|
||||
|
||||
//
|
||||
// Parse the command line.
|
||||
//
|
||||
cmd.parse(argc,argv);
|
||||
|
||||
//
|
||||
// Set variables
|
||||
//
|
||||
int _intTest = itest.getValue();
|
||||
cout << "found int: " << _intTest << endl;
|
||||
|
||||
} catch ( ArgException& e )
|
||||
{ cout << "ERROR: " << e.error() << " " << e.argId() << endl; }
|
||||
}
|
||||
</pre><p>
|
||||
</p><p>
|
||||
The reason that this behavior is not the default behavior for <span class="emphasis"><em>TCLAP</em></span> is that the use of
|
||||
<tt class="methodname">setbase(0)</tt> appears to be something of a side effect and is not necessarily how
|
||||
<tt class="methodname">setbase()</tt> is meant to be used. So while we're making this functionality
|
||||
available, we're not turning it on by default for fear of bad things happening in different compilers.
|
||||
If you know otherwise, please let us know.
|
||||
</p></div></div><div class="chapter" lang="en" xml:lang="en"><div class="titlepage"><div><div><h2 class="title"><a id="NOTES"></a>Chapter 4. Notes</h2></div></div><div></div></div><div class="toc"><p><b>Table of Contents</b></p><dl><dt><span class="sect1"><a href="#DESCRIPTION_EXCEPTIONS">Type Descriptions</a></span></dt><dt><span class="sect1"><a href="#VISITORS">Visitors</a></span></dt><dt><span class="sect1"><a href="#MORE_INFO">More Information</a></span></dt></dl></div><p>
|
||||
Like all good rules, there are many exceptions....
|
||||
</p><div class="sect1" lang="en" xml:lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="DESCRIPTION_EXCEPTIONS"></a>Type Descriptions</h2></div></div></div><p>
|
||||
</p><div class="sect1" lang="en" xml:lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="DESCRIPTION_EXCEPTIONS"></a>Type Descriptions</h2></div></div><div></div></div><p>
|
||||
Ideally this library would use RTTI to return a human readable name
|
||||
of the type declared for a particular argument. Unfortunately, at
|
||||
least for <span><strong class="command">g++</strong></span>, the names returned aren't
|
||||
least for <span><b class="command">g++</b></span>, the names returned aren't
|
||||
particularly useful.
|
||||
</p></div><div class="sect1" lang="en" xml:lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="VISITORS"></a>Visitors</h2></div></div></div><p>
|
||||
</p></div><div class="sect1" lang="en" xml:lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="VISITORS"></a>Visitors</h2></div></div><div></div></div><p>
|
||||
Disclaimer: Almost no one will have any use for
|
||||
<code class="classname">Visitor</code>s, they were
|
||||
<tt class="classname">Visitor</tt>s, they were
|
||||
added to provide special handling for default arguments. Nothing
|
||||
that <code class="classname">Visitor</code>s do couldn't be accomplished
|
||||
that <tt class="classname">Visitor</tt>s do couldn't be accomplished
|
||||
by the user after the
|
||||
command line has been parsed. If you're still interested, keep
|
||||
reading...
|
||||
</p><p>
|
||||
Some of you may be wondering how we get the <em class="parameter"><code>--help</code></em>,
|
||||
<em class="parameter"><code>--version</code></em> and <em class="parameter"><code>--</code></em>
|
||||
Some of you may be wondering how we get the <i class="parameter"><tt>--help</tt></i>,
|
||||
<i class="parameter"><tt>--version</tt></i> and <i class="parameter"><tt>--</tt></i>
|
||||
arguments to do their thing without mucking up the
|
||||
<code class="classname">CmdLine</code> code with lots of <span class="emphasis"><em>if</em></span>
|
||||
<tt class="classname">CmdLine</tt> code with lots of <span class="emphasis"><em>if</em></span>
|
||||
statements and type checking. This is accomplished by using a
|
||||
variation on the Visitor Pattern. Actually, it may not be a Visitor
|
||||
Pattern at all, but that's what inspired me.
|
||||
</p><p>
|
||||
If we want some argument to do some sort of special handling,
|
||||
besides simply parsing a value, then we add a <code class="classname">Visitor</code>
|
||||
pointer to the <code class="classname">Arg</code>. More specifically, we add a
|
||||
<span class="emphasis"><em>subclass</em></span> of the <code class="classname">Visitor</code>
|
||||
besides simply parsing a value, then we add a <tt class="classname">Visitor</tt>
|
||||
pointer to the <tt class="classname">Arg</tt>. More specifically, we add a
|
||||
<span class="emphasis"><em>subclass</em></span> of the <tt class="classname">Visitor</tt>
|
||||
class. Once the argument has been successfully parsed, the
|
||||
<code class="classname">Visitor</code> for that argument is
|
||||
<tt class="classname">Visitor</tt> for that argument is
|
||||
called. Any data that needs to be operated on is declared in the
|
||||
<code class="classname">Visitor</code> constructor and then operated on in the
|
||||
<code class="methodname">visit()</code> method. A <code class="classname">Visitor</code>
|
||||
is added to an <code class="classname">Arg</code> as the last argument in its
|
||||
<tt class="classname">Visitor</tt> constructor and then operated on in the
|
||||
<tt class="methodname">visit()</tt> method. A <tt class="classname">Visitor</tt>
|
||||
is added to an <tt class="classname">Arg</tt> as the last argument in its
|
||||
declaration. This may sound
|
||||
complicated, but it is pretty straightforward. Let's see an
|
||||
example.
|
||||
</p><p>
|
||||
Say you want to add an <em class="parameter"><code>--authors</code></em> flag to a program that
|
||||
Say you want to add an <i class="parameter"><tt>--authors</tt></i> flag to a program that
|
||||
prints the names of the authors when present. First subclass
|
||||
<code class="classname">Visitor</code>:
|
||||
<tt class="classname">Visitor</tt>:
|
||||
|
||||
</p><pre class="programlisting">
|
||||
|
||||
@ -744,7 +810,7 @@ class AuthorVisitor : public Visitor
|
||||
|
||||
Now include this class definition somewhere and go about creating
|
||||
your command line. When you create the author switch, add the
|
||||
<code class="classname">AuthorVisitor</code> pointer as follows:
|
||||
<tt class="classname">AuthorVisitor</tt> pointer as follows:
|
||||
|
||||
</p><pre class="programlisting">
|
||||
|
||||
@ -754,12 +820,12 @@ your command line. When you create the author switch, add the
|
||||
|
||||
</pre><p>
|
||||
|
||||
Now, any time the <em class="parameter"><code>-a</code></em> or
|
||||
<em class="parameter"><code>--author</code></em> flag is specified,
|
||||
Now, any time the <i class="parameter"><tt>-a</tt></i> or
|
||||
<i class="parameter"><tt>--author</tt></i> flag is specified,
|
||||
the program will print the author name, Homer J. Simpson and exit
|
||||
without processing any further (as specified in the
|
||||
<code class="methodname">visit()</code> method).
|
||||
</p></div><div class="sect1" lang="en" xml:lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="MORE_INFO"></a>More Information</h2></div></div></div><p>
|
||||
<tt class="methodname">visit()</tt> method).
|
||||
</p></div><div class="sect1" lang="en" xml:lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="MORE_INFO"></a>More Information</h2></div></div><div></div></div><p>
|
||||
For more information, look at the <a href="html/index.html" target="_top">
|
||||
API Documentation</a> and the examples included with the
|
||||
distribution.
|
||||
|
@ -872,10 +872,9 @@ false will disable automatic help and version generation.
|
||||
</programlisting>
|
||||
</para>
|
||||
</sect1>
|
||||
</chapter>
|
||||
|
||||
<sect1 id="IGNORE_ARGS">
|
||||
<title>Ignoring arguments</title>
|
||||
<title>I want to ignore certain arguments...</title>
|
||||
<para>
|
||||
The <parameter>--</parameter> flag is automatically included in the
|
||||
<classname>CmdLine</classname>.
|
||||
@ -903,6 +902,61 @@ See the <ulink url="html/index.html"> API Documentation</ulink> for details.
|
||||
</para>
|
||||
</sect1>
|
||||
|
||||
<sect1 id="READING_HEX_INTEGERS">
|
||||
<title>I want to read hex integers as arguments...</title>
|
||||
<para>
|
||||
Sometimes it's desirable to read integers formatted in decimal, hexadecimal,
|
||||
and octal format. This is now possible by #defining the <parameter>TCLAP_SETBASE_ZERO</parameter>
|
||||
directive. Simply define this directive in your code and integer arguments will be parsed
|
||||
in each base.
|
||||
<programlisting>
|
||||
|
||||
#define TCLAP_SETBASE_ZERO 1
|
||||
|
||||
#include "tclap/CmdLine.h"
|
||||
#include <iostream>
|
||||
|
||||
using namespace TCLAP;
|
||||
using namespace std;
|
||||
|
||||
int main(int argc, char** argv)
|
||||
{
|
||||
|
||||
try {
|
||||
|
||||
CmdLine cmd("this is a message", ' ', "0.99" );
|
||||
|
||||
ValueArg<int> itest("i", "intTest", "integer test", true, 5, "int");
|
||||
cmd.add( itest );
|
||||
|
||||
//
|
||||
// Parse the command line.
|
||||
//
|
||||
cmd.parse(argc,argv);
|
||||
|
||||
//
|
||||
// Set variables
|
||||
//
|
||||
int _intTest = itest.getValue();
|
||||
cout << "found int: " << _intTest << endl;
|
||||
|
||||
} catch ( ArgException& e )
|
||||
{ cout << "ERROR: " << e.error() << " " << e.argId() << endl; }
|
||||
}
|
||||
</programlisting>
|
||||
</para>
|
||||
<para>
|
||||
The reason that this behavior is not the default behavior for <emphasis>TCLAP</emphasis> is that the use of
|
||||
<methodname>setbase(0)</methodname> appears to be something of a side effect and is not necessarily how
|
||||
<methodname>setbase()</methodname> is meant to be used. So while we're making this functionality
|
||||
available, we're not turning it on by default for fear of bad things happening in different compilers.
|
||||
If you know otherwise, please let us know.
|
||||
</para>
|
||||
</sect1>
|
||||
|
||||
|
||||
</chapter>
|
||||
|
||||
<chapter id="NOTES">
|
||||
<title>Notes</title>
|
||||
<para>
|
||||
|
@ -1,7 +1,7 @@
|
||||
|
||||
noinst_PROGRAMS = test1 test2 test3 test4 test5 test6 test7 test8 test9 \
|
||||
test10 test11 test12 test13 test14 test15 test16 \
|
||||
test17 test18
|
||||
test17 test18 test19
|
||||
|
||||
test1_SOURCES = test1.cpp
|
||||
test2_SOURCES = test2.cpp
|
||||
@ -21,6 +21,7 @@ test15_SOURCES = test15.cpp
|
||||
test16_SOURCES = test16.cpp
|
||||
test17_SOURCES = test17.cpp test17-a.cpp
|
||||
test18_SOURCES = test18.cpp
|
||||
test19_SOURCES = test19.cpp
|
||||
|
||||
AM_CPPFLAGS = -I$(top_srcdir)/include
|
||||
|
||||
|
39
examples/test19.cpp
Normal file
39
examples/test19.cpp
Normal file
@ -0,0 +1,39 @@
|
||||
|
||||
|
||||
#define TCLAP_SETBASE_ZERO 1
|
||||
|
||||
#include "tclap/CmdLine.h"
|
||||
#include <iostream>
|
||||
#include <string>
|
||||
|
||||
|
||||
using namespace TCLAP;
|
||||
using namespace std;
|
||||
|
||||
int main(int argc, char** argv)
|
||||
{
|
||||
|
||||
try {
|
||||
|
||||
CmdLine cmd("this is a message", ' ', "0.99" );
|
||||
|
||||
ValueArg<int> itest("i", "intTest", "integer test", true, 5, "int");
|
||||
cmd.add( itest );
|
||||
|
||||
//
|
||||
// Parse the command line.
|
||||
//
|
||||
cmd.parse(argc,argv);
|
||||
|
||||
//
|
||||
// Set variables
|
||||
//
|
||||
int _intTest = itest.getValue();
|
||||
cout << "found int: " << _intTest << endl;
|
||||
|
||||
} catch ( ArgException& e )
|
||||
{ cout << "ERROR: " << e.error() << " " << e.argId() << endl; }
|
||||
}
|
||||
|
||||
|
||||
|
@ -35,6 +35,8 @@
|
||||
#include <vector>
|
||||
#include <list>
|
||||
#include <iostream>
|
||||
#include <iomanip>
|
||||
#include <cstdio>
|
||||
|
||||
#if defined(HAVE_SSTREAM)
|
||||
#include <sstream>
|
||||
@ -384,7 +386,11 @@ ExtractValue(T &destVal, const std::string& strVal, ValueLike vl)
|
||||
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;
|
||||
|
||||
|
@ -69,7 +69,9 @@ TESTS = test1.sh \
|
||||
test67.sh \
|
||||
test68.sh \
|
||||
test69.sh \
|
||||
test70.sh
|
||||
test70.sh \
|
||||
test72.sh \
|
||||
test71.sh
|
||||
|
||||
EXTRA_DIST = $(TESTS) \
|
||||
test1.out \
|
||||
@ -141,6 +143,8 @@ EXTRA_DIST = $(TESTS) \
|
||||
test67.out \
|
||||
test68.out \
|
||||
test69.out \
|
||||
test70.out
|
||||
test70.out \
|
||||
test71.out \
|
||||
test72.out
|
||||
|
||||
CLEANFILES = tmp.out
|
||||
|
@ -1,5 +1,5 @@
|
||||
PARSE ERROR: Argument: -i (--intTest)
|
||||
Couldn't read argument value from string '0x2'
|
||||
Couldn't read argument value from string '0xA'
|
||||
|
||||
Brief USAGE:
|
||||
../examples/test2 [-f <float>] -i <int> -s <string> [-A] [-C] [-B] [--]
|
||||
|
@ -1,7 +1,7 @@
|
||||
#!/bin/sh
|
||||
|
||||
# failure ! ack no hex :(
|
||||
../examples/test2 -i 0x2 -f 4.2 -s asdf asdf > tmp.out 2>&1
|
||||
# failure... no hex here, but see test19.cpp for how to use hex
|
||||
../examples/test2 -i 0xA -f 4.2 -s asdf asdf > tmp.out 2>&1
|
||||
|
||||
if cmp -s tmp.out $srcdir/test29.out; then
|
||||
exit 0
|
||||
|
1
tests/test71.out
Normal file
1
tests/test71.out
Normal file
@ -0,0 +1 @@
|
||||
found int: 10
|
11
tests/test71.sh
Executable file
11
tests/test71.sh
Executable file
@ -0,0 +1,11 @@
|
||||
#!/bin/sh
|
||||
|
||||
# success test hex
|
||||
../examples/test19 -i 0xA > tmp.out 2>&1
|
||||
|
||||
if cmp -s tmp.out $srcdir/test71.out; then
|
||||
exit 0
|
||||
else
|
||||
exit 1
|
||||
fi
|
||||
|
1
tests/test72.out
Normal file
1
tests/test72.out
Normal file
@ -0,0 +1 @@
|
||||
found int: 10
|
11
tests/test72.sh
Executable file
11
tests/test72.sh
Executable file
@ -0,0 +1,11 @@
|
||||
#!/bin/sh
|
||||
|
||||
# success test octal
|
||||
../examples/test19 -i 012 > tmp.out 2>&1
|
||||
|
||||
if cmp -s tmp.out $srcdir/test72.out; then
|
||||
exit 0
|
||||
else
|
||||
exit 1
|
||||
fi
|
||||
|
Loading…
x
Reference in New Issue
Block a user