root/todo/trunk/util/CommandArgs.h

Revision 290, 2.3 kB (checked in by athomas, 4 years ago)

Initial import.

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