From 1a68afffaf2b762910684a5436ccf5c57b2641d1 Mon Sep 17 00:00:00 2001 From: Alexander Larsson Date: Fri, 25 Nov 2011 14:11:56 +0100 Subject: [PATCH] css: Add _gtk_css_parser_try_enum This helps parsing GType enums in CSS, properly handling CSS being case insensitive. --- gtk/gtkcssparser.c | 47 +++++++++++++++++++++++++++++++++++++++ gtk/gtkcssparserprivate.h | 3 +++ 2 files changed, 50 insertions(+) diff --git a/gtk/gtkcssparser.c b/gtk/gtkcssparser.c index ff44c35748..073e9478db 100644 --- a/gtk/gtkcssparser.c +++ b/gtk/gtkcssparser.c @@ -569,6 +569,53 @@ _gtk_css_parser_try_double (GtkCssParser *parser, return TRUE; } +gboolean +_gtk_css_parser_try_enum (GtkCssParser *parser, + GType enum_type, + int *value) +{ + GEnumClass *enum_class; + gboolean result; + const char *start; + char *str; + + g_return_val_if_fail (GTK_IS_CSS_PARSER (parser), FALSE); + g_return_val_if_fail (value != NULL, FALSE); + + result = FALSE; + + enum_class = g_type_class_ref (enum_type); + + start = parser->data; + + str = _gtk_css_parser_try_ident (parser, TRUE); + if (str == NULL) + return FALSE; + + if (enum_class->n_values) + { + GEnumValue *enum_value; + + for (enum_value = enum_class->values; enum_value->value_name; enum_value++) + { + if (enum_value->value_nick && + g_ascii_strcasecmp (str, enum_value->value_nick) == 0) + { + *value = enum_value->value; + result = TRUE; + break; + } + } + } + + g_type_class_unref (enum_class); + + if (!result) + parser->data = start; + + return result; +} + typedef enum { COLOR_RGBA, COLOR_RGB, diff --git a/gtk/gtkcssparserprivate.h b/gtk/gtkcssparserprivate.h index 6ea60a82ae..dd58fa6456 100644 --- a/gtk/gtkcssparserprivate.h +++ b/gtk/gtkcssparserprivate.h @@ -70,6 +70,9 @@ gboolean _gtk_css_parser_try_uint (GtkCssParser *parser guint *value); gboolean _gtk_css_parser_try_double (GtkCssParser *parser, gdouble *value); +gboolean _gtk_css_parser_try_enum (GtkCssParser *parser, + GType enum_type, + int *value); void _gtk_css_parser_skip_whitespace (GtkCssParser *parser); char * _gtk_css_parser_read_string (GtkCssParser *parser);