mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2024-11-10 11:26:16 +01:00
Handle conflicts between options in different groups. (#156808)
2004-11-01 Matthias Clasen <mclasen@redhat.com> Handle conflicts between options in different groups. (#156808) * glib/goption.c (g_option_context_parse): When a long option does not match exactly, try to parse it as --group-option. (g_option_context_add_group): Warn if a group name conflict occurs. * glib/goption.c (print_help): Print out the effective options, ie don't print shadowed short options, and for long options print --group-option instead of --option if appropriate.
This commit is contained in:
parent
0032a3c1b6
commit
57f8507273
12
ChangeLog
12
ChangeLog
@ -1,3 +1,15 @@
|
|||||||
|
2004-11-01 Matthias Clasen <mclasen@redhat.com>
|
||||||
|
|
||||||
|
Handle conflicts between options in different groups. (#156808)
|
||||||
|
|
||||||
|
* glib/goption.c (g_option_context_parse): When a long option does not
|
||||||
|
match exactly, try to parse it as --group-option.
|
||||||
|
(g_option_context_add_group): Warn if a group name conflict occurs.
|
||||||
|
|
||||||
|
* glib/goption.c (print_help): Print out the effective options, ie
|
||||||
|
don't print shadowed short options, and for long options print
|
||||||
|
--group-option instead of --option if appropriate.
|
||||||
|
|
||||||
2004-10-31 Matthias Clasen <mclasen@redhat.com>
|
2004-10-31 Matthias Clasen <mclasen@redhat.com>
|
||||||
|
|
||||||
* glib/gwin32.c: Add bits of markup to g_win32_get_windows_version()
|
* glib/gwin32.c: Add bits of markup to g_win32_get_windows_version()
|
||||||
|
@ -1,3 +1,15 @@
|
|||||||
|
2004-11-01 Matthias Clasen <mclasen@redhat.com>
|
||||||
|
|
||||||
|
Handle conflicts between options in different groups. (#156808)
|
||||||
|
|
||||||
|
* glib/goption.c (g_option_context_parse): When a long option does not
|
||||||
|
match exactly, try to parse it as --group-option.
|
||||||
|
(g_option_context_add_group): Warn if a group name conflict occurs.
|
||||||
|
|
||||||
|
* glib/goption.c (print_help): Print out the effective options, ie
|
||||||
|
don't print shadowed short options, and for long options print
|
||||||
|
--group-option instead of --option if appropriate.
|
||||||
|
|
||||||
2004-10-31 Matthias Clasen <mclasen@redhat.com>
|
2004-10-31 Matthias Clasen <mclasen@redhat.com>
|
||||||
|
|
||||||
* glib/gwin32.c: Add bits of markup to g_win32_get_windows_version()
|
* glib/gwin32.c: Add bits of markup to g_win32_get_windows_version()
|
||||||
|
@ -1,3 +1,15 @@
|
|||||||
|
2004-11-01 Matthias Clasen <mclasen@redhat.com>
|
||||||
|
|
||||||
|
Handle conflicts between options in different groups. (#156808)
|
||||||
|
|
||||||
|
* glib/goption.c (g_option_context_parse): When a long option does not
|
||||||
|
match exactly, try to parse it as --group-option.
|
||||||
|
(g_option_context_add_group): Warn if a group name conflict occurs.
|
||||||
|
|
||||||
|
* glib/goption.c (print_help): Print out the effective options, ie
|
||||||
|
don't print shadowed short options, and for long options print
|
||||||
|
--group-option instead of --option if appropriate.
|
||||||
|
|
||||||
2004-10-31 Matthias Clasen <mclasen@redhat.com>
|
2004-10-31 Matthias Clasen <mclasen@redhat.com>
|
||||||
|
|
||||||
* glib/gwin32.c: Add bits of markup to g_win32_get_windows_version()
|
* glib/gwin32.c: Add bits of markup to g_win32_get_windows_version()
|
||||||
|
@ -1,3 +1,15 @@
|
|||||||
|
2004-11-01 Matthias Clasen <mclasen@redhat.com>
|
||||||
|
|
||||||
|
Handle conflicts between options in different groups. (#156808)
|
||||||
|
|
||||||
|
* glib/goption.c (g_option_context_parse): When a long option does not
|
||||||
|
match exactly, try to parse it as --group-option.
|
||||||
|
(g_option_context_add_group): Warn if a group name conflict occurs.
|
||||||
|
|
||||||
|
* glib/goption.c (print_help): Print out the effective options, ie
|
||||||
|
don't print shadowed short options, and for long options print
|
||||||
|
--group-option instead of --option if appropriate.
|
||||||
|
|
||||||
2004-10-31 Matthias Clasen <mclasen@redhat.com>
|
2004-10-31 Matthias Clasen <mclasen@redhat.com>
|
||||||
|
|
||||||
* glib/gwin32.c: Add bits of markup to g_win32_get_windows_version()
|
* glib/gwin32.c: Add bits of markup to g_win32_get_windows_version()
|
||||||
|
@ -1,3 +1,15 @@
|
|||||||
|
2004-11-01 Matthias Clasen <mclasen@redhat.com>
|
||||||
|
|
||||||
|
Handle conflicts between options in different groups. (#156808)
|
||||||
|
|
||||||
|
* glib/goption.c (g_option_context_parse): When a long option does not
|
||||||
|
match exactly, try to parse it as --group-option.
|
||||||
|
(g_option_context_add_group): Warn if a group name conflict occurs.
|
||||||
|
|
||||||
|
* glib/goption.c (print_help): Print out the effective options, ie
|
||||||
|
don't print shadowed short options, and for long options print
|
||||||
|
--group-option instead of --option if appropriate.
|
||||||
|
|
||||||
2004-10-31 Matthias Clasen <mclasen@redhat.com>
|
2004-10-31 Matthias Clasen <mclasen@redhat.com>
|
||||||
|
|
||||||
* glib/gwin32.c: Add bits of markup to g_win32_get_windows_version()
|
* glib/gwin32.c: Add bits of markup to g_win32_get_windows_version()
|
||||||
|
@ -271,13 +271,25 @@ void
|
|||||||
g_option_context_add_group (GOptionContext *context,
|
g_option_context_add_group (GOptionContext *context,
|
||||||
GOptionGroup *group)
|
GOptionGroup *group)
|
||||||
{
|
{
|
||||||
|
GList *list;
|
||||||
|
|
||||||
g_return_if_fail (context != NULL);
|
g_return_if_fail (context != NULL);
|
||||||
g_return_if_fail (group != NULL);
|
g_return_if_fail (group != NULL);
|
||||||
g_return_if_fail (group->name != NULL);
|
g_return_if_fail (group->name != NULL);
|
||||||
g_return_if_fail (group->description != NULL);
|
g_return_if_fail (group->description != NULL);
|
||||||
g_return_if_fail (group->help_description != NULL);
|
g_return_if_fail (group->help_description != NULL);
|
||||||
|
|
||||||
context->groups = g_list_prepend (context->groups, group);
|
for (list = context->groups; list; list = list->next)
|
||||||
|
{
|
||||||
|
GOptionGroup *g = (GOptionGroup *)list->data;
|
||||||
|
|
||||||
|
if ((group->name == NULL && g->name == NULL) ||
|
||||||
|
(group->name && g->name && strcmp (group->name, g->name) == 0))
|
||||||
|
g_warning ("A group named \"%s\" is already part of this GOptionContext",
|
||||||
|
group->name);
|
||||||
|
}
|
||||||
|
|
||||||
|
context->groups = g_list_append (context->groups, group);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -382,11 +394,52 @@ print_help (GOptionContext *context,
|
|||||||
GList *list;
|
GList *list;
|
||||||
gint max_length, len;
|
gint max_length, len;
|
||||||
gint i;
|
gint i;
|
||||||
|
GHashTable *shadow_map;
|
||||||
|
gboolean seen[256];
|
||||||
|
|
||||||
g_print ("%s\n %s %s %s\n\n",
|
g_print ("%s\n %s %s %s\n\n",
|
||||||
_("Usage:"), g_get_prgname(), _("[OPTION...]"),
|
_("Usage:"), g_get_prgname(), _("[OPTION...]"),
|
||||||
context->parameter_string ? context->parameter_string : "");
|
context->parameter_string ? context->parameter_string : "");
|
||||||
|
|
||||||
|
memset (seen, 0, sizeof (gboolean) * 256);
|
||||||
|
shadow_map = g_hash_table_new (g_str_hash, g_str_equal);
|
||||||
|
|
||||||
|
if (context->main_group)
|
||||||
|
{
|
||||||
|
for (i = 0; i < context->main_group->n_entries; i++)
|
||||||
|
{
|
||||||
|
g_hash_table_insert (shadow_map,
|
||||||
|
(gpointer)context->main_group->entries[i].long_name,
|
||||||
|
context->main_group->entries + i);
|
||||||
|
|
||||||
|
if (seen[(guchar)context->main_group->entries[i].short_name])
|
||||||
|
context->main_group->entries[i].short_name = 0;
|
||||||
|
else
|
||||||
|
seen[(guchar)context->main_group->entries[i].short_name] = TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
list = context->groups;
|
||||||
|
while (list != NULL)
|
||||||
|
{
|
||||||
|
GOptionGroup *group = list->data;
|
||||||
|
for (i = 0; i < group->n_entries; i++)
|
||||||
|
{
|
||||||
|
if (g_hash_table_lookup (shadow_map, group->entries[i].long_name))
|
||||||
|
group->entries[i].long_name = g_strdup_printf ("%s-%s", group->name, group->entries[i].long_name);
|
||||||
|
else
|
||||||
|
g_hash_table_insert (shadow_map, (gpointer)group->entries[i].long_name, group->entries + i);
|
||||||
|
|
||||||
|
if (seen[(guchar)group->entries[i].short_name])
|
||||||
|
group->entries[i].short_name = 0;
|
||||||
|
else
|
||||||
|
seen[(guchar)group->entries[i].short_name] = TRUE;
|
||||||
|
}
|
||||||
|
list = list->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
g_hash_table_destroy (shadow_map);
|
||||||
|
|
||||||
list = context->groups;
|
list = context->groups;
|
||||||
|
|
||||||
max_length = g_utf8_strlen ("--help, -?", -1);
|
max_length = g_utf8_strlen ("--help, -?", -1);
|
||||||
@ -505,7 +558,6 @@ print_help (GOptionContext *context,
|
|||||||
g_print ("\n");
|
g_print ("\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
exit (0);
|
exit (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1061,7 +1113,7 @@ g_option_context_parse (GOptionContext *context,
|
|||||||
|
|
||||||
for (i = 1; i < *argc; i++)
|
for (i = 1; i < *argc; i++)
|
||||||
{
|
{
|
||||||
gchar *arg;
|
gchar *arg, *dash;
|
||||||
gboolean parsed = FALSE;
|
gboolean parsed = FALSE;
|
||||||
|
|
||||||
if ((*argv)[i][0] == '-' && !stop_parsing)
|
if ((*argv)[i][0] == '-' && !stop_parsing)
|
||||||
@ -1129,11 +1181,40 @@ g_option_context_parse (GOptionContext *context,
|
|||||||
list = list->next;
|
list = list->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (parsed)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
/* Now look for --<group>-<option> */
|
||||||
|
dash = strchr (arg, '-');
|
||||||
|
if (dash)
|
||||||
|
{
|
||||||
|
/* Try the groups */
|
||||||
|
list = context->groups;
|
||||||
|
while (list)
|
||||||
|
{
|
||||||
|
GOptionGroup *group = list->data;
|
||||||
|
|
||||||
|
if (strncmp (group->name, arg, dash - arg) == 0)
|
||||||
|
{
|
||||||
|
if (!parse_long_option (context, group, &i, dash + 1,
|
||||||
|
argc, argv, error, &parsed))
|
||||||
|
goto fail;
|
||||||
|
|
||||||
|
if (parsed)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
list = list->next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (context->ignore_unknown)
|
if (context->ignore_unknown)
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
/* short option */
|
||||||
|
|
||||||
gint new_i, j;
|
gint new_i, j;
|
||||||
gboolean *nulled_out = NULL;
|
gboolean *nulled_out = NULL;
|
||||||
|
|
||||||
@ -1346,6 +1427,7 @@ g_option_group_new (const gchar *name,
|
|||||||
return group;
|
return group;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* g_option_group_free:
|
* g_option_group_free:
|
||||||
* @group: a #GOptionGroup
|
* @group: a #GOptionGroup
|
||||||
|
Loading…
Reference in New Issue
Block a user