* 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.
*/
* 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: ");
{
const gchar *p = string;
const gchar *q;
+ gboolean invert = FALSE;
while (*p)
{
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;
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;
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