9#ifndef Sawyer_CommandLine_H
10#define Sawyer_CommandLine_H
12#include <Sawyer/Assert.h>
13#include <Sawyer/BitFlags.h>
14#include <Sawyer/DocumentMarkup.h>
15#include <Sawyer/IntervalSet.h>
16#include <Sawyer/Map.h>
17#include <Sawyer/Message.h>
18#include <Sawyer/Optional.h>
19#include <Sawyer/Sawyer.h>
20#include <Sawyer/Set.h>
21#include <Sawyer/SharedPointer.h>
23#include <boost/algorithm/string/case_conv.hpp>
24#include <boost/any.hpp>
25#include <boost/cstdint.hpp>
26#include <boost/foreach.hpp>
27#include <boost/lexical_cast.hpp>
28#include <boost/numeric/conversion/cast.hpp>
164namespace CommandLine {
166SAWYER_EXPORT
extern const std::string STR_NONE;
258#include <Sawyer/WarningsOff.h>
259 std::vector<std::string> strings_;
261#include <Sawyer/WarningsRestore.h>
267 explicit Cursor(
const std::vector<std::string> &strings);
277 const std::vector<std::string>&
strings()
const;
320 const std::string&
arg()
const;
337 std::string
substr(
const Location &limit,
const std::string &separator=
" ")
const;
343 void replace(
const std::vector<std::string>&);
401 virtual void save(
const boost::any&,
const std::string &switchKey) = 0;
413 virtual void save(
const boost::any &value,
const std::string &) {
414 storage_ = boost::any_cast<T>(value);
421#define SAWYER_COMMANDLINE_SEQUENCE_SAVER(CONTAINER_TEMPLATE, INSERT_METHOD) \
422 template<typename T> \
423 class TypedSaver<CONTAINER_TEMPLATE<T> >: public ValueSaver { \
424 CONTAINER_TEMPLATE<T> &storage_; \
426 TypedSaver(CONTAINER_TEMPLATE<T> &storage): storage_(storage) {} \
428 static Ptr instance(CONTAINER_TEMPLATE<T> &storage) { return Ptr(new TypedSaver(storage)); } \
429 virtual void save(const boost::any &value, const std::string &) { \
430 T typed = boost::any_cast<T>(value); \
431 storage_.INSERT_METHOD(typed); \
439#define SAWYER_COMMANDLINE_MAP_SAVER(CONTAINER_TEMPLATE, INSERT_METHOD) \
440 template<typename T> \
441 class TypedSaver<CONTAINER_TEMPLATE<std::string, T> >: public ValueSaver { \
442 CONTAINER_TEMPLATE<std::string, T> &storage_; \
444 TypedSaver(CONTAINER_TEMPLATE<std::string, T> &storage): storage_(storage) {} \
446 static Ptr instance(CONTAINER_TEMPLATE<std::string, T> &storage) { return Ptr(new TypedSaver(storage)); } \
447 virtual void save(const boost::any &value, const std::string &switchKey) { \
448 T typed = boost::any_cast<T>(value); \
449 storage_.INSERT_METHOD(switchKey, typed); \
456#define SAWYER_COMMANDLINE_INTERVALSET_SAVER(CONTAINER_TEMPLATE, INSERT_METHOD) \
457 template<typename Interval> \
458 class TypedSaver<CONTAINER_TEMPLATE<Interval> >: public ValueSaver { \
459 CONTAINER_TEMPLATE<Interval> &storage_; \
461 TypedSaver(CONTAINER_TEMPLATE<Interval> &storage): storage_(storage) {} \
463 static Ptr instance(CONTAINER_TEMPLATE<Interval> &storage) { return Ptr(new TypedSaver(storage)); } \
464 virtual void save(const boost::any &value, const std::string &) { \
465 Interval typed = boost::any_cast<Interval>(value); \
466 storage_.INSERT_METHOD(typed); \
474#define SAWYER_COMMANDLINE_MAP_PAIR_SAVER(CONTAINER_TEMPLATE, INSERT_METHOD) \
475 template<typename T> \
476 class TypedSaver<CONTAINER_TEMPLATE<std::string, T> >: public ValueSaver { \
477 CONTAINER_TEMPLATE<std::string, T> &storage_; \
479 TypedSaver(CONTAINER_TEMPLATE<std::string, T> &storage): storage_(storage) {} \
481 static Ptr instance(CONTAINER_TEMPLATE<std::string, T> &storage) { return Ptr(new TypedSaver(storage)); } \
482 virtual void save(const boost::any &value, const std::string &switchKey) { \
483 T typed = boost::any_cast<T>(value); \
484 storage_.INSERT_METHOD(std::make_pair(switchKey, typed)); \
488SAWYER_COMMANDLINE_SEQUENCE_SAVER(std::vector, push_back);
489SAWYER_COMMANDLINE_SEQUENCE_SAVER(std::list, push_back);
490SAWYER_COMMANDLINE_SEQUENCE_SAVER(std::set, insert);
492SAWYER_COMMANDLINE_SEQUENCE_SAVER(
Optional,
operator=);
494SAWYER_COMMANDLINE_MAP_PAIR_SAVER(std::map, insert);
509#include <Sawyer/WarningsOff.h>
512 std::string valueString_;
513 std::string switchKey_;
515 std::string switchString_;
517 size_t switchSequence_;
519#include <Sawyer/WarningsRestore.h>
544 void sequenceInfo(
size_t keySequence,
size_t switchSequence);
585 template<
typename T> T
as()
const {
return boost::any_cast<T>(value_); }
696#include <Sawyer/WarningsOff.h>
698#include <Sawyer/WarningsRestore.h>
752 static T convert(
const std::string &src) {
754 return boost::lexical_cast<T>(src);
755 }
catch (
const boost::bad_lexical_cast &e) {
756 throw std::runtime_error(e.what());
763 static boost::regex convert(
const std::string &src) {
764 return boost::regex(src);
770 static std::regex convert(
const std::string &src) {
771 return std::regex(src);
777 static boost::filesystem::path convert(
const std::string &src) {
778 return boost::filesystem::path(src);
784 static boost::any convert(
const std::string &src) {
791 static T convert(
const std::string &src) {
798 static T convert(
const std::string &src) {
805 static T convert(
const std::string &src) {
812 static T convert(
const std::string &src) {
819 static T convert(
const std::string &src) {
826 static T convert(
const std::string &src) {
833 static T convert(
const std::string &src) {
885 throw std::runtime_error(
"string expected");
887 std::string s = cursor.
rest();
894template<
typename Target,
typename Source>
896 static Target convert(Source from,
const std::string &parsed) {
898 return boost::numeric_cast<Target>(from);
899 }
catch (
const boost::numeric::positive_overflow&) {
900 std::string bound = boost::lexical_cast<std::string>(boost::numeric::bounds<Target>::highest());
901 throw std::range_error(
"parsed string \""+parsed+
"\" is greater than "+bound);
902 }
catch (
const boost::numeric::negative_overflow&) {
903 std::string bound = boost::lexical_cast<std::string>(boost::numeric::bounds<Target>::lowest());
904 throw std::range_error(
"parsed string \""+parsed+
"\" is less than "+bound);
905 }
catch (
const boost::numeric::bad_numeric_cast&) {
906 throw std::range_error(
"cannot cast \""+parsed+
"\" to destination type");
912template<
typename Target,
typename Source>
914 static Target convert(Source from,
const std::string &parsed) {
920template<
typename Target,
typename Source>
922 static Target convert(Source from,
const std::string &parsed) {
928template<
typename Target,
typename Source>
930 static Target convert(Source from,
const std::string &parsed) {
936template<
typename Target,
typename Source>
938 static Target convert(Source from,
const std::string &parsed) {
944template<
typename Target,
typename Source>
946 static Target convert(Source from,
const std::string &parsed) {
952template<
typename Target,
typename Source>
954 static Target convert(Source from,
const std::string &parsed) {
960template<
typename Target,
typename Source>
962 static Target convert(Source from,
const std::string &parsed) {
1004 virtual ParsedValue operator()(
const char *input,
const char **rest,
const Location &loc) {
1006 boost::int64_t big =
strtoll(input, (
char**)rest, 0);
1008 throw std::runtime_error(
"integer expected");
1009 while (isspace(**rest)) ++*rest;
1010 std::string parsed(input, *rest-input);
1012 throw std::range_error(
"integer overflow when parsing \""+parsed+
"\"");
1049 virtual ParsedValue operator()(
const char *input,
const char **rest,
const Location &loc) {
1051 while (isspace(*input)) ++input;
1052 if (
'+'!=*input && !isdigit(*input))
1053 throw std::runtime_error(
"unsigned integer expected");
1054 boost::uint64_t big =
strtoull(input, (
char**)rest, 0);
1056 throw std::runtime_error(
"unsigned integer expected");
1057 while (isspace(**rest)) ++*rest;
1058 std::string parsed(input, *rest-input);
1060 throw std::range_error(
"integer overflow when parsing \""+parsed+
"\"");
1097 virtual ParsedValue operator()(
const char *input,
const char **rest,
const Location &loc) {
1099 while (isspace(*input)) ++input;
1100 if (
'+'!=*input && !isdigit(*input))
1101 throw std::runtime_error(
"positive integer expected");
1102 boost::uint64_t big =
strtoull(input, (
char**)rest, 0);
1103 if (*rest==input || big==0)
1104 throw std::runtime_error(
"positive integer expected");
1105 while (isspace(**rest)) ++*rest;
1106 std::string parsed(input, *rest-input);
1108 throw std::range_error(
"integer overflow when parsing \""+parsed+
"\"");
1144 virtual ParsedValue operator()(
const char *input,
const char **rest,
const Location &loc) {
1145 double big = strtod(input, (
char**)rest);
1147 throw std::runtime_error(
"real number expected");
1148 while (isspace(**rest)) ++*rest;
1149 std::string parsed(input, *rest-input);
1182 virtual ParsedValue operator()(
const char *input,
const char **rest,
const Location &loc) {
1183 static const char *neg[] = {
"false",
"off",
"no",
"0",
"f",
"n"};
1184 static const char *pos[] = {
"true",
"yes",
"on",
"1",
"t",
"y"};
1185 const char *start = input;
1186 while (isspace(*input)) ++input;
1187 for (
int negpos=0; negpos<2; ++negpos) {
1188 const char **list = 0==negpos ? neg : pos;
1189 size_t listsz = 0==negpos ?
sizeof(neg)/
sizeof(*neg) : sizeof(pos)/sizeof(*pos);
1190 for (
size_t i=0; i<listsz; ++i) {
1191 if (0==my_strncasecmp(list[i], input, strlen(list[i]))) {
1192 *rest = input + strlen(list[i]);
1193 while (isspace(**rest)) ++*rest;
1194 std::string parsed(start, *rest-start);
1195 return ParsedValue(NumericCast<T, bool>::convert(0!=negpos, parsed), loc, parsed,
valueSaver());
1199 throw std::runtime_error(
"Boolean expected");
1203 int my_strncasecmp(
const char *a,
const char *b,
size_t nchars) {
1206 for (
size_t i=0; i<nchars; ++i) {
1208 return a[i] ? 1 : (b[i] ? -1 : 0);
1209 char achar = (char)tolower(a[i]);
1210 char bchar = (char)tolower(b[i]);
1212 return achar < bchar ? -1 : 1;
1227#include <Sawyer/WarningsOff.h>
1228 std::vector<std::string> strings_;
1229#include <Sawyer/WarningsRestore.h>
1257 template<
class InputIterator>
1258 Ptr with(InputIterator begin, InputIterator end) {
1259 strings_.insert(strings_.end(), begin, end);
1301 strParser_->with(name);
1302 members_.
insert(name, value);
1320 typedef std::pair<ValueParser::Ptr, std::string> ParserSep;
1321#include <Sawyer/WarningsOff.h>
1322 std::vector<ParserSep> elements_;
1323 size_t minLength_, maxLength_;
1324#include <Sawyer/WarningsRestore.h>
1532#include <Sawyer/WarningsOff.h>
1536#include <Sawyer/WarningsRestore.h>
1615#include <Sawyer/WarningsOff.h>
1616 std::string versionString_;
1617#include <Sawyer/WarningsRestore.h>
1655 static Ptr instance(
const std::string &versionString,
int exitStatus);
1722#include <Sawyer/WarningsOff.h>
1723 std::string switchKey_;
1726#include <Sawyer/WarningsRestore.h>
1763#include <Sawyer/WarningsOff.h>
1765#include <Sawyer/WarningsRestore.h>
1805template<
class Functor>
1821 virtual void operator()(
const ParserResult &parserResult) { (functor_)(parserResult); }
1864template<
class Functor>
1931 ASSERT_forbid(newValues.empty());
1933 BOOST_FOREACH (
const ParsedValue &pv, savedValues)
1940 pvals.push_back(pval);
1988#include <Sawyer/WarningsOff.h>
1989 std::vector<std::string> longPrefixes;
1990 bool inheritLongPrefixes;
1991 std::vector<std::string> shortPrefixes;
1992 bool inheritShortPrefixes;
1993 std::vector<std::string> valueSeparators;
1994 bool inheritValueSeparators;
1996#include <Sawyer/WarningsRestore.h>
2036#include <Sawyer/WarningsOff.h>
2037 std::vector<std::string> longNames_;
2038 std::string shortNames_;
2041 std::string synopsis_;
2042 std::string documentation_;
2043 std::string documentationKey_;
2045 std::vector<SwitchArgument> arguments_;
2050 bool explosiveLists_;
2052#include <Sawyer/WarningsRestore.h>
2070 explicit Switch(
const std::string &longName,
char shortName=
'\0');
2104 const std::string&
key()
const;
2178 const std::string&
doc()
const;
2224 const std::string &s3=STR_NONE,
const std::string &s4=STR_NONE);
2241 const std::string &s3=STR_NONE,
const std::string &s4=STR_NONE);
2263 const std::string &s3=STR_NONE,
const std::string &s4=STR_NONE);
2333 template<
typename T>
2445 void init(
const std::string &longName,
char shortName);
2448 std::runtime_error noSeparator(
const std::string &switchString,
const Cursor&,
const ParsingProperties&)
const;
2451 std::runtime_error extraTextAfterSwitch(
const std::string &switchString,
const Location &endOfSwitch,
const Cursor&,
2455 std::runtime_error extraTextAfterArgument(
const Cursor&,
const ParsedValue &va)
const;
2458 std::runtime_error notEnoughArguments(
const std::string &switchString,
const Cursor&,
size_t nargs)
const;
2461 std::runtime_error missingArgument(
const std::string &switchString,
const Cursor &cursor,
2465 std::runtime_error malformedArgument(
const std::string &switchString,
const Cursor &cursor,
2475 const std::string &optionalPart,
const std::string &requiredPart)
const;
2508 size_t matchArguments(
const std::string &switchString,
const Location &endOfSwitch,
Cursor &cursor ,
2551#include <Sawyer/WarningsOff.h>
2552 std::vector<Switch> switches_;
2556 std::string docKey_;
2557 std::string documentation_;
2559#include <Sawyer/WarningsRestore.h>
2572 explicit SwitchGroup(
const std::string &title,
const std::string &docKey =
"");
2626 const std::string&
doc()
const;
2642 const std::string &s3=STR_NONE,
const std::string &s4=STR_NONE);
2650 const std::string &s3=STR_NONE,
const std::string &s4=STR_NONE);
2658 const std::string &s3=STR_NONE,
const std::string &s4=STR_NONE);
2720 bool removeByPointer(
const void*);
2739#include <Sawyer/WarningsOff.h>
2740 std::vector<SwitchGroup> switchGroups_;
2742 std::string groupNameSeparator_;
2743 std::vector<std::string> terminationSwitches_;
2744 bool shortMayNestle_;
2745 std::vector<std::string> inclusionPrefixes_;
2746 bool skipNonSwitches_;
2747 bool skipUnknownSwitches_;
2748 mutable std::string programName_;
2749 std::string purpose_;
2750 std::string versionString_;
2751 mutable std::string dateString_;
2753 std::string chapterName_;
2760 bool reportingAmbiguities_;
2761 std::string environmentVariable_;
2762#include <Sawyer/WarningsRestore.h>
2853 const std::string &s3=STR_NONE,
const std::string &s4=STR_NONE);
2863 const std::string &s3=STR_NONE,
const std::string &s4=STR_NONE);
2875 const std::string &s3=STR_NONE,
const std::string &s4=STR_NONE);
2885 const std::string &s3=STR_NONE,
const std::string &s4=STR_NONE);
2913 const std::string &s3=STR_NONE,
const std::string &s4=STR_NONE);
2991 template<
typename Iterator>
2993 std::vector<std::string> args(begin, end);
3024 DEFAULT_GROUPING = 0,
3025 PROHIBIT_EMPTY_GROUPS = 0x0001,
3026 SPLIT_SINGLE_GROUP = 0x0002
3036 std::vector<std::vector<std::string> >
3039 unsigned flags = 0 );
3059 Parser&
version(
const std::string &versionString,
const std::string &dateString=
"");
3061 std::pair<std::string, std::string>
version()
const;
3122 Parser&
doc(
const std::string §ionName,
const std::string &docKey,
const std::string &text);
3123 Parser&
doc(
const std::string §ionName,
const std::string &text);
3124 Parser&
doc(
const std::pair<std::string /*sectionName*/, std::string /*text*/>&);
3147 template<
class Grammar>
3148 bool emitDocumentationToPager()
const {
3150 initDocGrammar(grammar);
3151 grammar.title(programName(), boost::lexical_cast<std::string>(chapter().first), chapter().second);
3152 grammar.version(version().first, version().second);
3153 return grammar.emit(documentationMarkup());
3219 ParserResult parseInternal(std::vector<std::string> programArguments);
3249 bool apparentSwitch(
const Cursor&)
const;
3256 std::string ambiguityErrorMesg(
const std::string &longSwitchString,
const std::string &optionalPart,
3257 const std::string &longSwitchName,
const NamedSwitches &ambiguities);
3258 std::string ambiguityErrorMesg(
const std::string &shortSwitchString,
const NamedSwitches &ambiguities);
3293#include <Sawyer/WarningsOff.h>
3311 typedef std::vector<size_t> SkippedIndex;
3312 SkippedIndex skippedIndex_;
3315 SkippedIndex terminators_;
3319#include <Sawyer/WarningsRestore.h>
3336 size_t have(
const std::string &switchKey)
const;
3394 std::vector<std::string>
unparsedArgs(
bool includeTerminators=
false)
const;
Stores a vector of enum bit flags.
Parses any argument as plain text.
AnyParser(const ValueSaver::Ptr &valueSaver)
Constructor for derived classes.
static Ptr instance(const ValueSaver::Ptr &valueSaver)
Allocating constructor.
AnyParser()
Constructor for derived classes.
static Ptr instance()
Allocating constructor.
SharedPointer< AnyParser > Ptr
Reference counting pointer for this class.
Parses a boolean value and converts it to numeric type T.
static Ptr instance(const ValueSaver::Ptr &valueSaver)
Allocating constructor.
static Ptr instance()
Allocating constructor.
SharedPointer< BooleanParser > Ptr
Reference counting pointer for this class.
BooleanParser(const ValueSaver::Ptr &valueSaver)
Constructor for derived classes.
BooleanParser()
Constructor for derived classes.
Input stream for command line arguments.
const std::string & arg() const
Return the entire current program argument regardless of where the cursor is in that argument.
std::string rest() const
Return the part of an argument at and beyond the cursor location.
void replace(const std::vector< std::string > &)
Replace the current string with new strings.
const std::vector< std::string > & strings() const
All strings for the cursor.
void consumeArgs(size_t nargs)
Advance the cursor to the beginning of the next string.
Cursor()
Constructs a not-very-useful cursor to nothing.
Cursor(const std::vector< std::string > &strings)
Construct a cursor from an ordered set of strings.
bool atArgEnd() const
True when the cursor is at the end of an argument.
const Location & location() const
Property: current position of the cursor.
void consumeArg()
Advance the cursor to the beginning of the next string.
std::string rest(const Location &location) const
Return the part of an argument at and beyond the cursor location.
std::string substr(const Location &limit, const std::string &separator=" ") const
Returns all characters within limits.
void consumeChars(size_t nchars)
Advance over characters.
bool atArgBegin() const
True when the cursor is at the beginning of an argument.
Cursor & location(const Location &loc)
Property: current position of the cursor.
const std::string & arg(const Location &location) const
Return the entire current program argument regardless of where the cursor is in that argument.
bool atEnd() const
Returns true when the cursor is after all arguments.
Cursor(const std::string &string)
Constructs a cursor for a single string.
size_t linearDistance() const
Number of characters from the beginning of the cursor to its current location.
bool atEnd(const Location &location) const
Returns true when the cursor is after all arguments.
std::string substr(const Location &limit1, const Location &limit2, const std::string &separator=" ") const
Returns all characters within limits.
Parses an enumerated constant.
EnumParser()
Constructor for derived classes.
SharedPointer< EnumParser > Ptr
Reference counting pointer for this class.
static Ptr instance()
Allocating constructor.
EnumParser(const ValueSaver::Ptr &valueSaver)
Constructor for derived classes.
Ptr with(const std::string &name, T value)
Adds enum members.
static Ptr instance(const ValueSaver::Ptr &valueSaver)
Allocating constructor.
Guards a cursor and restores it when the guard is destroyed.
ExcursionGuard(Cursor &)
Construct a guard for a cursor.
const Location & startingLocation() const
Starting location.
void cancel()
Cancel the excursion guard.
Parses an integer and converts it to numeric type T.
static Ptr instance()
Allocating constructor.
IntegerParser()
Constructor for derived classes.
static Ptr instance(const ValueSaver::Ptr &valueSaver)
Allocating constructor.
IntegerParser(const ValueSaver::Ptr &valueSaver)
Constructor for derived classes.
SharedPointer< IntegerParser > Ptr
Reference counting pointer for this class.
static Ptr instance(const ValueParser::Ptr &firstElmtType, const std::string &separatorRe="[,;:]\\s*")
Allocating constructor.
Ptr limit(size_t maxLength)
Specify limits for the number of values parsed.
Ptr nextMember(const ValueParser::Ptr &elmtType, const std::string &separatorRe="[,;:]\\s*")
Specifies element type and separator.
SharedPointer< ListParser > Ptr
Reference counting pointer for this class.
Ptr limit(size_t minLength, size_t maxLength)
Specify limits for the number of values parsed.
ListParser(const ValueParser::Ptr &firstElmtType, const std::string &separatorRe)
Constructor for derived classes.
Ptr exactly(size_t length)
Specify limits for the number of values parsed.
std::list< ParsedValue > ValueList
Value type for list ParsedValue.
Parses a non-negative integer and converts it to numeric type T.
NonNegativeIntegerParser(const ValueSaver::Ptr &valueSaver)
Constructor for derived classes.
SharedPointer< NonNegativeIntegerParser > Ptr
Reference counting pointer for this class.
static Ptr instance()
Allocating constructor.
NonNegativeIntegerParser()
Constructor for derived classes.
static Ptr instance(const ValueSaver::Ptr &valueSaver)
Allocating constructor.
Information about a parsed switch value.
bool isEmpty() const
True if the value is void.
const std::string & switchString() const
The string for the switch that caused this value to be parsed.
void value(const boost::any &v)
Property: the parsed value.
const std::string & string() const
String representation.
boost::int64_t asInt64() const
Convenience cast.
float asFloat() const
Convenience cast.
ParsedValue()
Construct a new empty value.
ParsedValue & switchKey(const std::string &s)
Property: switch key.
int asInt() const
Convenience cast.
const boost::any & value() const
Property: the parsed value.
unsigned asUnsigned() const
Convenience cast.
const ValueSaver::Ptr valueSaver() const
How to save a value at a user-supplied location.
boost::uint64_t asUnsigned64() const
Convenience cast.
bool asBool() const
Convenience cast.
T as() const
Convenient any_cast.
Location switchLocation() const
The command-line location of the switch to which this value belongs.
long asLong() const
Convenience cast.
size_t switchSequence() const
How this value relates to others created by the same switch.
void print(std::ostream &) const
Print some debugging information.
std::string asString() const
Convenience cast.
double asDouble() const
Convenience cast.
ParsedValue & valueLocation(const Location &loc)
Property: command-line location from whence this value came.
const std::string & switchKey() const
Property: switch key.
ParsedValue(const boost::any value, const Location &loc, const std::string &str, const ValueSaver::Ptr &saver)
Construct a new value.
Location valueLocation() const
Property: command-line location from whence this value came.
void save() const
Save this value in switch-supplied storage.
size_t keySequence() const
How this value relates to others with the same key.
unsigned long asUnsignedLong() const
Convenience cast.
ParsedValue & switchInfo(const std::string &key, const Location &loc, const std::string &str)
Update switch information.
The result from parsing a command line.
ParsedValues parsed(const std::string &switchKey) const
Returns values for a key.
const ParserResult & apply() const
Saves parsed values in switch-specified locations.
std::vector< std::string > unparsedArgs(bool includeTerminators=false) const
Returns unparsed switches.
const std::vector< std::string > & allArgs() const
The original command line.
std::vector< std::string > parsedArgs() const
Returns the program arguments that were processed.
std::vector< std::string > skippedArgs() const
Program arguments that were skipped over during parsing.
const ParsedValue & parsed(const std::string &switchKey, size_t idx) const
Returns values for a key.
size_t have(const std::string &switchKey) const
Returns the number of values for the specified key.
const Parser & parser() const
That parser that created this result.
std::vector< std::string > unreachedArgs() const
Returns program arguments that were not reached during parsing.
The parser for a program command line.
NamedSwitches findAmbiguities() const
Find switch string ambiguities.
std::vector< SwitchGroup > & switchGroups()
List of all switch groups.
Parser & with(const SwitchGroup &sg)
Add switch declarations.
Parser & resetShortPrefixes(const std::string &s1=STR_NONE, const std::string &s2=STR_NONE, const std::string &s3=STR_NONE, const std::string &s4=STR_NONE)
Prefixes to use for short command-line switches.
bool skippingNonSwitches() const
Whether to skip over non-switch arguments when parsing.
Parser & resetInclusionPrefixes(const std::string &s1=STR_NONE, const std::string &s2=STR_NONE, const std::string &s3=STR_NONE, const std::string &s4=STR_NONE)
Strings that indicate that arguments are to be read from a file.
const std::vector< std::string > & valueSeparators() const
Strings that separate a long switch from its value.
SwitchGroup & switchGroup(const std::string &name)
Switch group having specified name.
Parser & with(const SwitchGroup &sg, const std::string &docKey)
Add switch declarations.
Sawyer::Optional< Switch > removeMatchingSwitch(const std::vector< std::string > &args)
Remove the switch by matching parse sentence.
static void printIndex(std::ostream &, const NamedSwitches &, const std::string &linePrefix="")
Print a switch index.
Parser & with(const Switch &sw)
Add switch declarations.
const std::string & environmentVariable() const
Name of environment variable holding initial arguments.
Parser & longPrefix(const std::string &s1)
Prefixes to use for long command-line switches.
Parser & switchGroupOrder(SortOrder order)
Property: How to order switch groups in documentation.
Parser & shortMayNestle(bool b)
Indicates whether short switches can nestle together.
GroupingFlags
Bit flags for argument grouping.
void insertShortSwitchStrings(NamedSwitches &index) const
Insert records for short switch strings.
Sawyer::Optional< Switch > removeMatchingSwitch(const std::string &arg)
Remove the switch by matching parse sentence.
Parser & purpose(const std::string &purpose)
Program purpose.
Parser & doc(const std::string §ionName, const std::string &docKey, const std::string &text)
Documentation for a section of the manual.
Parser & inclusionPrefix(const std::string &s1)
Strings that indicate that arguments are to be read from a file.
const std::vector< std::string > & shortPrefixes() const
Prefixes to use for short command-line switches.
const std::vector< std::string > & terminationSwitches() const
Strings that indicate the end of the argument list.
Parser & version(const std::pair< std::string, std::string > &p)
Program version.
Parser & shortPrefix(const std::string &s1)
Prefixes to use for short command-line switches.
void insertSwitchStrings(Canonical, NamedSwitches &index) const
Insert records for long and short switch strings.
std::vector< std::string > docSections() const
Documentation for a section of the manual.
std::vector< std::vector< std::string > > regroupArgs(const std::vector< std::string > &args, const Container::Interval< size_t > &limits=Container::Interval< size_t >::whole(), unsigned flags=0)
Group arguments by "--" separators.
Parser()
Default constructor.
ParserResult parse(const std::vector< std::string > &)
Parse program arguments.
std::string textDocumentation() const
Generate plain text documentation.
Parser & reportingAmbiguities(bool b)
Property: Whether to report ambiguities.
Parser & resetValueSeparators(const std::string &s1=STR_NONE, const std::string &s2=STR_NONE, const std::string &s3=STR_NONE, const std::string &s4=STR_NONE)
Strings that separate a long switch from its value.
bool skippingUnknownSwitches() const
Whether to skip over unrecognized switches.
Parser & skippingNonSwitches(bool b)
Whether to skip over non-switch arguments when parsing.
static std::vector< std::string > readArgsFromEnvVar(const std::string &varName)
Read an envrionment variable to obtain arguments.
Parser & skippingUnknownSwitches(bool b)
Whether to skip over unrecognized switches.
std::string exitMessage() const
Extra text to print before exit.
std::string documentationMarkup() const
Full documentation.
Parser & valueSeparator(const std::string &s1)
Strings that separate a long switch from its value.
static std::vector< std::string > splitLineIntoWords(std::string)
Split line of text into words.
std::string podDocumentation() const
Generate Perl POD documentation.
bool switchGroupExists(const std::string &name) const
Predicate to determine whether a switch group exists.
const std::vector< std::string > & inclusionPrefixes() const
Strings that indicate that arguments are to be read from a file.
NamedSwitches findUnresolvableAmbiguities() const
Find unresolvable switch string ambiguities.
Parser & doc(const std::pair< std::string, std::string > &)
Documentation for a section of the manual.
Parser & resetLongPrefixes(const std::string &s1=STR_NONE, const std::string &s2=STR_NONE, const std::string &s3=STR_NONE, const std::string &s4=STR_NONE)
Prefixes to use for long command-line switches.
Parser & showingGroupNames(ShowGroupName)
Property: How to show group names in switch documentation.
Parser & chapter(int chapterNumber, const std::string &chapterName="")
Manual chapter.
const std::vector< SwitchGroup > & switchGroups() const
List of all switch groups.
ShowGroupName showingGroupNames() const
Property: How to show group names in switch documentation.
const std::string & programName() const
Program name for documentation.
Parser & programName(const std::string &programName)
Program name for documentation.
static std::vector< std::string > readArgsFromFile(const std::string &filename)
Read a text file to obtain arguments.
bool eraseSwitchGroup(const std::string &name)
Remove switch group from parser.
const SwitchGroup & switchGroup(const std::string &name) const
Switch group having specified name.
std::pair< std::string, std::string > version() const
Program version.
std::string docForSection(const std::string §ionName) const
Documentation for a section of the manual.
Parser & version(const std::string &versionString, const std::string &dateString="")
Program version.
ParserResult parse(int argc, char *argv[])
Parse program arguments.
std::string docForSwitches() const
Documentation for a section of the manual.
Parser & resetTerminationSwitches(const std::string &s1=STR_NONE, const std::string &s2=STR_NONE, const std::string &s3=STR_NONE, const std::string &s4=STR_NONE)
Strings that indicate the end of the argument list.
SortOrder switchGroupOrder() const
Property: How to order switch groups in documentation.
Parser & errorStream(const Message::SProxy &stream)
Specifies a message stream to which errors are sent.
const Message::SProxy & errorStream() const
Specifies a message stream to which errors are sent.
Parser & environmentVariable(const std::string &s)
Name of environment variable holding initial arguments.
const std::string & groupNameSeparator() const
Property: String separating group name from switch name.
Parser & with(const std::vector< SwitchGroup > &sgs)
Add switch declarations.
std::pair< int, std::string > chapter() const
Manual chapter.
Parser & groupNameSeparator(const std::string &s)
Property: String separating group name from switch name.
const std::string & purpose() const
Program purpose.
Parser & with(Switch sw, const std::string &docKey)
Add switch declarations.
bool emitDocumentationToPager() const
Print documentation to standard output.
Parser & exitMessage(const std::string &s)
Extra text to print before exit.
const std::vector< std::string > & longPrefixes() const
Prefixes to use for long command-line switches.
Parser & terminationSwitch(const std::string &s1)
Strings that indicate the end of the argument list.
Parser & doc(const std::string §ionName, const std::string &text)
Documentation for a section of the manual.
bool shortMayNestle() const
Indicates whether short switches can nestle together.
bool reportingAmbiguities() const
Property: Whether to report ambiguities.
void insertLongSwitchStrings(Canonical, NamedSwitches &index) const
Insert records for long switch strings.
Parser & chapter(const std::pair< int, std::string > &p)
Manual chapter.
std::vector< std::string > expandIncludedFiles(const std::vector< std::string > &args)
Expand file arguments.
Parses a positive integer and converts it to numeric type T.
static Ptr instance()
Allocating constructor.
PositiveIntegerParser()
Constructor for derived classes.
static Ptr instance(const ValueSaver::Ptr &valueSaver)
Allocating constructor.
SharedPointer< PositiveIntegerParser > Ptr
Reference counting pointer for this class.
PositiveIntegerParser(const ValueSaver::Ptr &valueSaver)
Constructor for derived classes.
Parses a real number and converts it to numeric type T.
static Ptr instance(const ValueSaver::Ptr &valueSaver)
Allocating constructor.
static Ptr instance()
Allocating constructor.
RealNumberParser(const ValueSaver::Ptr &valueSaver)
Constructor for derived classes.
RealNumberParser()
Constructor for derived classes.
SharedPointer< RealNumberParser > Ptr
Reference counting pointer for this class.
Functor to print the Unix man page and exit.
static Ptr instance(int exitStatus)
Allocating constructor.
ShowHelpAndExit(int exitStatus)
Constructor for derived classes.
SharedPointer< ShowHelpAndExit > Ptr
Reference counting pointer for this class.
Functor to print the Unix man page.
static Ptr instance()
Allocating constructor.
SharedPointer< ShowHelp > Ptr
Reference counting pointer for this class.
ShowHelp()
Constructor for derived classes.
Functor to print a version string and exit.
ShowVersionAndExit(const std::string &versionString, int exitStatus)
Constructor for derived classes.
SharedPointer< ShowVersionAndExit > Ptr
Reference counting pointer for this class.
static Ptr instance(const std::string &versionString, int exitStatus)
Allocating constructor.
Functor to print a version string.
ShowVersion(const std::string &versionString)
Constructor for derived classes.
SharedPointer< ShowVersion > Ptr
Reference counting pointer for this class.
static Ptr instance(const std::string &versionString)
Allocating constructor.
Parses any one of a set of strings.
static Ptr instance()
Allocating constructor.
StringSetParser(const ValueSaver::Ptr &)
Constructor for derived classes.
Ptr with(InputIterator begin, InputIterator end)
Adds string members.
static Ptr instance(const ValueSaver::Ptr &)
Allocating constructor.
SharedPointer< StringSetParser > Ptr
Reference counting pointer for this class.
StringSetParser()
Constructor for derived classes.
Ptr with(const std::vector< std::string >)
Adds string members.
Ptr with(const std::string &)
Adds string members.
Sums all previous and current values.
SharedPointer< Sum > Ptr
Reference counting pointer for this class.
virtual ParsedValues operator()(const ParsedValues &savedValues, const ParsedValues &newValues)
Called when a switch's value is about to be stored into the ParserResult.
static Ptr instance()
Allocating constructor.
Sum()
Constructor for derived classes.
Base class for switch actions.
SharedPointer< SwitchAction > Ptr
Reference counting pointer for this class.
void run(const ParserResult &parserResult)
Runs the action.
Describes one argument of a command-line switch.
SwitchArgument(const std::string &name, const ValueParser::Ptr &parser=anyParser())
Construct a new required argument.
SwitchArgument(const std::string &name, const ValueParser::Ptr &parser, const std::string &defaultValueString)
Construct a new switch optional argument.
bool isRequired() const
Returns true if this argument is required.
const std::string & name() const
Argument name.
std::string nameAsText() const
Returns the name without markup.
const ValueParser::Ptr & parser() const
Returns a pointer to the parser.
const ParsedValue & defaultValue() const
The parsed default value.
bool isOptional() const
Returns true if this argument is not required.
const std::string & defaultValueString() const
The default value string.
A collection of related switch declarations.
SwitchGroup & removeByKey(const std::string &switchKey)
Remove a switch from the group.
const std::vector< Switch > & switches() const
List of all declared switches.
void showingGroupNames(ShowGroupName x)
Property: How to show group name in switch synopsis.
SwitchGroup & longPrefix(const std::string &s1)
Property: prefixes for long names.
SwitchGroup & title(const std::string &title)
Property: Title of the switch group.
const SortOrder & switchOrder() const
Property: Order of switches in documentation.
const Switch & getByName(const std::string &switchName)
Returns the first switch with the specified name.
SwitchGroup & removeByName(const std::string &switchName)
Remove a switch from the group.
SwitchGroup & resetLongPrefixes(const std::string &s1=STR_NONE, const std::string &s2=STR_NONE, const std::string &s3=STR_NONE, const std::string &s4=STR_NONE)
Property: prefixes for long names.
SwitchGroup & doc(const std::string &s)
Property: Detailed description.
const Switch & getByKey(const std::string &switchKey)
Returns the first switch with the specified key.
const std::string & docKey() const
Property: Documentation sort key.
size_t nSwitches() const
Number of switches declared.
SwitchGroup(const std::string &title, const std::string &docKey="")
Construct a titled group.
SwitchGroup & removeByIndex(size_t n)
Remove a switch from the group.
const std::string & name() const
Property: Group name.
const std::vector< std::string > & longPrefixes() const
Property: prefixes for long names.
const std::vector< std::string > & valueSeparators() const
Property: strings that separate a long switch from its value.
bool nameExists(const std::string &switchName)
Returns true if a switch with the specified name exists.
SwitchGroup & docKey(const std::string &key)
Property: Documentation sort key.
const std::vector< std::string > & shortPrefixes() const
Property: prefixes for short names.
SwitchGroup & name(const std::string &name)
Property: Group name.
const std::string & title() const
Property: Title of the switch group.
SwitchGroup & insert(const SwitchGroup &)
Insert switches from another group into this one.
SwitchGroup & valueSeparator(const std::string &s1)
Property: strings that separate a long switch from its value.
SwitchGroup & shortPrefix(const std::string &s1)
Property: prefixes for short names.
SwitchGroup & resetValueSeparators(const std::string &s1=STR_NONE, const std::string &s2=STR_NONE, const std::string &s3=STR_NONE, const std::string &s4=STR_NONE)
Property: strings that separate a long switch from its value.
ShowGroupName showingGroupNames() const
Property: How to show group name in switch synopsis.
bool keyExists(const std::string &switchKey)
Returns true if a switch with the specified key exists.
SwitchGroup & insert(const Switch &)
Insert a switch into the group.
SwitchGroup & switchOrder(SortOrder order)
Property: Order of switches in documentation.
SwitchGroup()
Construct an unnamed, untitled group.
SwitchGroup & resetShortPrefixes(const std::string &s1=STR_NONE, const std::string &s2=STR_NONE, const std::string &s3=STR_NONE, const std::string &s4=STR_NONE)
Property: prefixes for short names.
const std::string & doc() const
Property: Detailed description.
Describes one command-line switch.
const std::string & doc() const
Property: detailed description.
Switch & argument(const std::string &name, const ValueParser::Ptr &parser=anyParser())
Property: switch argument.
Switch & longPrefix(const std::string &s1)
Property: prefixes for long names.
Switch & intrinsicValue(const std::string &text)
Property: value for a switch that has no declared arguments.
const std::vector< SwitchArgument > & arguments() const
Property: switch argument.
Switch & whichValue(WhichValue s)
Property: how to handle multiple occurrences.
Switch & argument(const SwitchArgument &arg)
Property: switch argument.
size_t nRequiredArguments() const
Number of required arguments.
std::string preferredName() const
Name by which switch prefers to be known.
Switch & synopsis(const std::string &s)
Property: abstract summary of the switch syntax.
Switch & hidden(bool b)
Property: whether this switch appears in documentation.
ParsedValue intrinsicValue() const
Property: value for a switch that has no declared arguments.
std::string synopsis() const
Property: abstract summary of the switch syntax.
Switch & resetValueSeparators(const std::string &s1=STR_NONE, const std::string &s2=STR_NONE, const std::string &s3=STR_NONE, const std::string &s4=STR_NONE)
Property: strings that separate a long switch from its value.
Switch & docKey(const std::string &s)
Property: key to control order of documentation.
Switch & resetLongPrefixes(const std::string &s1=STR_NONE, const std::string &s2=STR_NONE, const std::string &s3=STR_NONE, const std::string &s4=STR_NONE)
Property: prefixes for long names.
Switch & valueAugmenter(const ValueAugmenter::Ptr &f)
Property: functor to agument values.
size_t nArguments() const
Total number of arguments.
Switch & intrinsicValue(const char *value, std::string &storage)
Property: value for a switch that has no declared arguments.
const std::string & shortNames() const
Property: switch short name.
Switch(const std::string &longName, char shortName='\0')
Constructs a switch declaration.
Switch & valueSeparator(const std::string &s1)
Property: strings that separate a long switch from its value.
Switch & resetShortPrefixes(const std::string &s1=STR_NONE, const std::string &s2=STR_NONE, const std::string &s3=STR_NONE, const std::string &s4=STR_NONE)
Property: prefixes for short names.
const std::vector< std::string > & longNames() const
Property: switch long name.
SwitchSkipping skipping() const
Property: whether to skip over this switch.
Switch & explosiveLists(bool b)
Property: whether to convert a list value to individual values.
const std::vector< std::string > & longPrefixes() const
Property: prefixes for long names.
bool hidden() const
Property: whether this switch appears in documentation.
Switch & intrinsicValue(const ParsedValue &value)
Property: value for a switch that has no declared arguments.
const SwitchArgument & argument(size_t idx) const
Property: switch argument.
const std::string & longName() const
Property: switch long name.
const std::vector< std::string > & valueSeparators() const
Property: strings that separate a long switch from its value.
Switch & shortName(char c)
Property: switch short name.
ValueAugmenter::Ptr valueAugmenter() const
Property: functor to agument values.
const std::string & docKey() const
Property: key to control order of documentation.
Switch & intrinsicValue(const std::string &text, const ValueParser::Ptr &p)
Property: value for a switch that has no declared arguments.
Switch & doc(const std::string &s)
Property: detailed description.
Switch & intrinsicValue(const T &value, T &storage)
Property: value for a switch that has no declared arguments.
WhichValue whichValue() const
Property: how to handle multiple occurrences.
const std::string & key() const
Property: value storage key.
const SwitchAction::Ptr & action() const
Property: action to occur.
Switch & skipping(SwitchSkipping how)
Property: whether to skip over this switch.
Switch & longName(const std::string &name)
Property: switch long name.
bool explosiveLists() const
Property: whether to convert a list value to individual values.
Switch & action(const SwitchAction::Ptr &f)
Property: action to occur.
const std::vector< std::string > & shortPrefixes() const
Property: prefixes for short names.
Switch & shortPrefix(const std::string &s1)
Property: prefixes for short names.
Switch & argument(const std::string &name, const ValueParser::Ptr &parser, const std::string &defaultValue)
Property: switch argument.
Switch & key(const std::string &s)
Property: value storage key.
Wrapper around a user functor.
SharedPointer< class UserAction > Ptr
Reference counting pointer for this class.
UserAction(Functor &f)
Constructor for derived classes.
static Ptr instance(Functor &f)
Allocating constructor.
Base class for value agumentors.
virtual ParsedValues operator()(const ParsedValues &savedValues, const ParsedValues &newValues)=0
Called when a switch's value is about to be stored into the ParserResult.
SharedPointer< ValueAugmenter > Ptr
Reference counting pointer for this class.
Base class parsing a value from input.
ParsedValue matchString(const std::string &)
Parse the entire string and return a value.
const ValueSaver::Ptr valueSaver() const
Property: functor responsible for saving a parsed value in user storage.
SharedPointer< ValueParser > Ptr
Reference counting pointer for this class.
ValueParser()
Constructor for derived classes.
ParsedValue match(Cursor &)
Parse a value from the beginning of the specified string.
ValueParser(const ValueSaver::Ptr &valueSaver)
Constructor for derived classes.
Ptr valueSaver(const ValueSaver::Ptr &f)
Property: functor responsible for saving a parsed value in user storage.
A container holding a set of values.
Range of values delimited by endpoints.
Container associating values with keys.
Map & insert(const Key &key, const Value &value)
Insert or update a key/value pair.
Collection of facilities.
Holds a value or nothing.
Creates SharedPointer from this.
SharedPointer< ValueParser > sharedFromThis()
Create a shared pointer from this.
Base class for reference counted objects.
Reference-counting intrusive smart pointer.
SharedPointer< U > dynamicCast() const
Dynamic cast.
UserAction< Functor >::Ptr userAction(const Functor &functor)
Factory for switch action.
ShowHelpAndExit::Ptr showHelpAndExit(int exitStatus)
Factory for switch action.
ShowHelp::Ptr showHelp()
Factory for switch action.
ShowVersionAndExit::Ptr showVersionAndExit(const std::string &versionString, int exitStatus)
Factory for switch action.
ConfigureDiagnostics::Ptr configureDiagnostics(const std::string &, Message::Facilities &, bool exitOnHelp=true)
Factory for switch action.
ConfigureDiagnosticsQuiet::Ptr configureDiagnosticsQuiet(Message::Facilities &)
Factory for switch action.
ShowVersion::Ptr showVersion(const std::string &versionString)
Factory for switch action.
Sum< T >::Ptr sum()
Factory for value agumenter.
PositiveIntegerParser< T >::Ptr positiveIntegerParser()
Factory for value parsers.
RealNumberParser< T >::Ptr realNumberParser()
Factory for value parsers.
NonNegativeIntegerParser< T >::Ptr nonNegativeIntegerParser()
Factory for value parsers.
StringSetParser::Ptr stringSetParser()
Factory for value parsers.
ListParser::Ptr listParser(const ValueParser::Ptr &, const std::string &sepRe="[,;:]\\s*")
Factory for value parsers.
AnyParser< T >::Ptr anyParser(T &storage)
Factory for value parsers.
IntegerParser< T >::Ptr integerParser()
Factory for value parsers.
BooleanParser< T >::Ptr booleanParser()
Factory for value parsers.
EnumParser< T >::Ptr enumParser()
Factory for value parsers.
AnyParser< T >::Ptr anyParser()
Factory for value parsers.
Canonical
Format of a switch string.
@ CANONICAL
Switch strings that are qualified with the switch group name or which belong to a group that has no n...
@ ALL_STRINGS
The union of CANONICAL and NONCANONICAL.
@ NONCANONICAL
Switch strings that are not CANONICAL.
std::vector< ParsedValue > ParsedValues
A vector of parsed values.
SortOrder
The order in which things are sorted in the documentation.
@ DOCKEY_ORDER
Entities are sorted according to their documentation keys.
@ INSERTION_ORDER
Entities appear in the documentation in the same order they are inserted into the container.
const Location NOWHERE
Indicates an invalid location.
ShowGroupName
How to show group names in switch synopsis.
@ SHOW_GROUP_OPTIONAL
Show name as being optional, like "--[group-]switch".
@ SHOW_GROUP_INHERIT
Group inherits value from the parser.
@ SHOW_GROUP_NONE
Never show the group name.
@ SHOW_GROUP_REQUIRED
Show name as being required, like "--group-switch".
Container::Map< const SwitchGroup *, std::set< const Switch * > > GroupedSwitches
Subset of switches grouped by their switch groups.
SwitchSkipping
Whether to skip a switch.
@ SKIP_STRONG
Skip switch and its argument(s) without saving any value.
@ SKIP_NEVER
Treat the switch normally.
@ SKIP_WEAK
Process switch normally, but also add to skipped list.
std::ostream & operator<<(std::ostream &, const Location &)
Print a location.
Container::Map< std::string, GroupedSwitches > NamedSwitches
Subset of switches indexed by their command-line representation.
WhichValue
Describes how to handle switches that occur multiple times.
@ SAVE_AUGMENTED
Save the first value, or modify previously saved value.
@ SAVE_ONE
The switch cannot occur more than once.
@ SAVE_LAST
Use only the last occurrence and ignore all previous.
@ SAVE_ALL
Save all values as a vector.
@ SAVE_NONE
The switch is disabled.
@ SAVE_FIRST
Use only the first occurrence and ignore all previous.
boost::int64_t strtoll(const char *, char **, int)
Portable replacement for strtoll.
boost::uint64_t strtoull(const char *, char **, int)
Portable replacement for strtoull.
This namespace contains template functions that operate on the ROSE AST.
Position within a command-line.
bool operator!=(const Location &other) const
Inequality.
Location()
Constructs the location of the first character of the first string.
bool operator<=(const Location &other) const
Less than or equal.
size_t offset
Character offset within a program argument string.
bool operator<(const Location &other) const
Less than.
Location(size_t idx, size_t offset)
Constructs a location that points to a particular character of a particular string.
size_t idx
Index into some vector of program argument strings.
bool operator==(const Location &other) const
Equality.