1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
|
#ifndef CRASH_COMMANDARGS
#define CRASH_COMMANDARGS
#include <stdexcept>
#include <string>
#include <vector>
#include <iostream>
#include <cassert>
#include "Strings.h"
using namespace std;
/*
CommandArgs is a class to parse command line arguments.
04/02/01 Initial creation
*/
class CommandArgs {
public :
class exception : public runtime_error { public : exception(string const &what) : runtime_error(what.c_str()) {} };
enum Parameter {
None,
Required,
Optional
};
CommandArgs();
~CommandArgs();
void addArgument(int shortarg, string const &longarg = "", Parameter parameter = None, string const &help = "");
void setHelp(int shortarg, string const &help);
void displayHelp(ostream &out, int termwidth = 80);
class iterator {
public :
enum Type {
Argument,
Unknown
};
iterator() :
cmdarg(0), inshort(0), _type(Unknown), value(0),
arg(0), argc(0), _argument(-1), argv(0) {}
int operator == (iterator const &other) const {
return argv == other.argv && argc == other.argc;
}
iterator operator ++ () {
if (!get()) {
argc = -1;
argv = 0;
}
return *this;
}
iterator operator ++ (int) {
iterator j = *this;
if (!get()) {
argc = -1;
argv = 0;
}
return j;
}
Type type() { return _type; }
int option() const { return _argument; }
string const &longOption() const;
char const *parameter() const { return value; }
private :
iterator(CommandArgs *cmdarg, int argc, char const **argv) :
cmdarg(cmdarg), inshort(0), _type(Unknown), value(0),
arg(0), argc(argc), _argument(-1), argv(argv) { get(); }
bool get();
CommandArgs *cmdarg;
int inshort;
Type _type;
char const *value;
int arg, argc, _argument;
char const **argv;
friend class CommandArgs;
};
iterator begin(int argc, char const **argv) {
return iterator(this, argc - 1, argv + 1);
}
iterator end() {
return iterator(this, -1, 0);
}
private :
friend class iterator;
// Private, so object can't be default copied.
CommandArgs(CommandArgs const ©) {}
CommandArgs &operator = (CommandArgs const ©) { return *this; }
struct Arg {
int shortarg;
string longarg, help;
int argument;
};
vector<Arg> args;
};
#endif
|