From cb8a595a6563e7a6be0f3dba29fd5c879de46a86 Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Sun, 10 Apr 2011 01:48:55 +0200 Subject: [PATCH] cssprovider: Clean up declaration parser to conform to more tests The tests will follow with the next commits --- gtk/gtkcssprovider.c | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/gtk/gtkcssprovider.c b/gtk/gtkcssprovider.c index 8bb594d74b..8fb9f6e427 100644 --- a/gtk/gtkcssprovider.c +++ b/gtk/gtkcssprovider.c @@ -2413,10 +2413,14 @@ parse_rule (GtkCssProvider *css_provider, if (scanner->token != G_TOKEN_IDENTIFIER) { g_free (prop); + /* the error value here is hacky. But strings should be used for + * strings really, so a string is not a syntax error but a broken + * value for everything that we support. */ gtk_css_provider_error (css_provider, GTK_CSS_PROVIDER_ERROR, - GTK_CSS_PROVIDER_ERROR_PROPERTY_VALUE, - "Could not parse property value"); + scanner->token == G_TOKEN_STRING ? GTK_CSS_PROVIDER_ERROR_PROPERTY_VALUE + : GTK_CSS_PROVIDER_ERROR_SYNTAX, + "Not a property value"); css_provider_pop_scope (css_provider); goto find_end_of_declaration; } @@ -2424,6 +2428,18 @@ parse_rule (GtkCssProvider *css_provider, value_str = scanner->value.v_identifier; g_strchomp (value_str); + css_provider_pop_scope (css_provider); + g_scanner_peek_next_token (scanner); + + if (scanner->next_token != ';' && + scanner->next_token != G_TOKEN_RIGHT_CURLY && + scanner->next_token != G_TOKEN_EOF) + { + gtk_css_provider_invalid_token (css_provider, "';'"); + g_free (prop); + goto find_end_of_declaration; + } + if (pspec) { GValue *val; @@ -2508,17 +2524,17 @@ parse_rule (GtkCssProvider *css_provider, else g_free (prop); - css_provider_pop_scope (css_provider); g_scanner_get_next_token (scanner); - if (scanner->token != ';' && - scanner->token != G_TOKEN_RIGHT_CURLY) + if (g_scanner_eof (scanner)) { - gtk_css_provider_invalid_token (css_provider, "';'"); + gtk_css_provider_invalid_token (css_provider, "}"); + break; } find_end_of_declaration: - while (scanner->token != G_TOKEN_RIGHT_CURLY && + while (scanner->token != ';' && + scanner->token != G_TOKEN_RIGHT_CURLY && !g_scanner_eof (scanner)) g_scanner_get_next_token (scanner); }