summaryrefslogtreecommitdiff
path: root/gtk/gtkbuilderparser.c
diff options
context:
space:
mode:
authorJohan Dahlin <jdahlin@async.com.br>2007-06-30 06:57:47 +0000
committerJohan Dahlin <johan@src.gnome.org>2007-06-30 06:57:47 +0000
commit357e2cbfff1c0b36035ea73007c8faf7c20daf64 (patch)
tree83a8dc38f1d088058812ad329f2110604cb9f1d6 /gtk/gtkbuilderparser.c
parent9a779e8e2d0925a4aece07c4102af359f6e5e980 (diff)
downloadgtk+-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.c62
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)