Enhanced C#
Language of your choice: library documentation
|
Contains global functions of Loyc.Utilities that don't belong in any specific class. More...
Contains global functions of Loyc.Utilities that don't belong in any specific class.
Static Public Member Functions | |
static void | ProcessCommandLineArguments (IList< string > args, ICollection< KeyValuePair< string, string >> options, string atFolder, IDictionary< char, string > shortOptions=null, InvertibleSet< string > twoArgOptions=null, int argLimit=0xFFFF, bool expandEnvVars=true, bool caseSensitiveLongOpts=false) |
Expands environment variables (e.g. TEMP%) and @files in a list of command-line arguments, and adds any options of the form "--opt" or "--opt=value" to a dictionary. More... | |
|
inlinestatic |
Expands environment variables (e.g. TEMP%) and @files in a list of command-line arguments, and adds any options of the form "--opt" or "--opt=value" to a dictionary.
args | The original arguments to process. |
options | Any long options (arguments that start with "--") will be added to this dictionary, and removed from args . This parameter cannot be null. By default, long options are not case sensitive. In that case, the user's option name is converted to lower case. |
Long options are expected to have the form –ID or –ID=value, where ID matches the regex "[a-zA-Z_0-9-]+". If there is no "=" or ":", that's okay too. For example, –Id{foo} is equivalent to –Id={foo}; both yield in the name-value pair ("id", "{foo}"). If there is no value (no equals or colon), the value associated with the option is null.
atFolder | If a parameter has the form @filename, the folder specified by atFolder will be searched for an options text file with the user-specified filename, and the contents of the file will be expanded into the list of arguments (split using SplitCommandLineArguments). The expanded list can contain new @filenames, which are also processed. To search in the current directory, use "". The @filename may use an absolute path, which overrides this folder. To disable @filename expansion, set this parameter to null. Whether the feature is enabled or disabled, @filenames are not removed from args , in case you want to be aware of the filenames afterward. |
shortOptions | A map from one-letter options that start with "-" rather than "--", to the name of the corresponding long option (this option can be null to ignore all short options.) For example, if this contains ('a', "all" ), and the input args contains "-a:foo", the pair ("all", "foo") will be added to options . If a value in this map is null, the key itself is used. Short options can be combined; for example -abc:foo is equivalent to -a -b -c:foo . Short options are always case-sensitive; to define an option that is not case sensitive, place two entries in the dictionary e.g. ('a', "all") and ('A', "all"). If the user specifies a short option letter that is not recognized, the entire command will be ignored and left in args. For example, if shortOptions contains only ('a', "all") but args contains "-ab=foo", the command is ignored and left in args . Rationale: -ab=foo might be a filename. |
On the other hand, if -a is a valid option then -a123
is also valid even when there is no option called '1'; the number "123" is treated as an argument to -a. Now, if '1' is a registered short option but '2' is not, then -a123
is equivalent to -a -1=23
.
twoArgOptions | A set of options in which the argument can be separated by a space from the option. For example, if the input is "--out foo.txt" and you want to recognize "foo.txt" as the argument to "--out", add the string "out" to this set. If you want to treat all options this way, use InvertibleSet{string}.All . Note: If the input is "--out:foo bar", "foo" is recognized as the argument to "--out" and "bar" is left alone, i.e. it is treated as unrelated. Short options participate automatically. For example if "-f" means "--foo", and twoArgOptions contains "foo", then "-f arg" is interpreted like "--foo=arg". |
The argument will not be treated as an argument if it starts with a dash, e.g. in –foo -*
, -*
will not be treated as an argument to –foo
, even if -*
is not a registered option.
argLimit | A limit placed on the number of arguments when expanding @files. Such a file may refer to itself, and this is the only protection provided against infinite recursive expansion. |
expandEnvVars | If true, environment variable references such as TEMP% are expanded by calling the standard method Environment.ExpandEnvironmentVariables. |
caseSensitiveLongOpts | If true, long options are case- sensitive. By default, long options are not case sensitive. |
Two types of options are recognized, short (-s) and long (–long), and only one argument is supported per option. The documentation is above.
You can choose whether to permit duplicate options or not. If you use a standard Dictionary<K,V> to hold the options, an exception will occur when this method calls Add() to add the duplicate. The exception is caught, the first ocurrance is kept, and a warning message is printed to MessageSink.Default.
To allow duplicates, store options in a different data structure such as List(KeyValuePair(string, string))
or BMultiMap(string,string)
.
DOS-style slash-options like /foo are not supported. Since Windows recognizes the forward slash as a path separator, forward-slash options can be recognized as paths. If you want to recognize them as options instead, you can preprocess the argument list, replacing every command that starts with "/" with a "--" command:
Globs (e.g. *.txt) are not recognized or expanded, but environment variables are expanded when expandEnvVars
is true.
Quote marks are not processed. An argument of "--a"
, with quote marks, is not recognized as an option (these quote marks should be removed before calling this method, e.g. G.SplitCommandLineArguments handles this.)
Referenced by LeMP.Compiler.ProcessArguments().