EPICS ARCHIVER V4
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator Friends Groups
ArgParser.h
1 // -------------- -*- c++ -*-
2 // $Id: ArgParser.h,v 1.3 2006/05/12 20:36:50 kasemir Exp $
3 //
4 // Please refer to NOTICE.txt,
5 // included as part of this distribution,
6 // for legal information.
7 //
8 // Kay-Uwe Kasemir, kasemir@lanl.gov
9 // --------------------------------------------------------
10 
11 #ifndef __ARGPARSER_H__
12 #define __ARGPARSER_H__
13 
14 #include "tools/ToolsConfig.h"
15 #include "tools/NoCopy.h"
16 
19 
20 class CmdArg;
21 
49 {
50 public:
51 
53  CmdArgParser(int argc, char const * const *argv);
54 
56  void addOption(CmdArg *option);
57 
59  void usage();
60 
62  void setHeader(const char *header);
63 
65  void setFooter(const char *footer);
66 
68  void setArgumentsInfo(const char *args_info);
69 
72  bool parse();
73 
75  const stdVector<const char *> &getArguments();
76 
78  const char *getArgument(size_t i);
79 
80 private:
81 
82  PROHIBIT_DEFAULT_COPY(CmdArgParser);
83  const char *_header;
84  const char *_footer;
85  const char *_args_info;
86  const char *_progname; // Name of Program
87  int _argc; // Original argc/argv minus _progname
88  char const * const *_argv;
89  stdList<CmdArg *> _options; // Available options
90  stdVector<const char *> _args; // remaining args
91 };
92 
97 class CmdArg
98 {
99 public:
105  CmdArg(CmdArgParser &args,
106  const char *option,
107  const char *arguments,
108  const char *description);
109  virtual ~CmdArg();
110 
111  // Rest is used internally
112 
115  size_t findMatches(const char *option) const;
116 
118  void usage_option() const;
119 
121  size_t option_size() const;
122 
124  void usage(size_t tab) const;
125 
131  virtual size_t parse(const char *arg) = 0;
132 
133 protected:
134 
135  PROHIBIT_DEFAULT_COPY(CmdArg);
136  const char *_option;
137  const char *_arguments;
138  const char *_description;
139 };
140 
142 class CmdArgFlag : public CmdArg
143 {
144 public:
146  CmdArgFlag(CmdArgParser &args,
147  const char *option, const char *description);
148 
150  operator bool() const;
151 
153  void set(bool value=true)
154  { _value = value; }
155 
156  virtual size_t parse(const char *arg);
157 
158 private:
159  bool _value;
160 };
161 
163 class CmdArgInt : public CmdArg
164 {
165 public:
171  CmdArgInt(CmdArgParser &args, const char *option,
172  const char *argument_name, const char *description);
173 
175  void set(int value);
176 
178  operator int() const;
179 
181  int get() const;
182 
183  virtual size_t parse(const char *arg);
184 
185 private:
186  int _value;
187 };
188 
190 class CmdArgDouble : public CmdArg
191 {
192 public:
194  CmdArgDouble(CmdArgParser &args, const char *option,
195  const char *argument_name, const char *description);
196 
198  void set(double value);
199 
201  operator double() const;
202 
203  virtual size_t parse(const char *arg);
204 private:
205  double _value;
206 };
207 
209 class CmdArgString : public CmdArg
210 {
211 public:
213  CmdArgString(CmdArgParser &args, const char *option,
214  const char *argument_name, const char *description);
215 
217  void set(const stdString &value);
218 
220  operator const stdString &() const;
221 
223  const stdString &get() const;
224 
226  bool isSet() const;
227 
228  virtual size_t parse(const char *arg);
229 
230 private:
231  stdString _value;
232 };
233 
235 
236 // inlines ----------------------------------------------
237 
238 inline void CmdArgParser::setHeader(const char *header)
239 { _header = header; }
240 
241 inline void CmdArgParser::setFooter(const char *footer)
242 { _footer = footer; }
243 
244 inline void CmdArgParser::setArgumentsInfo(const char *args_info)
245 { _args_info = args_info; }
246 
247 inline const stdVector<const char *> &CmdArgParser::getArguments()
248 { return _args; }
249 
250 inline const char *CmdArgParser::getArgument(size_t i)
251 { return _args[i]; }
252 
253 
254 inline CmdArgFlag::operator bool() const
255 { return _value; }
256 
257 inline void CmdArgInt::set(int value)
258 { _value = value; }
259 
260 inline CmdArgInt::operator int() const
261 { return _value; }
262 
263 inline int CmdArgInt::get() const
264 { return _value; }
265 
266 inline void CmdArgDouble::set(double value)
267 { _value = value; }
268 
269 inline CmdArgDouble::operator double() const
270 { return _value; }
271 
272 inline void CmdArgString::set(const stdString &value)
273 { _value = value; }
274 
275 inline CmdArgString::operator const stdString &() const
276 { return _value; }
277 
278 inline const stdString &CmdArgString::get() const
279 { return _value; }
280 
281 inline bool CmdArgString::isSet() const
282 { return _value.length() > 0; }
283 
284 
285 #endif // __ARGPARSER_H__
286 
int get() const
Get the value.
Definition: ArgParser.h:263
virtual size_t parse(const char *arg)=0
Parse arguments from current option.
void set(double value)
Set the default.
Definition: ArgParser.h:266
void set(const stdString &value)
Set the default.
Definition: ArgParser.h:272
CmdArgString(CmdArgParser &args, const char *option, const char *argument_name, const char *description)
void usage_option() const
Show info on option for command line.
Implements a string-typed argument.
Definition: ArgParser.h:209
Imlpement an integer-typed argument.
Definition: ArgParser.h:163
void usage()
Print out usage based on all registered CmdArgxxx classes.
virtual size_t parse(const char *arg)
Parse arguments from current option.
size_t option_size() const
Get string length of option w/o description.
Base class for all arguments.
Definition: ArgParser.h:97
virtual size_t parse(const char *arg)
Parse arguments from current option.
CmdArgDouble(CmdArgParser &args, const char *option, const char *argument_name, const char *description)
CmdArgInt(CmdArgParser &args, const char *option, const char *argument_name, const char *description)
Create the argument:
Implements a boolean argument.
Definition: ArgParser.h:142
void setArgumentsInfo(const char *args_info)
Description for remaining arguments (other than options)
Definition: ArgParser.h:244
void usage(size_t tab) const
Show option description.
size_t findMatches(const char *option) const
Called with option (minus &#39;-&#39;), determine how many characters match.
General purpose argument parser for command-line programs.
Definition: ArgParser.h:48
void addOption(CmdArg *option)
Add option.
virtual size_t parse(const char *arg)
Parse arguments from current option.
void setFooter(const char *footer)
Set additional footer text (default: nothing).
Definition: ArgParser.h:241
const char * getArgument(size_t i)
Get a single one of the remaining arguments.
Definition: ArgParser.h:250
CmdArgFlag(CmdArgParser &args, const char *option, const char *description)
Create optional boolean argument: option and description.
void set(bool value=true)
Set the default value.
Definition: ArgParser.h:153
const stdVector< const char * > & getArguments()
Remaining arguments (all that didn&#39;t start with &#39;-&#39;)
Definition: ArgParser.h:247
void set(int value)
Set the default.
Definition: ArgParser.h:257
CmdArg(CmdArgParser &args, const char *option, const char *arguments, const char *description)
All arguments follow this schema:
void setHeader(const char *header)
Set additional header text (default: nothing).
Definition: ArgParser.h:238
virtual size_t parse(const char *arg)
Parse arguments from current option.
bool parse()
Parse Arguments,.
Implements a double-typed argument.
Definition: ArgParser.h:190
const stdString & get() const
Get the value.
Definition: ArgParser.h:278
bool isSet() const
Was option provided?
Definition: ArgParser.h:281
CmdArgParser(int argc, char const *const *argv)
Initialize CmdArgParser with main&#39;s argc/argv.