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:
Matthias Clasen 2004-11-01 17:40:09 +00:00 committed by Matthias Clasen
parent 0032a3c1b6
commit 57f8507273
6 changed files with 146 additions and 4 deletions

View File

@ -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()

View File

@ -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()

View File

@ -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()

View File

@ -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()

View File

@ -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()

View File

@ -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