| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580 |
- /////////////////////////////////////////////////////////////////////////////
- // Name: cmdline.h
- // Purpose: interface of wxCmdLineParser
- // Author: wxWidgets team
- // Licence: wxWindows licence
- /////////////////////////////////////////////////////////////////////////////
- /**
- wxCmdLineEntryDesc::flags field is a combination of these bit masks.
- Notice that by default (i.e. if flags are just 0), options are optional
- (sic) and each call to wxCmdLineParser::AddParam() allows one more
- parameter - this may be changed by giving non-default flags to it, i.e. use
- @c wxCMD_LINE_OPTION_MANDATORY to require that the option is given and
- @c wxCMD_LINE_PARAM_OPTIONAL to make a parameter optional.
-
- Also, @c wxCMD_LINE_PARAM_MULTIPLE may be specified if the programs accepts a
- variable number of parameters - but it only can be given for the last
- parameter in the command line description. If you use this flag, you will
- probably need to use wxCmdLineEntryDesc::GetParamCount() to retrieve the
- number of parameters effectively specified after calling
- wxCmdLineEntryDesc::Parse().
- @c wxCMD_LINE_NEEDS_SEPARATOR can be specified to require a separator (either
- a colon, an equal sign or white space) between the option name and its
- value. By default, no separator is required.
- @c wxCMD_LINE_SWITCH_NEGATABLE can be specified if you want to allow the
- user to specify the switch in both normal form and in negated one (e.g.
- /R-). You will need to use wxCmdLineParser::FoundSwitch() to distinguish
- between the normal and negated forms of the switch. This flag is new since
- wxWidgets 2.9.2.
- */
- enum wxCmdLineEntryFlags
- {
- wxCMD_LINE_OPTION_MANDATORY = 0x01, ///< This option must be given.
- wxCMD_LINE_PARAM_OPTIONAL = 0x02, ///< The parameter may be omitted.
- wxCMD_LINE_PARAM_MULTIPLE = 0x04, ///< The parameter may be repeated.
- wxCMD_LINE_OPTION_HELP = 0x08, ///< This option is a help request.
- wxCMD_LINE_NEEDS_SEPARATOR = 0x10, ///< Must have a separator before the value.
- wxCMD_LINE_SWITCH_NEGATABLE = 0x20 ///< This switch can be negated (e.g. /S-)
- };
- /**
- The possible values of wxCmdLineEntryDesc::type which specify the type of
- the value accepted by an option.
- */
- enum wxCmdLineParamType
- {
- wxCMD_LINE_VAL_STRING,
- wxCMD_LINE_VAL_NUMBER,
- wxCMD_LINE_VAL_DATE,
- wxCMD_LINE_VAL_DOUBLE,
- wxCMD_LINE_VAL_NONE
- };
- /**
- The type of a command line entity used for wxCmdLineEntryDesc::kind.
- */
- enum wxCmdLineEntryType
- {
- /// A boolean argument of the program; e.g. @c -v to enable verbose mode.
- wxCMD_LINE_SWITCH,
-
- /// An argument with an associated value; e.g. @c "-o filename" to specify
- /// an optional output filename.
- wxCMD_LINE_OPTION,
-
- /// A parameter: a required program argument.
- wxCMD_LINE_PARAM,
-
- /// Additional usage text. See wxCmdLineParser::AddUsageText.
- wxCMD_LINE_USAGE_TEXT,
-
- wxCMD_LINE_NONE ///< Use this to terminate the list.
- };
- /**
- The state of a switch as returned by wxCmdLineParser::FoundSwitch().
- @since 2.9.2
- */
- enum wxCmdLineSwitchState
- {
- /// The switch was found in negated form, i.e. followed by a '-'.
- wxCMD_SWITCH_OFF,
- /// The switch was not found at all on the command line.
- wxCMD_SWITCH_NOT_FOUND
- /// The switch was found (and was not negated)
- wxCMD_SWITCH_ON
- };
- /**
- Flags determining wxCmdLineParser::ConvertStringToArgs() behaviour.
- */
- enum wxCmdLineSplitType
- {
- wxCMD_LINE_SPLIT_DOS,
- wxCMD_LINE_SPLIT_UNIX
- };
- /**
- The structure wxCmdLineEntryDesc is used to describe a command line
- switch, option or parameter. An array of such structures should be passed
- to wxCmdLineParser::SetDesc().
- Note that the meanings of parameters of the wxCmdLineParser::AddXXX() functions
- are the same as of the corresponding fields in this structure.
- */
- struct wxCmdLineEntryDesc
- {
- /**
- The kind of this program argument.
- See ::wxCmdLineEntryType for more info.
- */
- wxCmdLineEntryType kind;
- /**
- The usual, short, name of the switch or the option.
-
- It may contain only letters, digits and the underscores.
- This field is unused if <tt>kind == wxCMD_LINE_PARAM</tt>.
- */
- const char *shortName;
- /**
- The long name for this program argument (may be empty if the option
- has no long name).
-
- It may contain only letters, digits and the underscores.
- This field is unused if <tt>kind == wxCMD_LINE_PARAM</tt>.
- */
- const char *longName;
- /**
- This description is used by the wxCmdLineParser::Usage() method to
- construct a help message explaining the syntax of the program.
- */
- const char *description;
- /**
- The type associated with this option (ignored if <tt>kind != wxCMD_LINE_OPTION</tt>).
- See ::wxCmdLineParamType for more info.
- */
- wxCmdLineParamType type;
-
- /**
- A combination of one or more ::wxCmdLineEntryFlags enum values.
- */
- int flags;
- };
- /**
- @class wxCmdLineParser
- wxCmdLineParser is a class for parsing the command line.
- It has the following features:
- - distinguishes options, switches and parameters
- - allows option grouping
- - allows both short and long options
- - automatically generates the usage message from the command line description
- - checks types of the options values (number, date, ...).
- To use it you should follow these steps:
- -# @ref cmdlineparser_construction "Construct" an object of this class
- giving it the command line to parse and optionally its description or
- use the @c AddXXX() functions later.
- -# Call Parse().
- -# Use Found() to retrieve the results.
- You can also use wxApp's default command line processing just overriding
- wxAppConsole::OnInitCmdLine() and wxAppConsole::OnCmdLineParsed().
- In the documentation below the following terminology is used:
- - @b switch: a boolean option which can be given or not, but which doesn't have
- any value. We use the word @e switch to distinguish
- such boolean options from more generic options like those
- described below. For example, @c "-v" might be a switch
- meaning "enable verbose mode".
- - @b option: a switch with a value associated to it.
- For example, @c "-o filename" might be an
- option for specifying the name of the output file.
- - @b parameter: a required program argument.
- @section cmdlineparser_construction Construction
- Before Parse() can be called, the command line parser object must have the
- command line to parse and also the rules saying which switches, options and
- parameters are valid - this is called command line description in what
- follows.
- You have complete freedom of choice as to when specify the required
- information, the only restriction is that it must be done before calling
- Parse().
- To specify the command line to parse you may use either one of constructors
- accepting it (wxCmdLineParser(int, char**) or
- wxCmdLineParser(const wxString&) usually) or, if you use the default
- constructor, you can do it later by calling SetCmdLine().
- The same holds for command line description: it can be specified either in
- the constructor (with or without the command line itself) or constructed
- later using either SetDesc() or combination of AddSwitch(), AddOption(),
- AddParam() and AddUsageText() methods.
- Using constructors or SetDesc() uses a (usually const static) table
- containing the command line description. If you want to decide which
- options to accept during the run-time, using one of the AddXXX() functions
- above might be preferable.
- @section cmdlineparser_customization Customization
- wxCmdLineParser has several global options which may be changed by the
- application. All of the functions described in this section should be
- called before Parse().
- First global option is the support for long (also known as GNU-style)
- options. The long options are the ones which start with two dashes and look
- like "\--verbose", i.e. they generally are complete words and not some
- abbreviations of them. As long options are used by more and more
- applications, they are enabled by default, but may be disabled with
- DisableLongOptions().
- Another global option is the set of characters which may be used to start
- an option (otherwise, the word on the command line is assumed to be a
- parameter). Under Unix, @c "-" is always used, but Windows has at least two
- common choices for this: @c "-" and @c "/". Some programs also use "+". The
- default is to use what suits most the current platform, but may be changed
- with SetSwitchChars() method.
- Finally, SetLogo() can be used to show some application-specific text
- before the explanation given by Usage() function.
- @section cmdlineparser_parsing Parsing the Command Line
- After the command line description was constructed and the desired options
- were set, you can finally call Parse() method. It returns 0 if the command
- line was correct and was parsed, -1 if the help option was specified (this
- is a separate case as, normally, the program will terminate after this) or
- a positive number if there was an error during the command line parsing.
- In the latter case, the appropriate error message and usage information are
- logged by wxCmdLineParser itself using the standard wxWidgets logging
- functions.
- @section cmdlineparser_results Getting Results
- After calling Parse() (and if it returned 0), you may access the results of
- parsing using one of overloaded Found() methods.
- For a simple switch, you will simply call Found to determine if the switch
- was given or not, for an option or a parameter, you will call a version of
- Found() which also returns the associated value in the provided variable.
- All Found() functions return true if the switch or option were found in the
- command line or false if they were not specified.
- @library{wxbase}
- @category{appmanagement}
- @see wxApp::argc, wxApp::argv, @ref page_samples_console
- */
- class wxCmdLineParser
- {
- public:
- /**
- Default constructor, you must use SetCmdLine() later.
- */
- wxCmdLineParser();
- /**
- Constructor which specifies the command line to parse. This is the
- traditional (Unix) command line format. The parameters @a argc and
- @a argv have the same meaning as the typical @c main() function.
- This constructor is available in both ANSI and Unicode modes because under
- some platforms the command line arguments are passed as ASCII strings
- even to Unicode programs.
- */
- wxCmdLineParser(int argc, char** argv);
- /**
- Constructor which specifies the command line to parse.
- This is the traditional (Unix) command line format.
- The parameters @a argc and @a argv have the same meaning as the typical
- @c main() function.
- This constructor is only available in Unicode build.
- */
- wxCmdLineParser(int argc, wchar_t** argv);
- /**
- Constructor which specify the command line to parse in Windows format.
- The parameter cmdline has the same meaning as the corresponding
- parameter of @c WinMain().
- */
- wxCmdLineParser(const wxString& cmdline);
- /**
- Specifies the @ref SetDesc() "command line description" but not the
- command line. You must use SetCmdLine() later.
- */
- wxCmdLineParser(const wxCmdLineEntryDesc* desc);
- /**
- Specifies both the command line (in Unix format) and the
- @ref SetDesc() "command line description".
- */
- wxCmdLineParser(const wxCmdLineEntryDesc* desc, int argc, char** argv);
- /**
- Specifies both the command line (in Windows format) and the
- @ref SetDesc() "command line description".
- */
- wxCmdLineParser(const wxCmdLineEntryDesc* desc,
- const wxString& cmdline);
- /**
- Frees resources allocated by the object.
- @note This destructor is not virtual, don't use this class
- polymorphically.
- */
- ~wxCmdLineParser();
- /**
- Adds an option with only long form.
- This is just a convenient wrapper for AddOption() passing an empty
- string as short option name.
- @since 2.9.3
- */
- void AddLongOption(const wxString& lng,
- const wxString& desc = wxEmptyString,
- wxCmdLineParamType type = wxCMD_LINE_VAL_STRING,
- int flags = 0);
- /**
- Adds a switch with only long form.
- This is just a convenient wrapper for AddSwitch() passing an empty
- string as short switch name.
- @since 2.9.3
- */
- void AddLongSwitch(const wxString& lng,
- const wxString& desc = wxEmptyString,
- int flags = 0);
- /**
- Add an option @a name with an optional long name @a lng (no long name
- if it is empty, which is default) taking a value of the given type
- (string by default) to the command line description.
- */
- void AddOption(const wxString& name,
- const wxString& lng = wxEmptyString,
- const wxString& desc = wxEmptyString,
- wxCmdLineParamType type = wxCMD_LINE_VAL_STRING,
- int flags = 0);
- /**
- Add a parameter of the given @a type to the command line description.
- */
- void AddParam(const wxString& desc = wxEmptyString,
- wxCmdLineParamType type = wxCMD_LINE_VAL_STRING,
- int flags = 0);
- /**
- Add a switch @a name with an optional long name @a lng (no long name if
- it is empty, which is default), description @a desc and flags @a flags
- to the command line description.
- */
- void AddSwitch(const wxString& name,
- const wxString& lng = wxEmptyString,
- const wxString& desc = wxEmptyString,
- int flags = 0);
- /**
- Add a string @a text to the command line description shown by Usage().
- @since 2.9.0
- */
- void AddUsageText(const wxString& text);
- /**
- Returns @true if long options are enabled, otherwise @false.
- @see EnableLongOptions()
- */
- bool AreLongOptionsEnabled() const;
- /**
- Breaks down the string containing the full command line in words.
- Words are separated by whitespace and double quotes can be used to
- preserve the spaces inside the words.
- By default, this function uses Windows-like word splitting algorithm,
- i.e. single quotes have no special meaning and backslash can't be used
- to escape spaces neither. With @c wxCMD_LINE_SPLIT_UNIX flag Unix
- semantics is used, i.e. both single and double quotes can be used and
- backslash can be used to escape all the other special characters.
- */
- static wxArrayString
- ConvertStringToArgs(const wxString& cmdline,
- wxCmdLineSplitType flags = wxCMD_LINE_SPLIT_DOS);
- /**
- Identical to EnableLongOptions(@false).
- */
- void DisableLongOptions();
- /**
- Enable or disable support for the long options.
- As long options are not (yet) POSIX-compliant, this option allows to
- disable them.
- @see @ref cmdlineparser_customization and AreLongOptionsEnabled()
- */
- void EnableLongOptions(bool enable = true);
- /**
- Returns @true if the given switch was found, @false otherwise.
- */
- bool Found(const wxString& name) const;
- /**
- Returns whether the switch was found on the command line and whether it
- was negated.
- This method can be used for any kind of switch but is especially useful
- for switches that can be negated, i.e. were added with
- wxCMD_LINE_SWITCH_NEGATABLE flag, as otherwise Found() is simpler to
- use.
- However Found() doesn't allow to distinguish between switch specified
- normally, i.e. without dash following it, and negated switch, i.e. with
- the following dash. This method will return @c wxCMD_SWITCH_ON or @c
- wxCMD_SWITCH_OFF depending on whether the switch was negated or not.
- And if the switch was not found at all, @c wxCMD_SWITCH_NOT_FOUND is
- returned.
- @since 2.9.2
- */
- wxCmdLineSwitchState FoundSwitch(const wxString& name) const;
- /**
- Returns true if an option taking a string value was found and stores
- the value in the provided pointer (which should not be @NULL).
- */
- bool Found(const wxString& name, wxString* value) const;
- /**
- Returns @true if an option taking an integer value was found and stores
- the value in the provided pointer (which should not be @NULL).
- */
- bool Found(const wxString& name, long* value) const;
- /**
- Returns @true if an option taking a float value was found and stores
- the value in the provided pointer (which should not be @NULL).
- */
- bool Found(const wxString& name, double* value) const;
- /**
- Returns @true if an option taking a date value was found and stores the
- value in the provided pointer (which should not be @NULL).
- */
- bool Found(const wxString& name, wxDateTime* value) const;
- /**
- Returns the value of Nth parameter (as string only).
- */
- wxString GetParam(size_t n = 0) const;
- /**
- Returns the number of parameters found. This function makes sense
- mostly if you had used @c wxCMD_LINE_PARAM_MULTIPLE flag.
- */
- size_t GetParamCount() const;
- /**
- Parse the command line, return 0 if ok, -1 if @c "-h" or @c "\--help"
- option was encountered and the help message was given or a positive
- value if a syntax error occurred.
- @param giveUsage
- If @true (default), the usage message is given if a syntax error
- was encountered while parsing the command line or if help was
- requested. If @false, only error messages about possible syntax
- errors are given, use Usage to show the usage message from the
- caller if needed.
- */
- int Parse(bool giveUsage = true);
- //@{
- /**
- Set the command line to parse after using one of the constructors which
- don't do it.
- */
- void SetCmdLine(int argc, char** argv);
- void SetCmdLine(int argc, wchar_t** argv);
- void SetCmdLine(const wxString& cmdline);
- //@}
- /**
- Constructs the command line description.
- Take the command line description from the wxCMD_LINE_NONE terminated
- table.
- Example of usage:
- @code
- static const wxCmdLineEntryDesc cmdLineDesc[] =
- {
- { wxCMD_LINE_SWITCH, "v", "verbose", "be verbose" },
- { wxCMD_LINE_SWITCH, "q", "quiet", "be quiet" },
- { wxCMD_LINE_OPTION, "o", "output", "output file" },
- { wxCMD_LINE_OPTION, "i", "input", "input dir" },
- { wxCMD_LINE_OPTION, "s", "size", "output block size", wxCMD_LINE_VAL_NUMBER },
- { wxCMD_LINE_OPTION, "d", "date", "output file date", wxCMD_LINE_VAL_DATE },
- { wxCMD_LINE_PARAM, NULL, NULL, "input file", wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_MULTIPLE },
- { wxCMD_LINE_NONE }
- };
- wxCmdLineParser parser;
- parser.SetDesc(cmdLineDesc);
- @endcode
- */
- void SetDesc(const wxCmdLineEntryDesc* desc);
- /**
- The @a logo is some extra text which will be shown by Usage() method.
- */
- void SetLogo(const wxString& logo);
- /**
- @a switchChars contains all characters with which an option or switch
- may start. Default is @c "-" for Unix, @c "-/" for Windows.
- */
- void SetSwitchChars(const wxString& switchChars);
- /**
- Give the standard usage message describing all program options. It will
- use the options and parameters descriptions specified earlier, so the
- resulting message will not be helpful to the user unless the
- descriptions were indeed specified.
- @see SetLogo()
- */
- void Usage() const;
- /**
- Return the string containing the program usage description.
- Call Usage() to directly show this string to the user.
- */
- wxString GetUsageString() const;
- };
|