xref: /trunk/main/shell/source/tools/lngconvex/cmdline.hxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1*cdf0e10cSrcweir #ifndef _CMDLINE_HXX_
2*cdf0e10cSrcweir #define _CMDLINE_HXX_
3*cdf0e10cSrcweir 
4*cdf0e10cSrcweir #include "defs.hxx"
5*cdf0e10cSrcweir 
6*cdf0e10cSrcweir //---------------------------------
7*cdf0e10cSrcweir /** Simple command line abstraction
8*cdf0e10cSrcweir */
9*cdf0e10cSrcweir 
10*cdf0e10cSrcweir class CommandLine
11*cdf0e10cSrcweir {
12*cdf0e10cSrcweir public:
13*cdf0e10cSrcweir 
14*cdf0e10cSrcweir     //################################
15*cdf0e10cSrcweir     // Creation
16*cdf0e10cSrcweir     //################################
17*cdf0e10cSrcweir 
18*cdf0e10cSrcweir 
19*cdf0e10cSrcweir     CommandLine(size_t argc, char* argv[], const std::string& ArgPrefix = std::string("-"));
20*cdf0e10cSrcweir 
21*cdf0e10cSrcweir 
22*cdf0e10cSrcweir     //################################
23*cdf0e10cSrcweir     // Query
24*cdf0e10cSrcweir     //################################
25*cdf0e10cSrcweir 
26*cdf0e10cSrcweir 
27*cdf0e10cSrcweir     /** Return the argument count
28*cdf0e10cSrcweir     */
29*cdf0e10cSrcweir     size_t get_arg_count() const;
30*cdf0e10cSrcweir 
31*cdf0e10cSrcweir     /** Return an argument by index
32*cdf0e10cSrcweir         This method doesn't skip argument
33*cdf0e10cSrcweir         names if any, so if the second
34*cdf0e10cSrcweir         argument is an argument name the
35*cdf0e10cSrcweir         function nevertheless returns it.
36*cdf0e10cSrcweir 
37*cdf0e10cSrcweir         @precond    0 <= Index < GetArgumentCount
38*cdf0e10cSrcweir 
39*cdf0e10cSrcweir         @throws std::out_of_range exception
40*cdf0e10cSrcweir         if the given index is to high
41*cdf0e10cSrcweir     */
42*cdf0e10cSrcweir     std::string get_arg(size_t Index) const;
43*cdf0e10cSrcweir 
44*cdf0e10cSrcweir     /** Returns all argument name found in the
45*cdf0e10cSrcweir         command line. An argument will be identified
46*cdf0e10cSrcweir         by a specified prefix. The standard prefix
47*cdf0e10cSrcweir         is '-'.
48*cdf0e10cSrcweir         If there are no argument names the returned
49*cdf0e10cSrcweir         container is empty.
50*cdf0e10cSrcweir     */
51*cdf0e10cSrcweir     StringListPtr_t get_arg_names() const;
52*cdf0e10cSrcweir 
53*cdf0e10cSrcweir     /** Returns an argument by name. If there are
54*cdf0e10cSrcweir         duplicate argument names in the command line,
55*cdf0e10cSrcweir         the first one wins.
56*cdf0e10cSrcweir         Argument name an the argument value must be separated
57*cdf0e10cSrcweir         by spaces. If the argument value starts with an
58*cdf0e10cSrcweir         argument prefix use quotes else the return value is
59*cdf0e10cSrcweir         an empty string because the value will be interpreted
60*cdf0e10cSrcweir         as the next argument name.
61*cdf0e10cSrcweir         If an argument value contains spaces use quotes.
62*cdf0e10cSrcweir 
63*cdf0e10cSrcweir         @precond    GetArgumentNames() -> has element ArgumentName
64*cdf0e10cSrcweir 
65*cdf0e10cSrcweir         @throws std::invalid_argument exception
66*cdf0e10cSrcweir         if the specified argument could not be
67*cdf0e10cSrcweir         found
68*cdf0e10cSrcweir     */
69*cdf0e10cSrcweir     std::string get_arg(const std::string& ArgumentName) const;
70*cdf0e10cSrcweir 
71*cdf0e10cSrcweir 
72*cdf0e10cSrcweir     //################################
73*cdf0e10cSrcweir     // Command
74*cdf0e10cSrcweir     //################################
75*cdf0e10cSrcweir 
76*cdf0e10cSrcweir 
77*cdf0e10cSrcweir     /** Set the prefix used to identify arguments in
78*cdf0e10cSrcweir         the command line.
79*cdf0e10cSrcweir 
80*cdf0e10cSrcweir         @precond    prefix is not empty
81*cdf0e10cSrcweir 
82*cdf0e10cSrcweir         @throws std::invalid_argument exception if
83*cdf0e10cSrcweir         the prefix is empty
84*cdf0e10cSrcweir     */
85*cdf0e10cSrcweir     void set_arg_prefix(const std::string& Prefix);
86*cdf0e10cSrcweir 
87*cdf0e10cSrcweir private:
88*cdf0e10cSrcweir 
89*cdf0e10cSrcweir     /** Returns whether a given argument is an argument name
90*cdf0e10cSrcweir     */
91*cdf0e10cSrcweir     bool is_arg_name(const std::string& Argument) const;
92*cdf0e10cSrcweir 
93*cdf0e10cSrcweir private:
94*cdf0e10cSrcweir     size_t      m_argc;
95*cdf0e10cSrcweir     char**      m_argv;
96*cdf0e10cSrcweir     std::string m_argprefix;
97*cdf0e10cSrcweir 
98*cdf0e10cSrcweir // prevent copy and assignment
99*cdf0e10cSrcweir private:
100*cdf0e10cSrcweir     CommandLine(const CommandLine&);
101*cdf0e10cSrcweir     CommandLine& operator=(const CommandLine&);
102*cdf0e10cSrcweir };
103*cdf0e10cSrcweir 
104*cdf0e10cSrcweir #endif
105