* Copyright (C) 2004 Anders Carlsson <andersca@gnome.org>
*
* This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
+ * modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
+ * version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Library General Public License for more details.
+ * Lesser General Public License for more details.
*
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, see <http://www.gnu.org/licenses/>.
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library; if not, see <http://www.gnu.org/licenses/>.
*/
/**
* { "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 },
- * { NULL }
+ * G_OPTION_ENTRY_NULL
* };
*
* int
#include <errno.h>
#if defined __OpenBSD__
-#include <sys/types.h>
#include <unistd.h>
-#include <sys/param.h>
#include <sys/sysctl.h>
#endif
#include "gprintf.h"
#include "glibintl.h"
+#if defined G_OS_WIN32
+#include <windows.h>
+#endif
+
#define TRANSLATE(group, str) (((group)->translate_func ? (* (group)->translate_func) ((str), (group)->translate_data) : (str)))
#define NO_ARG(entry) ((entry)->arg == G_OPTION_ARG_NONE || \
{
GList *groups;
- gchar *parameter_string;
+ gchar *parameter_string; /* (nullable) */
gchar *summary;
gchar *description;
guint help_enabled : 1;
guint ignore_unknown : 1;
guint strv_mode : 1;
+ guint strict_posix : 1;
GOptionGroup *main_group;
gchar *description;
gchar *help_description;
+ gint ref_count;
+
GDestroyNotify destroy_notify;
gpointer user_data;
gpointer translate_data;
GOptionEntry *entries;
- gint n_entries;
+ gsize n_entries;
GOptionParseFunc pre_parse_func;
GOptionParseFunc post_parse_func;
/**
* g_option_context_new:
- * @parameter_string: (allow-none): a string which is displayed in
+ * @parameter_string: (nullable): a string which is displayed in
* the first line of `--help` output, after the usage summary
* `programname [OPTION...]`
*
* The @parameter_string can serve multiple purposes. It can be used
* to add descriptions for "rest" arguments, which are not parsed by
* the #GOptionContext, typically something like "FILES" or
- * "FILE1 FILE2...". If you are using #G_OPTION_REMAINING for
+ * "FILE1 FILE2...". If you are using %G_OPTION_REMAINING for
* collecting "rest" arguments, GLib handles this automatically by
* using the @arg_description of the corresponding #GOptionEntry in
* the usage summary.
context = g_new0 (GOptionContext, 1);
+ /* Clear the empty string to NULL, otherwise we end up calling gettext(""),
+ * which returns the translation header. */
+ if (parameter_string != NULL && *parameter_string == '\0')
+ parameter_string = NULL;
+
context->parameter_string = g_strdup (parameter_string);
+ context->strict_posix = FALSE;
context->help_enabled = TRUE;
context->ignore_unknown = FALSE;
{
g_return_if_fail (context != NULL);
- g_list_free_full (context->groups, (GDestroyNotify) g_option_group_free);
+ g_list_free_full (context->groups, (GDestroyNotify) g_option_group_unref);
if (context->main_group)
- g_option_group_free (context->main_group);
+ g_option_group_unref (context->main_group);
free_changes_list (context, FALSE);
free_pending_nulls (context, FALSE);
}
/**
+ * g_option_context_set_strict_posix:
+ * @context: a #GOptionContext
+ * @strict_posix: the new value
+ *
+ * Sets strict POSIX mode.
+ *
+ * By default, this mode is disabled.
+ *
+ * In strict POSIX mode, the first non-argument parameter encountered
+ * (eg: filename) terminates argument processing. Remaining arguments
+ * are treated as non-options and are not attempted to be parsed.
+ *
+ * If strict POSIX mode is disabled then parsing is done in the GNU way
+ * where option arguments can be freely mixed with non-options.
+ *
+ * As an example, consider "ls foo -l". With GNU style parsing, this
+ * will list "foo" in long mode. In strict POSIX style, this will list
+ * the files named "foo" and "-l".
+ *
+ * It may be useful to force strict POSIX mode when creating "verb
+ * style" command line tools. For example, the "gsettings" command line
+ * tool supports the global option "--schemadir" as well as many
+ * subcommands ("get", "set", etc.) which each have their own set of
+ * arguments. Using strict POSIX mode will allow parsing the global
+ * options up to the verb name while leaving the remaining options to be
+ * parsed by the relevant subcommand (which can be determined by
+ * examining the verb name, which should be present in argv[1] after
+ * parsing).
+ *
+ * Since: 2.44
+ **/
+void
+g_option_context_set_strict_posix (GOptionContext *context,
+ gboolean strict_posix)
+{
+ g_return_if_fail (context != NULL);
+
+ context->strict_posix = strict_posix;
+}
+
+/**
+ * g_option_context_get_strict_posix:
+ * @context: a #GOptionContext
+ *
+ * Returns whether strict POSIX code is enabled.
+ *
+ * See g_option_context_set_strict_posix() for more information.
+ *
+ * Returns: %TRUE if strict POSIX is enabled, %FALSE otherwise.
+ *
+ * Since: 2.44
+ **/
+gboolean
+g_option_context_get_strict_posix (GOptionContext *context)
+{
+ g_return_val_if_fail (context != NULL, FALSE);
+
+ return context->strict_posix;
+}
+
+/**
* g_option_context_add_group:
* @context: a #GOptionContext
- * @group: the group to add
+ * @group: (transfer full): the group to add
*
* Adds a #GOptionGroup to the @context, so that parsing with @context
- * will recognize the options in the group. Note that the group will
- * be freed together with the context when g_option_context_free() is
- * called, so you must not free the group yourself after adding it
- * to a context.
+ * will recognize the options in the group. Note that this will take
+ * ownership of the @group and thus the @group should not be freed.
*
* Since: 2.6
**/
/**
* g_option_context_set_main_group:
* @context: a #GOptionContext
- * @group: the group to set as main group
+ * @group: (transfer full): the group to set as main group
*
* Sets a #GOptionGroup as main group of the @context.
* This has the same effect as calling g_option_context_add_group(),
*
* Returns a pointer to the main group of @context.
*
- * Return value: the main group of @context, or %NULL if @context doesn't
- * have a main group. Note that group belongs to @context and should
- * not be modified or freed.
+ * Returns: (transfer none): the main group of @context, or %NULL if
+ * @context doesn't have a main group. Note that group belongs to
+ * @context and should not be modified or freed.
*
* Since: 2.6
**/
/**
* g_option_context_add_main_entries:
* @context: a #GOptionContext
- * @entries: a %NULL-terminated array of #GOptionEntrys
- * @translation_domain: (allow-none): a translation domain to use for translating
+ * @entries: (array zero-terminated=1): a %NULL-terminated array of #GOptionEntrys
+ * @translation_domain: (nullable): a translation domain to use for translating
* the `--help` output for the options in @entries
* with gettext(), or %NULL
*
const GOptionEntry *entries,
const gchar *translation_domain)
{
+ g_return_if_fail (context != NULL);
g_return_if_fail (entries != NULL);
if (!context->main_group)
GHashTable *aliases)
{
GOptionEntry *entry;
- gint i, len, max_length;
+ gsize i, len, max_length;
const gchar *long_name;
max_length = 0;
* g_option_context_get_help:
* @context: a #GOptionContext
* @main_help: if %TRUE, only include the main group
- * @group: (allow-none): the #GOptionGroup to create help for, or %NULL
+ * @group: (nullable): the #GOptionGroup to create help for, or %NULL
*
* Returns a formatted, translated help text for the given context.
* To obtain the text produced by `--help`, call
{
GList *list;
gint max_length = 0, len;
- gint i;
+ gsize i;
GOptionEntry *entry;
GHashTable *shadow_map;
GHashTable *aliases;
GString *string;
guchar token;
+ g_return_val_if_fail (context != NULL, NULL);
+
string = g_string_sized_new (1024);
rest_description = NULL;
}
}
- g_string_append_printf (string, "%s\n %s %s",
- _("Usage:"), g_get_prgname(), _("[OPTION...]"));
+ g_string_append_printf (string, "%s\n %s", _("Usage:"), g_get_prgname ());
+ if (context->help_enabled ||
+ (context->main_group && context->main_group->n_entries > 0) ||
+ context->groups != NULL)
+ g_string_append_printf (string, " %s", _("[OPTION…]"));
if (rest_description)
{
{
list = context->groups;
- g_string_append (string, _("Application Options:"));
+ if (context->help_enabled || list)
+ g_string_append (string, _("Application Options:"));
+ else
+ g_string_append (string, _("Options:"));
g_string_append (string, "\n");
if (context->main_group)
for (i = 0; i < context->main_group->n_entries; i++)
return g_string_free (string, FALSE);
}
-G_GNUC_NORETURN
+G_NORETURN
static void
print_help (GOptionContext *context,
gboolean main_help,
{
g_set_error (error,
G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE,
- _("Cannot parse integer value '%s' for %s"),
+ _("Cannot parse integer value “%s” for %s"),
arg, arg_name);
return FALSE;
}
{
g_set_error (error,
G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE,
- _("Integer value '%s' for %s out of range"),
+ _("Integer value “%s” for %s out of range"),
arg, arg_name);
return FALSE;
}
{
g_set_error (error,
G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE,
- _("Cannot parse double value '%s' for %s"),
+ _("Cannot parse double value “%s” for %s"),
arg, arg_name);
return FALSE;
}
{
g_set_error (error,
G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE,
- _("Double value '%s' for %s out of range"),
+ _("Double value “%s” for %s out of range"),
arg, arg_name);
return FALSE;
}
{
g_set_error (error,
G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE,
- _("Cannot parse integer value '%s' for %s"),
+ _("Cannot parse integer value “%s” for %s"),
arg, arg_name);
return FALSE;
}
{
g_set_error (error,
G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE,
- _("Integer value '%s' for %s out of range"),
+ _("Integer value “%s” for %s out of range"),
arg, arg_name);
return FALSE;
}
{
case G_OPTION_ARG_NONE:
{
- change = get_change (context, G_OPTION_ARG_NONE,
- entry->arg_data);
+ (void) get_change (context, G_OPTION_ARG_NONE,
+ entry->arg_data);
*(gboolean *)entry->arg_data = !(entry->flags & G_OPTION_FLAG_REVERSE);
break;
change = get_change (context, G_OPTION_ARG_STRING,
entry->arg_data);
- g_free (change->allocated.str);
- change->prev.str = *(gchar **)entry->arg_data;
+ if (!change->allocated.str)
+ change->prev.str = *(gchar **)entry->arg_data;
+ else
+ g_free (change->allocated.str);
+
change->allocated.str = data;
*(gchar **)entry->arg_data = data;
#endif
change = get_change (context, G_OPTION_ARG_FILENAME,
entry->arg_data);
- g_free (change->allocated.str);
- change->prev.str = *(gchar **)entry->arg_data;
+ if (!change->allocated.str)
+ change->prev.str = *(gchar **)entry->arg_data;
+ else
+ g_free (change->allocated.str);
+
change->allocated.str = data;
*(gchar **)entry->arg_data = data;
GError **error,
gboolean *parsed)
{
- gint j;
+ gsize j;
for (j = 0; j < group->n_entries; j++)
{
if (idx < *argc - 1)
{
- if (!OPTIONAL_ARG (&group->entries[j]))
+ if (OPTIONAL_ARG (&group->entries[j]) && ((*argv)[idx + 1][0] == '-'))
+ value = NULL;
+ else
{
value = (*argv)[idx + 1];
add_pending_null (context, &((*argv)[idx + 1]), NULL);
*new_idx = idx + 1;
}
- else
- {
- if ((*argv)[idx + 1][0] == '-')
- value = NULL;
- else
- {
- value = (*argv)[idx + 1];
- add_pending_null (context, &((*argv)[idx + 1]), NULL);
- *new_idx = idx + 1;
- }
- }
}
else if (idx >= *argc - 1 && OPTIONAL_ARG (&group->entries[j]))
value = NULL;
GError **error,
gboolean *parsed)
{
- gint j;
+ gsize j;
for (j = 0; j < group->n_entries; j++)
{
GError **error,
gboolean *parsed)
{
- gint j;
+ gsize j;
for (j = 0; j < group->n_entries; j++)
{
static char *
platform_get_argv0 (void)
{
-#if defined __linux
+#ifdef HAVE_PROC_SELF_CMDLINE
char *cmdline;
char *base_arg0;
gsize len;
&len,
NULL))
return NULL;
- /* Sanity check for a NUL terminator. */
- if (!memchr (cmdline, 0, len))
- return NULL;
+
+ /* g_file_get_contents() guarantees to put a NUL immediately after the
+ * file's contents (at cmdline[len] here), even if the file itself was
+ * not NUL-terminated. */
+ g_assert (memchr (cmdline, 0, len + 1));
+
/* We could just return cmdline, but I think it's better
* to hold on to a smaller malloc block; the arguments
* could be large.
g_free (cmdline);
return base_arg0;
#elif defined __OpenBSD__
- char **cmdline = NULL;
+ char **cmdline;
char *base_arg0;
- gsize len = PATH_MAX;
+ gsize len;
int mib[] = { CTL_KERN, KERN_PROC_ARGS, getpid(), KERN_PROC_ARGV };
- cmdline = (char **) realloc (cmdline, len);
+ if (sysctl (mib, G_N_ELEMENTS (mib), NULL, &len, NULL, 0) == -1)
+ return NULL;
+
+ cmdline = g_malloc0 (len);
if (sysctl (mib, G_N_ELEMENTS (mib), cmdline, &len, NULL, 0) == -1)
{
base_arg0 = g_path_get_basename (*cmdline);
g_free (cmdline);
return base_arg0;
+#elif defined G_OS_WIN32
+ const wchar_t *cmdline;
+ wchar_t **wargv;
+ int wargc;
+ gchar *utf8_buf = NULL;
+ char *base_arg0 = NULL;
+
+ /* Pretend it's const, since we're not allowed to free it */
+ cmdline = (const wchar_t *) GetCommandLineW ();
+ if (G_UNLIKELY (cmdline == NULL))
+ return NULL;
+
+ /* Skip leading whitespace. CommandLineToArgvW() is documented
+ * to behave weirdly with that. The character codes below
+ * correspond to the *only* unicode characters that are
+ * considered to be spaces by CommandLineToArgvW(). The rest
+ * (such as 0xa0 - NO-BREAK SPACE) are treated as
+ * normal characters.
+ */
+ while (cmdline[0] == 0x09 ||
+ cmdline[0] == 0x0a ||
+ cmdline[0] == 0x0c ||
+ cmdline[0] == 0x0d ||
+ cmdline[0] == 0x20)
+ cmdline++;
+
+ wargv = CommandLineToArgvW (cmdline, &wargc);
+ if (G_UNLIKELY (wargv == NULL))
+ return NULL;
+
+ if (wargc > 0)
+ utf8_buf = g_utf16_to_utf8 (wargv[0], -1, NULL, NULL, NULL);
+
+ LocalFree (wargv);
+
+ if (G_UNLIKELY (utf8_buf == NULL))
+ return NULL;
+
+ /* We could just return cmdline, but I think it's better
+ * to hold on to a smaller malloc block; the arguments
+ * could be large.
+ */
+ base_arg0 = g_path_get_basename (utf8_buf);
+ g_free (utf8_buf);
+ return base_arg0;
#endif
return NULL;
/**
* g_option_context_parse:
* @context: a #GOptionContext
- * @argc: (inout) (allow-none): a pointer to the number of command line arguments
- * @argv: (inout) (array length=argc) (allow-none): a pointer to the array of command line arguments
+ * @argc: (inout) (optional): a pointer to the number of command line arguments
+ * @argv: (inout) (array length=argc) (optional): a pointer to the array of command line arguments
* @error: a return location for errors
*
* Parses the command line arguments, recognizing options
* automatic character set conversion of string and filename
* arguments.
*
- * Return value: %TRUE if the parsing was successful,
+ * Returns: %TRUE if the parsing was successful,
* %FALSE if an error occurred
*
* Since: 2.6
gint i, j, k;
GList *list;
+ g_return_val_if_fail (context != NULL, FALSE);
+
/* Set program name */
if (!g_get_prgname())
{
/* Now look for --<group>-<option> */
dash = strchr (arg, '-');
- if (dash)
+ if (dash && arg < dash)
{
/* Try the groups */
list = context->groups;
gboolean has_h_entry = context_has_h_entry (context);
arg = (*argv)[i] + 1;
arg_length = strlen (arg);
- nulled_out = g_newa (gboolean, arg_length);
- memset (nulled_out, 0, arg_length * sizeof (gboolean));
+ nulled_out = g_newa0 (gboolean, arg_length);
for (j = 0; j < arg_length; j++)
{
if (context->help_enabled && (arg[j] == '?' ||
if (new_arg)
new_arg[arg_index] = '\0';
add_pending_null (context, &((*argv)[i]), new_arg);
+ i = new_i;
}
else if (parsed)
{
}
else
{
+ if (context->strict_posix)
+ stop_parsing = TRUE;
+
/* Collect remaining args */
if (context->main_group &&
!parse_remaining_arg (context, context->main_group, &i,
* @help_description: a description for the `--help-`@name option.
* This string is translated using the translation domain or translation function
* of the group
- * @user_data: (allow-none): user data that will be passed to the pre- and post-parse hooks,
+ * @user_data: (nullable): user data that will be passed to the pre- and post-parse hooks,
* the error hook and to callbacks of %G_OPTION_ARG_CALLBACK options, or %NULL
- * @destroy: (allow-none): a function that will be called to free @user_data, or %NULL
+ * @destroy: (nullable): a function that will be called to free @user_data, or %NULL
*
* Creates a new #GOptionGroup.
*
- * Return value: a newly created option group. It should be added
- * to a #GOptionContext or freed with g_option_group_free().
+ * Returns: a newly created option group. It should be added
+ * to a #GOptionContext or freed with g_option_group_unref().
*
* Since: 2.6
**/
GOptionGroup *group;
group = g_new0 (GOptionGroup, 1);
+ group->ref_count = 1;
group->name = g_strdup (name);
group->description = g_strdup (description);
group->help_description = g_strdup (help_description);
* which have been added to a #GOptionContext.
*
* Since: 2.6
+ *
+ * Deprecated: 2.44: Use g_option_group_unref() instead.
*/
void
g_option_group_free (GOptionGroup *group)
{
+ g_option_group_unref (group);
+}
+
+/**
+ * g_option_group_ref:
+ * @group: a #GOptionGroup
+ *
+ * Increments the reference count of @group by one.
+ *
+ * Returns: a #GOptionGroup
+ *
+ * Since: 2.44
+ */
+GOptionGroup *
+g_option_group_ref (GOptionGroup *group)
+{
+ g_return_val_if_fail (group != NULL, NULL);
+
+ group->ref_count++;
+
+ return group;
+}
+
+/**
+ * g_option_group_unref:
+ * @group: a #GOptionGroup
+ *
+ * Decrements the reference count of @group by one.
+ * If the reference count drops to 0, the @group will be freed.
+ * and all memory allocated by the @group is released.
+ *
+ * Since: 2.44
+ */
+void
+g_option_group_unref (GOptionGroup *group)
+{
g_return_if_fail (group != NULL);
- g_free (group->name);
- g_free (group->description);
- g_free (group->help_description);
+ if (--group->ref_count == 0)
+ {
+ g_free (group->name);
+ g_free (group->description);
+ g_free (group->help_description);
- g_free (group->entries);
+ g_free (group->entries);
- if (group->destroy_notify)
- (* group->destroy_notify) (group->user_data);
+ if (group->destroy_notify)
+ (* group->destroy_notify) (group->user_data);
- if (group->translate_notify)
- (* group->translate_notify) (group->translate_data);
+ if (group->translate_notify)
+ (* group->translate_notify) (group->translate_data);
- g_free (group);
+ g_free (group);
+ }
}
-
/**
* g_option_group_add_entries:
* @group: a #GOptionGroup
- * @entries: a %NULL-terminated array of #GOptionEntrys
+ * @entries: (array zero-terminated=1): a %NULL-terminated array of #GOptionEntrys
*
* Adds the options specified in @entries to @group.
*
g_option_group_add_entries (GOptionGroup *group,
const GOptionEntry *entries)
{
- gint i, n_entries;
+ gsize i, n_entries;
+ g_return_if_fail (group != NULL);
g_return_if_fail (entries != NULL);
for (n_entries = 0; entries[n_entries].long_name != NULL; n_entries++) ;
+ g_return_if_fail (n_entries <= G_MAXSIZE - group->n_entries);
+
group->entries = g_renew (GOptionEntry, group->entries, group->n_entries + n_entries);
- memcpy (group->entries + group->n_entries, entries, sizeof (GOptionEntry) * n_entries);
+ /* group->entries could be NULL in the trivial case where we add no
+ * entries to no entries */
+ if (n_entries != 0)
+ memcpy (group->entries + group->n_entries, entries, sizeof (GOptionEntry) * n_entries);
for (i = group->n_entries; i < group->n_entries + n_entries; i++)
{
/**
* g_option_group_set_parse_hooks:
* @group: a #GOptionGroup
- * @pre_parse_func: (allow-none): a function to call before parsing, or %NULL
- * @post_parse_func: (allow-none): a function to call after parsing, or %NULL
+ * @pre_parse_func: (nullable): a function to call before parsing, or %NULL
+ * @post_parse_func: (nullable): a function to call after parsing, or %NULL
*
* Associates two functions with @group which will be called
* from g_option_context_parse() before the first option is parsed
/**
* g_option_group_set_translate_func:
* @group: a #GOptionGroup
- * @func: (allow-none): the #GTranslateFunc, or %NULL
- * @data: (allow-none): user data to pass to @func, or %NULL
- * @destroy_notify: (allow-none): a function which gets called to free @data, or %NULL
+ * @func: (nullable): the #GTranslateFunc, or %NULL
+ * @data: (nullable): user data to pass to @func, or %NULL
+ * @destroy_notify: (nullable): a function which gets called to free @data, or %NULL
*
* Sets the function which is used to translate user-visible strings,
* for `--help` output. Different groups can use different
/**
* g_option_context_set_translate_func:
* @context: a #GOptionContext
- * @func: (allow-none): the #GTranslateFunc, or %NULL
- * @data: (allow-none): user data to pass to @func, or %NULL
- * @destroy_notify: (allow-none): a function which gets called to free @data, or %NULL
+ * @func: (nullable): the #GTranslateFunc, or %NULL
+ * @data: (nullable): user data to pass to @func, or %NULL
+ * @destroy_notify: (nullable): a function which gets called to free @data, or %NULL
*
* Sets the function which is used to translate the contexts
* user-visible strings, for `--help` output. If @func is %NULL,
/**
* g_option_context_set_summary:
* @context: a #GOptionContext
- * @summary: (allow-none): a string to be shown in `--help` output
+ * @summary: (nullable): a string to be shown in `--help` output
* before the list of options, or %NULL
*
* Adds a string to be displayed in `--help` output before the list
/**
* g_option_context_set_description:
* @context: a #GOptionContext
- * @description: (allow-none): a string to be shown in `--help` output
+ * @description: (nullable): a string to be shown in `--help` output
* after the list of options, or %NULL
*
* Adds a string to be displayed in `--help` output after the list
/**
* g_option_context_parse_strv:
* @context: a #GOptionContext
- * @arguments: (inout) (array null-terminated=1): a pointer to the
- * command line arguments (which must be in UTF-8 on Windows)
+ * @arguments: (inout) (array null-terminated=1) (optional): a pointer
+ * to the command line arguments (which must be in UTF-8 on Windows).
+ * Starting with GLib 2.62, @arguments can be %NULL, which matches
+ * g_option_context_parse().
* @error: a return location for errors
*
* Parses the command line arguments.
gboolean success;
gint argc;
+ g_return_val_if_fail (context != NULL, FALSE);
+
context->strv_mode = TRUE;
- argc = g_strv_length (*arguments);
+ argc = arguments && *arguments ? g_strv_length (*arguments) : 0;
success = g_option_context_parse (context, &argc, arguments, error);
context->strv_mode = FALSE;