]>
Commit | Line | Data |
---|---|---|
9f83044f VZ |
1 | /////////////////////////////////////////////////////////////////////////////// |
2 | // Name: wx/cmdline.h | |
3 | // Purpose: wxCmdLineParser and related classes for parsing the command | |
4 | // line options | |
5 | // Author: Vadim Zeitlin | |
6 | // Modified by: | |
7 | // Created: 04.01.00 | |
8 | // RCS-ID: $Id$ | |
9 | // Copyright: (c) 2000 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr> | |
65571936 | 10 | // Licence: wxWindows licence |
9f83044f VZ |
11 | /////////////////////////////////////////////////////////////////////////////// |
12 | ||
13 | #ifndef _WX_CMDLINE_H_ | |
14 | #define _WX_CMDLINE_H_ | |
15 | ||
2407b388 VZ |
16 | #include "wx/defs.h" |
17 | ||
df5168c4 MB |
18 | #include "wx/string.h" |
19 | #include "wx/arrstr.h" | |
20 | ||
ee0f5531 WS |
21 | #if wxUSE_CMDLINE_PARSER |
22 | ||
b5dbe15d | 23 | class WXDLLIMPEXP_FWD_BASE wxDateTime; |
9f83044f VZ |
24 | |
25 | // ---------------------------------------------------------------------------- | |
26 | // constants | |
27 | // ---------------------------------------------------------------------------- | |
28 | ||
29 | // by default, options are optional (sic) and each call to AddParam() allows | |
30 | // one more parameter - this may be changed by giving non-default flags to it | |
31 | enum | |
32 | { | |
33 | wxCMD_LINE_OPTION_MANDATORY = 0x01, // this option must be given | |
34 | wxCMD_LINE_PARAM_OPTIONAL = 0x02, // the parameter may be omitted | |
35 | wxCMD_LINE_PARAM_MULTIPLE = 0x04, // the parameter may be repeated | |
f6bcfd97 | 36 | wxCMD_LINE_OPTION_HELP = 0x08, // this option is a help request |
494a19d6 | 37 | wxCMD_LINE_NEEDS_SEPARATOR = 0x10 // must have sep before the value |
9f83044f VZ |
38 | }; |
39 | ||
40 | // an option value or parameter may be a string (the most common case), a | |
41 | // number or a date | |
42 | enum wxCmdLineParamType | |
43 | { | |
44 | wxCMD_LINE_VAL_STRING, // should be 0 (default) | |
45 | wxCMD_LINE_VAL_NUMBER, | |
46 | wxCMD_LINE_VAL_DATE, | |
47 | wxCMD_LINE_VAL_NONE | |
48 | }; | |
49 | ||
50 | // for constructing the cmd line description using Init() | |
51 | enum wxCmdLineEntryType | |
52 | { | |
53 | wxCMD_LINE_SWITCH, | |
54 | wxCMD_LINE_OPTION, | |
55 | wxCMD_LINE_PARAM, | |
56 | wxCMD_LINE_NONE // to terminate the list | |
57 | }; | |
58 | ||
59 | // ---------------------------------------------------------------------------- | |
60 | // wxCmdLineEntryDesc is a description of one command line | |
61 | // switch/option/parameter | |
62 | // ---------------------------------------------------------------------------- | |
63 | ||
64 | struct wxCmdLineEntryDesc | |
65 | { | |
66 | wxCmdLineEntryType kind; | |
fdbd123e VZ |
67 | const char *shortName; |
68 | const char *longName; | |
69 | wxString description; | |
9f83044f VZ |
70 | wxCmdLineParamType type; |
71 | int flags; | |
72 | }; | |
73 | ||
74 | // ---------------------------------------------------------------------------- | |
75 | // wxCmdLineParser is a class for parsing command line. | |
76 | // | |
77 | // It has the following features: | |
78 | // | |
79 | // 1. distinguishes options, switches and parameters; allows option grouping | |
80 | // 2. allows both short and long options | |
81 | // 3. automatically generates the usage message from the cmd line description | |
82 | // 4. does type checks on the options values (number, date, ...) | |
83 | // | |
84 | // To use it you should: | |
85 | // | |
86 | // 1. construct it giving it the cmd line to parse and optionally its desc | |
87 | // 2. construct the cmd line description using AddXXX() if not done in (1) | |
88 | // 3. call Parse() | |
89 | // 4. use GetXXX() to retrieve the parsed info | |
90 | // ---------------------------------------------------------------------------- | |
91 | ||
bddd7a8d | 92 | class WXDLLIMPEXP_BASE wxCmdLineParser |
9f83044f VZ |
93 | { |
94 | public: | |
95 | // ctors and initializers | |
96 | // ---------------------- | |
97 | ||
98 | // default ctor or ctor giving the cmd line in either Unix or Win form | |
99 | wxCmdLineParser() { Init(); } | |
ff1ce997 VZ |
100 | wxCmdLineParser(int argc, char **argv) { Init(); SetCmdLine(argc, argv); } |
101 | #if wxUSE_UNICODE | |
55b2b0d8 | 102 | wxCmdLineParser(int argc, wxChar **argv) { Init(); SetCmdLine(argc, argv); } |
ff1ce997 | 103 | #endif // wxUSE_UNICODE |
9f83044f VZ |
104 | wxCmdLineParser(const wxString& cmdline) { Init(); SetCmdLine(cmdline); } |
105 | ||
106 | // the same as above, but also gives the cmd line description - otherwise, | |
107 | // use AddXXX() later | |
108 | wxCmdLineParser(const wxCmdLineEntryDesc *desc) | |
109 | { Init(); SetDesc(desc); } | |
ff1ce997 VZ |
110 | wxCmdLineParser(const wxCmdLineEntryDesc *desc, int argc, char **argv) |
111 | { Init(); SetCmdLine(argc, argv); SetDesc(desc); } | |
112 | #if wxUSE_UNICODE | |
55b2b0d8 | 113 | wxCmdLineParser(const wxCmdLineEntryDesc *desc, int argc, wxChar **argv) |
9f83044f | 114 | { Init(); SetCmdLine(argc, argv); SetDesc(desc); } |
ff1ce997 | 115 | #endif // wxUSE_UNICODE |
9f83044f VZ |
116 | wxCmdLineParser(const wxCmdLineEntryDesc *desc, const wxString& cmdline) |
117 | { Init(); SetCmdLine(cmdline); SetDesc(desc); } | |
118 | ||
119 | // set cmd line to parse after using one of the ctors which don't do it | |
ff1ce997 VZ |
120 | void SetCmdLine(int argc, char **argv); |
121 | #if wxUSE_UNICODE | |
55b2b0d8 | 122 | void SetCmdLine(int argc, wxChar **argv); |
ff1ce997 | 123 | #endif // wxUSE_UNICODE |
9f83044f VZ |
124 | void SetCmdLine(const wxString& cmdline); |
125 | ||
126 | // not virtual, don't use this class polymorphically | |
127 | ~wxCmdLineParser(); | |
128 | ||
129 | // set different parser options | |
130 | // ---------------------------- | |
131 | ||
132 | // by default, '-' is switch char under Unix, '-' or '/' under Win: | |
133 | // switchChars contains all characters with which an option or switch may | |
134 | // start | |
135 | void SetSwitchChars(const wxString& switchChars); | |
136 | ||
137 | // long options are not POSIX-compliant, this option allows to disable them | |
68379eaf WS |
138 | void EnableLongOptions(bool enable = true); |
139 | void DisableLongOptions() { EnableLongOptions(false); } | |
9f83044f | 140 | |
250b589f JS |
141 | bool AreLongOptionsEnabled(); |
142 | ||
e612f101 VZ |
143 | // extra text may be shown by Usage() method if set by this function |
144 | void SetLogo(const wxString& logo); | |
145 | ||
9f83044f VZ |
146 | // construct the cmd line description |
147 | // ---------------------------------- | |
148 | ||
149 | // take the cmd line description from the wxCMD_LINE_NONE terminated table | |
150 | void SetDesc(const wxCmdLineEntryDesc *desc); | |
151 | ||
152 | // a switch: i.e. an option without value | |
153 | void AddSwitch(const wxString& name, const wxString& lng = wxEmptyString, | |
154 | const wxString& desc = wxEmptyString, | |
155 | int flags = 0); | |
156 | ||
157 | // an option taking a value of the given type | |
158 | void AddOption(const wxString& name, const wxString& lng = wxEmptyString, | |
159 | const wxString& desc = wxEmptyString, | |
160 | wxCmdLineParamType type = wxCMD_LINE_VAL_STRING, | |
161 | int flags = 0); | |
162 | ||
163 | // a parameter | |
164 | void AddParam(const wxString& desc = wxEmptyString, | |
165 | wxCmdLineParamType type = wxCMD_LINE_VAL_STRING, | |
166 | int flags = 0); | |
167 | ||
168 | // actions | |
169 | // ------- | |
170 | ||
171 | // parse the command line, return 0 if ok, -1 if "-h" or "--help" option | |
172 | // was encountered and the help message was given or a positive value if a | |
3103e8a9 | 173 | // syntax error occurred |
be03c0ec VZ |
174 | // |
175 | // if showUsage is true, Usage() is called in case of syntax error or if | |
176 | // help was requested | |
68379eaf | 177 | int Parse(bool showUsage = true); |
9f83044f VZ |
178 | |
179 | // give the usage message describing all program options | |
180 | void Usage(); | |
181 | ||
182 | // get the command line arguments | |
183 | // ------------------------------ | |
184 | ||
68379eaf | 185 | // returns true if the given switch was found |
9f83044f VZ |
186 | bool Found(const wxString& name) const; |
187 | ||
68379eaf | 188 | // returns true if an option taking a string value was found and stores the |
9f83044f VZ |
189 | // value in the provided pointer |
190 | bool Found(const wxString& name, wxString *value) const; | |
191 | ||
68379eaf | 192 | // returns true if an option taking an integer value was found and stores |
9f83044f VZ |
193 | // the value in the provided pointer |
194 | bool Found(const wxString& name, long *value) const; | |
195 | ||
e2b87f38 | 196 | #if wxUSE_DATETIME |
68379eaf | 197 | // returns true if an option taking a date value was found and stores the |
9f83044f VZ |
198 | // value in the provided pointer |
199 | bool Found(const wxString& name, wxDateTime *value) const; | |
e2b87f38 | 200 | #endif // wxUSE_DATETIME |
9f83044f VZ |
201 | |
202 | // gets the number of parameters found | |
203 | size_t GetParamCount() const; | |
204 | ||
205 | // gets the value of Nth parameter (as string only for now) | |
e612f101 | 206 | wxString GetParam(size_t n = 0u) const; |
9f83044f | 207 | |
31f6de22 VZ |
208 | // Resets switches and options |
209 | void Reset(); | |
210 | ||
211 | // break down the command line in arguments | |
86501081 | 212 | static wxArrayString ConvertStringToArgs(const wxString& cmdline); |
07d09af8 | 213 | |
9f83044f | 214 | private: |
74698d3a MB |
215 | // get usage string |
216 | wxString GetUsageString(); | |
217 | ||
9f83044f VZ |
218 | // common part of all ctors |
219 | void Init(); | |
220 | ||
221 | struct wxCmdLineParserData *m_data; | |
22f3361e VZ |
222 | |
223 | DECLARE_NO_COPY_CLASS(wxCmdLineParser) | |
9f83044f VZ |
224 | }; |
225 | ||
31f6de22 VZ |
226 | #else // !wxUSE_CMDLINE_PARSER |
227 | ||
228 | // this function is always available (even if !wxUSE_CMDLINE_PARSER) because it | |
229 | // is used by wxWin itself under Windows | |
bddd7a8d | 230 | class WXDLLIMPEXP_BASE wxCmdLineParser |
31f6de22 VZ |
231 | { |
232 | public: | |
86501081 | 233 | static wxArrayString ConvertStringToArgs(const wxString& cmdline); |
31f6de22 VZ |
234 | }; |
235 | ||
236 | #endif // wxUSE_CMDLINE_PARSER/!wxUSE_CMDLINE_PARSER | |
2407b388 | 237 | |
9f83044f | 238 | #endif // _WX_CMDLINE_H_ |
31f6de22 | 239 |