File: CommandArgs.h

package info (click to toggle)
devtodo 0.1.20%2Bgit20200830.0ad52b0-2
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 968 kB
  • sloc: ansic: 5,307; cpp: 3,908; perl: 112; sh: 106; makefile: 45; csh: 2
file content (109 lines) | stat: -rw-r--r-- 2,337 bytes parent folder | download | duplicates (10)
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 &copy) {}
		CommandArgs &operator = (CommandArgs const &copy) { return *this; }

		struct Arg {
			int shortarg;
			string longarg, help;
			int argument;
		};
		vector<Arg> args;
};
#endif