<!-- ##### SECTION Title ##### -->
Commandline option parser

<!-- ##### SECTION Short_Description ##### -->
parses commandline options

<!-- ##### SECTION Long_Description ##### -->
<para>
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:
</para>

<para>
<literal>testtreemodel -r 1 --max-size 20 --rand --display=:1.0 -vb -- file1 file2</literal>
</para>

<para>
The example demonstrates a number of features of the GOption commandline parser
<itemizedlist>
<listitem><para>
  Options can be single letters, prefixed by a single dash. Multiple
  short options can be grouped behind a single dash.
</para></listitem>
<listitem><para>
  Long options are prefixed by two consecutive dashes.
</para></listitem>
<listitem><para>
  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.
</para></listitem>
<listitem><para>
  Non-option arguments are returned to the application as rest arguments.
</para></listitem>
<listitem><para>
  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.
</para></listitem>
</itemizedlist>
</para>

<para>
Another important feature of GOption is that it can automatically generate nicely
formatted help output. Unless it is explicitly turned off with 
g_option_context_set_help_enabled(), GOption will recognize the 
<option>--help</option>, <option>-?</option>, <option>--help-all</option>
and <option>--help-</option><replaceable>groupname</replaceable> options 
(where <replaceable>groupname</replaceable> is the name of a #GOptionGroup) 
and write a text similar to the one shown in the following example to stdout.
</para>

<informalexample><screen>
Usage:
  testtreemodel [OPTION...] - test tree model performance

Help Options:
  -?, --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
</screen></informalexample>

<para>
GOption groups options in #GOptionGroup<!-- -->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 g_option_context_parse(). See gtk_get_option_group() for an example.
</para>

<para>
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.
</para>

<para>
Here is a complete example of setting up GOption to parse the example
commandline above and produce the example help output.
</para>
<informalexample><programlisting>
static gint repeats = 2;
static gint max_size = 8;
static gboolean verbose = FALSE;
static gboolean beep = FALSE;
static gboolean rand = FALSE;

static GOptionEntry entries[] = 
{
  { "repeats", 'r', 0, G_OPTION_ARG_INT, &amp;repeats, "Average over N repetitions", "N" },
  { "max-size", 'm', 0, G_OPTION_ARG_INT, &amp;max_size, "Test up to 2^M items", "M" },
  { "verbose", 'v', 0, G_OPTION_ARG_NONE, &amp;verbose, "Be verbose", NULL },
  { "beep", 'b', 0, G_OPTION_ARG_NONE, &amp;beep, "Beep when done", NULL },
  { "rand", 0, 0, G_OPTION_ARG_NONE, &amp;rand, "Randomize the data", NULL },
  { NULL }
};

int 
main (int argc, char *argv[])
{
  GError *error = NULL;

  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));
  g_option_context_parse (context, &amp;argc, &amp;argv, &amp;error);
  
  /* ... */

}
</programlisting></informalexample>

<!-- ##### SECTION See_Also ##### -->
<para>

</para>

<!-- ##### ENUM GOptionError ##### -->
<para>
Error codes returned by option parsing.
</para>

@G_OPTION_ERROR_UNKNOWN_OPTION: An option was not known to the parser.
  This error will only be reported, if the parser hasn't been instructed
  to ignore unknown options, see g_option_context_set_ignore_unknown_options().
@G_OPTION_ERROR_BAD_VALUE: A value couldn't be parsed.
@G_OPTION_ERROR_FAILED: A #GOptionArgFunc callback failed.

<!-- ##### MACRO G_OPTION_ERROR ##### -->
<para>
Error domain for option parsing. Errors in this domain will
be from the #GOptionError enumeration. See #GError for information on 
error domains.
</para>



<!-- ##### USER_FUNCTION GOptionArgFunc ##### -->
<para>
The type of function to be passed as callback for %G_OPTION_ARG_CALLBACK
options.
</para>

@option_name: The name of the option being parsed. This will be either a 
  single dash followed by a single letter (for a short name) or two dashes
  followed by a long option name.
@value: The value to be parsed.
@data: User data added to the #GOptionGroup containing the option when it
  was created with g_option_group_new()
@error: A return location for errors. The error code %G_OPTION_ERROR_FAILED
  is intended to be used for errors in #GOptionArgFunc callbacks.
@Returns: %TRUE if the option was successfully parsed, %FALSE if an error 
  occurred


<!-- ##### STRUCT GOptionContext ##### -->
<para>
A <structname>GOptionContext</structname> struct defines which options
are accepted by the commandline option parser. The struct has only private 
fields and should not be directly accessed.
</para>


<!-- ##### FUNCTION g_option_context_new ##### -->
<para>

</para>

@parameter_string: 
@Returns: 


<!-- ##### FUNCTION g_option_context_free ##### -->
<para>

</para>

@context: 


<!-- ##### FUNCTION g_option_context_parse ##### -->
<para>

</para>

@context: 
@argc: 
@argv: 
@error: 
@Returns: 


<!-- ##### FUNCTION g_option_context_set_help_enabled ##### -->
<para>

</para>

@context: 
@help_enabled: 


<!-- ##### FUNCTION g_option_context_get_help_enabled ##### -->
<para>

</para>

@context: 
@Returns: 


<!-- ##### FUNCTION g_option_context_set_ignore_unknown_options ##### -->
<para>

</para>

@context: 
@ignore_unknown: 


<!-- ##### FUNCTION g_option_context_get_ignore_unknown_options ##### -->
<para>

</para>

@context: 
@Returns: 


<!-- ##### ENUM GOptionArg ##### -->
<para>
The #GOptionArg enum values determine which type of extra argument the
options expect to find. If an option expects an extra argument, it
can be specified in several ways; with a short option:
<option>-x arg</option>, with a long option: <option>--name arg</option>
or combined in a single argument: <option>--name=arg</option>.
</para>

@G_OPTION_ARG_NONE: No extra argument. This is useful for simple flags.
@G_OPTION_ARG_STRING: The option takes a string argument.
@G_OPTION_ARG_INT: The option takes an integer argument.
@G_OPTION_ARG_CALLBACK: The option provides a callback to parse the
  extra argument.
@G_OPTION_ARG_FILENAME: The option takes a filename as argument.
@G_OPTION_ARG_STRING_ARRAY: The option takes a string argument, multiple
  uses of the option are collected into an array of strings.
@G_OPTION_ARG_FILENAME_ARRAY: The option takes a filename as argument, 
  multiple uses of the option are collected into an array of strings.

<!-- ##### ENUM GOptionFlags ##### -->
<para>
Flags which modify individual options.
</para>

@G_OPTION_FLAG_HIDDEN: The option doesn't appear in <option>--help</option>
   output.
@G_OPTION_FLAG_IN_MAIN: The option appears in the main section of the
   <option>--help</option> output, even if it is defined in a group.
@G_OPTION_FLAG_REVERSE: For options of the G_OPTION_ARG_NONE kind, this flag
   indicates that the sense of the option is reversed.

<!-- ##### MACRO G_OPTION_REMAINING ##### -->
<para>
If a long option in the main group has this name, it is not treated as a 
regular option. Instead it collects all non-option arguments which would
otherwise be left in <literal>argv</literal>. The option must be of type
%G_OPTION_ARG_STRING_ARRAY or %G_OPTION_ARG_FILENAME_ARRAY.
</para>

<para>
Using #G_OPTION_REMAINING instead of simply scanning <literal>argv</literal>
for leftover arguments has the advantage that GOption takes care of 
necessary encoding conversions for strings or filenames.
</para>

@Since: 2.6


<!-- ##### STRUCT GOptionEntry ##### -->
<para>
A <structname>GOptionEntry</structname> defines a single option.
To have an effect, they must be added to a #GOptionGroup with
g_option_context_add_main_entries() or g_option_group_add_entries().
</para>

@long_name: The long name of an option can be used to specify it
  in a commandline as --<replaceable>long_name</replaceable>. Every
  option must have a long name. To resolve conflicts if multiple
  option groups contain the same long name, it is also possible to
  specify the option as 
  --<replaceable>groupname</replaceable>-<replaceable>long_name</replaceable>.
@short_name: If an option has a short name, it can be specified
  -<replaceable>short_name</replaceable> in a commandline.
@flags: Flags from #GOptionFlags.
@arg: The type of the option, as a #GOptionArg.
@arg_data:  If the @arg type is %G_OPTION_ARG_CALLBACK, then @arg_data must 
 point to a #GOptionArgFunc callback function, which will be called to handle 
 the extra argument. Otherwise, @arg_data is a pointer to a location to store 
 the value, the required type of the location depends on the @arg type:
  <variablelist>
    <varlistentry>
      <term>%G_OPTION_ARG_NONE</term>
      <listitem><para>%gboolean</para></listitem>
    </varlistentry>
    <varlistentry>
      <term>%G_OPTION_ARG_STRING</term>
      <listitem><para>%gchar*</para></listitem>
    </varlistentry>
    <varlistentry>
      <term>%G_OPTION_ARG_INT</term>
      <listitem><para>%gint</para></listitem>
    </varlistentry>
    <varlistentry>
      <term>%G_OPTION_ARG_FILENAME</term>
      <listitem><para>%gchar*</para></listitem>
    </varlistentry>
    <varlistentry>
      <term>%G_OPTION_ARG_STRING_ARRAY</term>
      <listitem><para>%gchar**</para></listitem>
    </varlistentry>
    <varlistentry>
      <term>%G_OPTION_ARG_FILENAME_ARRAY</term>
      <listitem><para>%gchar**</para></listitem>
    </varlistentry>
  </variablelist>
@description: the description for the option in <option>--help</option>
  output. The @description is translated using the @translate_func of the
  group, see g_option_group_set_translation_domain().
@arg_description: The placeholder to use for the extra argument parsed
  by the option in <option>--help</option>
  output. The @arg_description is translated using the @translate_func of the
  group, see g_option_group_set_translation_domain().

<!-- ##### FUNCTION g_option_context_add_main_entries ##### -->
<para>

</para>

@context: 
@entries: 
@translation_domain: 


<!-- ##### STRUCT GOptionGroup ##### -->
<para>
A <structname>GOptionGroup</structname> struct defines the options in a single
group. The struct has only private fields and should not be directly accessed. 
</para>
<para>
All options in a group share the same translation function. Libaries which
need to parse commandline options are expected to provide a function for
getting a <structname>GOptionGroup</structname> holding their options, which 
the application can then add to its #GOptionContext.
</para>


<!-- ##### FUNCTION g_option_context_add_group ##### -->
<para>

</para>

@context: 
@group: 


<!-- ##### FUNCTION g_option_context_set_main_group ##### -->
<para>

</para>

@context: 
@group: 


<!-- ##### FUNCTION g_option_context_get_main_group ##### -->
<para>

</para>

@context: 
@Returns: 


<!-- ##### FUNCTION g_option_group_new ##### -->
<para>

</para>

@name: 
@description: 
@help_description: 
@user_data: 
@destroy: 
@Returns: 


<!-- ##### FUNCTION g_option_group_free ##### -->
<para>

</para>

@group: 


<!-- ##### FUNCTION g_option_group_add_entries ##### -->
<para>

</para>

@group: 
@entries: 


<!-- ##### USER_FUNCTION GOptionParseFunc ##### -->
<para>
The type of function that can be called before and after parsing.
</para>

@context The active #GOptionContext

@context: 
@group: The group to which the function belongs
@data: User data added to the #GOptionGroup containing the option when it
  was created with g_option_group_new()
@error: A return location for error details
@Returns: %TRUE if the function completed successfully, %FALSE if an error 
  occurred


<!-- ##### FUNCTION g_option_group_set_parse_hooks ##### -->
<para>

</para>

@group: 
@pre_parse_func: 
@post_parse_func: 


<!-- ##### USER_FUNCTION GOptionErrorFunc ##### -->
<para>
The type of function to be used as callback when a parse error
occurs.
</para>

@context The active #GOptionContext

@context: 
@group: The group to which the function belongs
@data: User data added to the #GOptionGroup containing the option when it
  was created with g_option_group_new()
@error: The #GError containing details about the parse error


<!-- ##### FUNCTION g_option_group_set_error_hook ##### -->
<para>

</para>

@group: 
@error_func: 


<!-- ##### USER_FUNCTION GTranslateFunc ##### -->
<para>
The type of functions which are used to translate user-visible
strings, for <option>--help</option> output.
</para>

@str: the untranslated string
@data: user data specified when installing the function, e.g.
  in g_option_group_set_translate_func()
@Returns: a translation of the string for the current locale.
  The returned string is owned by GLib and must not be freed.


<!-- ##### FUNCTION g_option_group_set_translate_func ##### -->
<para>

</para>

@group: 
@func: 
@data: 
@destroy_notify: 


<!-- ##### FUNCTION g_option_group_set_translation_domain ##### -->
<para>

</para>

@group: 
@domain: 


