g_parse_debug_string: invert flags given besides "all"

Any flags specified as well as "all" are subtracted from the result,
allowing the user to specify FOO_DEBUG="all,bar,baz" to mean "give me
debugging information for everything except bar and baz".

https://bugzilla.gnome.org/show_bug.cgi?id=642452
This commit is contained in:
Will Thompson 2011-10-20 16:07:03 +01:00 committed by Matthias Clasen
parent 73ffa9034f
commit 5e2a2ef288
2 changed files with 45 additions and 14 deletions

View File

@ -76,9 +76,13 @@ debug_key_matches (const gchar *key,
* within GDK and GTK+ to parse the debug options passed on the * within GDK and GTK+ to parse the debug options passed on the
* command line or through environment variables. * command line or through environment variables.
* *
* If @string is equal to "all", all flags are set. If @string * If @string is equal to <code>"all"</code>, all flags are set. Any flags
* is equal to "help", all the available keys in @keys are printed * specified along with <code>"all"</code> in @string are inverted; thus,
* out to standard error. * <code>"all,foo,bar"</code> or <code>"foo,bar,all"</code> sets all flags
* except those corresponding to <code>"foo"</code> and <code>"bar"</code>.
*
* If @string is equal to <code>"help"</code>, all the available keys in @keys
* are printed out to standard error.
* *
* Returns: the combined set of bit flags. * Returns: the combined set of bit flags.
*/ */
@ -101,12 +105,7 @@ g_parse_debug_string (const gchar *string,
* inside GLib. * inside GLib.
*/ */
if (!strcasecmp (string, "all")) if (!strcasecmp (string, "help"))
{
for (i = 0; i < nkeys; i++)
result |= keys[i].value;
}
else if (!strcasecmp (string, "help"))
{ {
/* using stdio directly for the reason stated above */ /* using stdio directly for the reason stated above */
fprintf (stderr, "Supported debug values: "); fprintf (stderr, "Supported debug values: ");
@ -118,6 +117,7 @@ g_parse_debug_string (const gchar *string,
{ {
const gchar *p = string; const gchar *p = string;
const gchar *q; const gchar *q;
gboolean invert = FALSE;
while (*p) while (*p)
{ {
@ -125,14 +125,31 @@ g_parse_debug_string (const gchar *string,
if (!q) if (!q)
q = p + strlen(p); q = p + strlen(p);
for (i = 0; i < nkeys; i++) if (debug_key_matches ("all", p, q - p))
if (debug_key_matches (keys[i].key, p, q - p)) {
result |= keys[i].value; invert = TRUE;
}
else
{
for (i = 0; i < nkeys; i++)
if (debug_key_matches (keys[i].key, p, q - p))
result |= keys[i].value;
}
p = q; p = q;
if (*p) if (*p)
p++; p++;
} }
if (invert)
{
guint all_flags = 0;
for (i = 0; i < nkeys; i++)
all_flags |= keys[i].value;
result = all_flags & (~result);
}
} }
return result; return result;

View File

@ -509,10 +509,11 @@ find_first_that(gpointer key,
static void static void
test_g_parse_debug_string (void) test_g_parse_debug_string (void)
{ {
GDebugKey keys[3] = { GDebugKey keys[] = {
{ "foo", 1 }, { "foo", 1 },
{ "bar", 2 }, { "bar", 2 },
{ "baz", 4 } { "baz", 4 },
{ "weird", 8 },
}; };
guint n_keys = G_N_ELEMENTS (keys); guint n_keys = G_N_ELEMENTS (keys);
guint result; guint result;
@ -531,6 +532,19 @@ test_g_parse_debug_string (void)
result = g_parse_debug_string ("all", keys, n_keys); result = g_parse_debug_string ("all", keys, n_keys);
g_assert_cmpuint (result, ==, (1 << n_keys) - 1); g_assert_cmpuint (result, ==, (1 << n_keys) - 1);
/* Test subtracting debug flags from "all" */
result = g_parse_debug_string ("all:foo", keys, n_keys);
g_assert_cmpuint (result, ==, 2 | 4 | 8);
result = g_parse_debug_string ("foo baz,all", keys, n_keys);
g_assert_cmpuint (result, ==, 2 | 8);
result = g_parse_debug_string ("all,fooo,baz", keys, n_keys);
g_assert_cmpuint (result, ==, 1 | 2 | 8);
result = g_parse_debug_string ("all:weird", keys, n_keys);
g_assert_cmpuint (result, ==, 1 | 2 | 4);
} }
static void static void