mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-02-02 17:26:17 +01:00
7b2ac3c82e
Signed-off-by: Philip Withnall <pwithnall@gnome.org> Helps: #3037
150 lines
5.3 KiB
Markdown
150 lines
5.3 KiB
Markdown
Title: Commandline Option Parser
|
|
|
|
# Commandline Option Parser
|
|
|
|
The GOption commandline parser is intended to be a simpler replacement
|
|
for the popt library. It supports short and long commandline options,
|
|
as shown in the following example:
|
|
|
|
testtreemodel -r 1 --max-size 20 --rand --display=:1.0 -vb -- file1 file2
|
|
|
|
The example demonstrates a number of features of the GOption commandline parser:
|
|
|
|
- Options can be single letters, prefixed by a single dash.
|
|
- Multiple short options can be grouped behind a single dash.
|
|
- Long options are prefixed by two consecutive dashes.
|
|
- Options can have an extra argument, which can be a number, a string or
|
|
a filename. For long options, the extra argument can be appended with
|
|
an equals sign after the option name, which is useful if the extra
|
|
argument starts with a dash, which would otherwise cause it to be
|
|
interpreted as another option.
|
|
- Non-option arguments are returned to the application as rest arguments.
|
|
- An argument consisting solely of two dashes turns off further parsing,
|
|
any remaining arguments (even those starting with a dash) are returned
|
|
to the application as rest arguments.
|
|
|
|
Another important feature of GOption is that it can automatically
|
|
generate nicely formatted help output. Unless it is explicitly turned
|
|
off with [method@GLib.OptionContext.set_help_enabled], GOption will recognize
|
|
the `--help`, `-?`, `--help-all` and `--help-groupname` options (where `groupname`
|
|
is the name of a [struct@GLib.OptionGroup]) and write a text similar to the one shown
|
|
in the following example to stdout.
|
|
|
|
Usage:
|
|
testtreemodel [OPTION...] - test tree model performance
|
|
|
|
Help Options:
|
|
-h, --help Show help options
|
|
--help-all Show all help options
|
|
--help-gtk Show GTK Options
|
|
|
|
Application Options:
|
|
-r, --repeats=N Average over N repetitions
|
|
-m, --max-size=M Test up to 2^M items
|
|
--display=DISPLAY X display to use
|
|
-v, --verbose Be verbose
|
|
-b, --beep Beep when done
|
|
--rand Randomize the data
|
|
|
|
GOption groups options in [struct@GLib.OptionGroup]s, which makes it easy to
|
|
incorporate options from multiple sources. The intended use for this is
|
|
to let applications collect option groups from the libraries it uses,
|
|
add them to their #GOptionContext, and parse all options by a single call
|
|
to [method@GLib.OptionContext.parse].
|
|
|
|
If an option is declared to be of type string or filename, GOption takes
|
|
care of converting it to the right encoding; strings are returned in UTF-8,
|
|
filenames are returned in the GLib filename encoding. Note that this only
|
|
works if `setlocale()` has been called before [method@GLib.OptionContext.parse]
|
|
|
|
Here is a complete example of setting up GOption to parse the example
|
|
commandline above and produce the example help output.
|
|
|
|
```c
|
|
static gint repeats = 2;
|
|
static gint max_size = 8;
|
|
static gboolean verbose = FALSE;
|
|
static gboolean beep = FALSE;
|
|
static gboolean randomize = FALSE;
|
|
|
|
static GOptionEntry entries[] =
|
|
{
|
|
{ "repeats", 'r', 0, G_OPTION_ARG_INT, &repeats, "Average over N repetitions", "N" },
|
|
{ "max-size", 'm', 0, G_OPTION_ARG_INT, &max_size, "Test up to 2^M items", "M" },
|
|
{ "verbose", 'v', 0, G_OPTION_ARG_NONE, &verbose, "Be verbose", NULL },
|
|
{ "beep", 'b', 0, G_OPTION_ARG_NONE, &beep, "Beep when done", NULL },
|
|
{ "rand", 0, 0, G_OPTION_ARG_NONE, &randomize, "Randomize the data", NULL },
|
|
G_OPTION_ENTRY_NULL
|
|
};
|
|
|
|
int
|
|
main (int argc, char *argv[])
|
|
{
|
|
GError *error = NULL;
|
|
GOptionContext *context;
|
|
|
|
context = g_option_context_new ("- test tree model performance");
|
|
g_option_context_add_main_entries (context, entries, GETTEXT_PACKAGE);
|
|
g_option_context_add_group (context, gtk_get_option_group (TRUE));
|
|
if (!g_option_context_parse (context, &argc, &argv, &error))
|
|
{
|
|
g_print ("option parsing failed: %s\n", error->message);
|
|
exit (1);
|
|
}
|
|
|
|
...
|
|
|
|
}
|
|
```
|
|
|
|
On UNIX systems, the argv that is passed to `main()` has no particular
|
|
encoding, even to the extent that different parts of it may have different
|
|
encodings. In general, normal arguments and flags will be in the current
|
|
locale and filenames should be considered to be opaque byte strings.
|
|
Proper use of `G_OPTION_ARG_FILENAME` vs `G_OPTION_ARG_STRING` is
|
|
therefore important.
|
|
|
|
Note that on Windows, filenames do have an encoding, but using
|
|
[struct@GLib.OptionContext] with the argv as passed to `main()` will result
|
|
in a program that can only accept commandline arguments with characters
|
|
from the system codepage.This can cause problems when attempting to
|
|
deal with filenames containing Unicode characters that fall outside
|
|
of the codepage.
|
|
|
|
A solution to this is to use `g_win32_get_command_line()` and
|
|
[method@GLib.OptionContext.parse_strv] which will properly handle full
|
|
Unicode filenames. If you are using #GApplication, this is done
|
|
automatically for you.
|
|
|
|
The following example shows how you can use #GOptionContext directly
|
|
in order to correctly deal with Unicode filenames on Windows:
|
|
|
|
```c
|
|
int
|
|
main (int argc, char **argv)
|
|
{
|
|
GError *error = NULL;
|
|
GOptionContext *context;
|
|
gchar **args;
|
|
|
|
#ifdef G_OS_WIN32
|
|
args = g_win32_get_command_line ();
|
|
#else
|
|
args = g_strdupv (argv);
|
|
#endif
|
|
|
|
// set up context
|
|
|
|
if (!g_option_context_parse_strv (context, &args, &error))
|
|
{
|
|
// error happened
|
|
}
|
|
|
|
...
|
|
|
|
g_strfreev (args);
|
|
|
|
...
|
|
}
|
|
```
|