<!-- ##### 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.

<!-- ##### 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 #GOptionEntryFlags.
@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: 


