File: command_line.h

package info (click to toggle)
clanlib 1.0~svn3827-6
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 24,600 kB
  • sloc: cpp: 101,591; xml: 6,410; makefile: 1,743; ansic: 463; perl: 424; php: 247; sh: 53
file content (167 lines) | stat: -rw-r--r-- 5,137 bytes parent folder | download | duplicates (7)
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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
/*
**  ClanLib SDK
**  Copyright (c) 1997-2005 The ClanLib Team
**
**  This software is provided 'as-is', without any express or implied
**  warranty.  In no event will the authors be held liable for any damages
**  arising from the use of this software.
**
**  Permission is granted to anyone to use this software for any purpose,
**  including commercial applications, and to alter it and redistribute it
**  freely, subject to the following restrictions:
**
**  1. The origin of this software must not be misrepresented; you must not
**     claim that you wrote the original software. If you use this software
**     in a product, an acknowledgment in the product documentation would be
**     appreciated but is not required.
**  2. Altered source versions must be plainly marked as such, and must not be
**     misrepresented as being the original software.
**  3. This notice may not be removed or altered from any source distribution.
**
**  Note: Some of the libraries ClanLib may link to may have additional
**  requirements or restrictions.
**
**  File Author(s):
**
**    Magnus Norddahl
**    (if your name is missing here, please add it)
*/

//! clanCore="System"
//! header=core.h

#ifndef header_core_system_command_line
#define header_core_system_command_line

#ifdef CL_API_DLL
#ifdef CL_CORE_EXPORT
#define CL_API_CORE __declspec(dllexport)
#else
#define CL_API_CORE __declspec(dllimport)
#endif
#else
#define CL_API_CORE
#endif

#if _MSC_VER > 1000
#pragma once
#endif

#include <string>
#include <vector>

class CL_CommandLine_Generic;

//: Helper class to parse command line arguments
//- !group=Core/System!
//- !header=core.h!
//- <p>The CL_CommandLine class helps to parse command line arguments, namely
//- the argc/argv pair that you get from main(). CL_CommandLine mimics
//- getopt_long() behaviour as closely as possible, while providing a
//- cleaner interface and a few additional features, like automatic
//- generation of '--help' output. CL_CommandLine can parse long arguments
//- in the following styles:</p>
//-
//- <p>program --file FILENAME<br>
//- program --file=FILENAME</p>
//-
//- <p>Short arguments are handled like this:</p>
//-
//- <p>program -f FILENAME</p>
//-
//- <p>Concatenating short arguments is also supported, so that:</p>
//- 
//- <p>program -f -a -b FILENAME</p>
//-
//- <p>is equivalent to:</p>
//-
//- <p>program -fab FILENAME</p>
//-
//- <p>Non-option arguments (aka rest arguments) are supported as well:</p>
//-
//- <p>program SOMEFILE SOMEOTHERFILE ...</p>
//- 
//- <p>To avoid ambiguity when a filename starts with '-' CL_CommandLine stops
//- parsing arguments after the first encounter of a '--', so in</p>
//-
//- <p>program -f -b -- -f -b</p>
//-
//- <p>In the above example the first '-f -b' options are treated as
//- normal while the ones after the '--' are treated as rest arguments
//- (aka filenames in most programs).</p>
class CL_API_CORE CL_CommandLine
{
//! Construction:
public:
	CL_CommandLine();

	~CL_CommandLine();

//! Attributes:
public:
	enum
	{
		REST_ARG  = -2
	};

	//: Return the key of the current option
	int get_key();

	//: Return the argument to the current option
	std::string get_argument();

//! Operations:
public:
	//: Change the indention used for the help message, default is 18
	void set_help_indent(int i);

	//: Add a usage line to the help output, usage is for example
	//: "[OPTIONS]... FILE", the program name will get appended
	//: automatically
	void add_usage(const std::string& usage);

	//: Adds extra documentation to the help output, should only be
	//: used at the beginning or at the end, to
	void add_doc(const std::string& doc);
	
	//: Starts a new group of options, the grouptopic gets printed
	//: above the group of options in the print_help() output
	void add_group(const std::string& grouptopic);
  
	//: Adds a option to the parser
	//param key: a letter for a short-option or a numeric value
	//param key: larger than 255 that identifies the option
	//param long_option: the long name of this option or "" if non
	//param long_option: should be used for this option
	//param argument: the type of the argument that this option
	//param argument: requires (i.e. FILE, SIZE, WIDTH, etc.) or "" if no argument is
	//param argument: required
	//param help: the help string for this option
	//param visible: true if the option should be listed in the help
	//param visible: output, false will not list it in the help output which might
	//param visible: be usefull for cheat-options or backward-compability options
	//param visible: than would only clutter the help output
	void add_option(
		int key,
		const std::string& long_option, 
		const std::string& argument,
		const std::string& help,
		bool visible = true);
	
	//: Parse the options arcording to the options added with
	//: add_option(), result of the parsing is accessible via
	//: next() and get_key()/get_argument()
	void parse_args(int argc, char** argv);

	//: Print the help output, normaly done via a --help option
	void print_help();

	//: Goto the next option
	bool next();

//! Implementation:
private:
	CL_CommandLine_Generic* impl;
};

#endif