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
* command line or through environment variables.
*
* If @string is equal to "all", all flags are set. If @string
* is equal to "help", all the available keys in @keys are printed
* out to standard error.
* If @string is equal to <code>"all"</code>, all flags are set. Any flags
* specified along with <code>"all"</code> in @string are inverted; thus,
* <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.
*/
@ -101,12 +105,7 @@ g_parse_debug_string (const gchar *string,
* inside GLib.
*/
if (!strcasecmp (string, "all"))
{
for (i = 0; i < nkeys; i++)
result |= keys[i].value;
}
else if (!strcasecmp (string, "help"))
if (!strcasecmp (string, "help"))
{
/* using stdio directly for the reason stated above */
fprintf (stderr, "Supported debug values: ");
@ -118,6 +117,7 @@ g_parse_debug_string (const gchar *string,
{
const gchar *p = string;
const gchar *q;
gboolean invert = FALSE;
while (*p)
{
@ -125,14 +125,31 @@ g_parse_debug_string (const gchar *string,
if (!q)
q = p + strlen(p);
for (i = 0; i < nkeys; i++)
if (debug_key_matches (keys[i].key, p, q - p))
result |= keys[i].value;
if (debug_key_matches ("all", p, q - p))
{
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;
if (*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;

View File

@ -509,10 +509,11 @@ find_first_that(gpointer key,
static void
test_g_parse_debug_string (void)
{
GDebugKey keys[3] = {
GDebugKey keys[] = {
{ "foo", 1 },
{ "bar", 2 },
{ "baz", 4 }
{ "baz", 4 },
{ "weird", 8 },
};
guint n_keys = G_N_ELEMENTS (keys);
guint result;
@ -531,6 +532,19 @@ test_g_parse_debug_string (void)
result = g_parse_debug_string ("all", keys, n_keys);
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