diff options
author | Johan Dahlin <jdahlin@async.com.br> | 2007-06-30 06:57:47 +0000 |
---|---|---|
committer | Johan Dahlin <johan@src.gnome.org> | 2007-06-30 06:57:47 +0000 |
commit | 357e2cbfff1c0b36035ea73007c8faf7c20daf64 (patch) | |
tree | 83a8dc38f1d088058812ad329f2110604cb9f1d6 /gtk/gtkbuilderparser.c | |
parent | 9a779e8e2d0925a4aece07c4102af359f6e5e980 (diff) | |
download | gtk+-357e2cbfff1c0b36035ea73007c8faf7c20daf64.tar.gz |
Make boolean string parsing consistent, #452464
2007-06-30 Johan Dahlin <jdahlin@async.com.br>
* gtk/gtkbuilder.c: (gtk_builder_value_from_string_type):
* gtk/gtkbuilderparser.c: (_gtk_builder_parse_boolean),
(parse_property), (parse_signal):
* gtk/gtkbuilderprivate.h:
* tests/buildertest.c: (test_value_from_string):
Make boolean string parsing consistent, #452464
svn path=/trunk/; revision=18305
Diffstat (limited to 'gtk/gtkbuilderparser.c')
-rw-r--r-- | gtk/gtkbuilderparser.c | 62 |
1 files changed, 59 insertions, 3 deletions
diff --git a/gtk/gtkbuilderparser.c b/gtk/gtkbuilderparser.c index a619a1f507..a18d5ec7c4 100644 --- a/gtk/gtkbuilderparser.c +++ b/gtk/gtkbuilderparser.c @@ -157,6 +157,55 @@ error_missing_property_value (ParserData *data, line_number, char_number); } +gboolean +_gtk_builder_parse_boolean (const gchar *string, + gboolean *value, + GError **error) +{ + gboolean retval = TRUE; + int i; + int length; + + g_assert (string != NULL); + length = strlen (string); + + if (length == 0) + retval = FALSE; + else if (length == 1) + { + gchar c = g_ascii_tolower (string[0]); + if (c == 'y' || c == 't' || c == '1') + *value = TRUE; + else if (c == 'n' || c == 'f' || c == '0') + *value = FALSE; + else + retval = FALSE; + } + else + { + gchar *lower = g_strdup (string); + for (i = 0; i < strlen (string); i++) + lower[i] = g_ascii_tolower (string[i]); + + if (strcmp (lower, "yes") == 0 || strcmp (lower, "true") == 0) + *value = TRUE; + else if (strcmp (lower, "no") == 0 || strcmp (lower, "false") == 0) + *value = FALSE; + else + retval = FALSE; + g_free (lower); + } + + if (!retval) + g_set_error (error, + GTK_BUILDER_ERROR, + GTK_BUILDER_ERROR_INVALID_VALUE, + "could not parse boolean `%s'", + string); + + return retval; +} + static GObject * builder_construct (ParserData *data, ObjectInfo *object_info) @@ -353,7 +402,10 @@ parse_property (ParserData *data, if (strcmp (names[i], "name") == 0) name = g_strdelimit (g_strdup (values[i]), "_", '-'); else if (strcmp (names[i], "translatable") == 0) - translatable = strcmp (values[i], "yes") == 0; + { + if (!_gtk_builder_parse_boolean (values[i], &translatable, error)) + return; + } else { error_invalid_attribute (data, element_name, names[i], error); @@ -408,10 +460,14 @@ parse_signal (ParserData *data, else if (strcmp (names[i], "handler") == 0) handler = g_strdup (values[i]); else if (strcmp (names[i], "after") == 0) - after = strcmp (values[i], "yes") == 0; + { + if (!_gtk_builder_parse_boolean (values[i], &after, error)) + return; + } else if (strcmp (names[i], "swapped") == 0) { - swapped = strcmp (values[i], "yes") == 0; + if (!_gtk_builder_parse_boolean (values[i], &swapped, error)) + return; swapped_set = TRUE; } else if (strcmp (names[i], "object") == 0) |