diff options
author | Benjamin Otte <otte@redhat.com> | 2019-05-13 00:59:15 +0200 |
---|---|---|
committer | Benjamin Otte <otte@redhat.com> | 2019-05-13 00:59:15 +0200 |
commit | 57061ea7dfb011081298558a3655164cf83ec050 (patch) | |
tree | 913981d0886e5c89ba021c3450be4871d34b4b04 /gsk/gskrendernodeparser.c | |
parent | ed4af4e7777f98484593f6b046d70402d2099903 (diff) | |
download | gtk+-57061ea7dfb011081298558a3655164cf83ec050.tar.gz |
rendernodeparser: Move EOF test into parse_declarations()
This way, we don't have to duplicate code.
Plus, we can ensure to clear the erroneously parsed value that should
not be used.
Diffstat (limited to 'gsk/gskrendernodeparser.c')
-rw-r--r-- | gsk/gskrendernodeparser.c | 127 |
1 files changed, 34 insertions, 93 deletions
diff --git a/gsk/gskrendernodeparser.c b/gsk/gskrendernodeparser.c index 81a2e8e899..e0b881310d 100644 --- a/gsk/gskrendernodeparser.c +++ b/gsk/gskrendernodeparser.c @@ -22,24 +22,8 @@ struct _Declaration }; static gboolean -check_eof (GtkCssParser *parser) -{ - const GtkCssToken *token; - - token = gtk_css_parser_get_token (parser); - if (!gtk_css_token_is (token, GTK_CSS_TOKEN_EOF)) - { - gtk_css_parser_error_syntax (parser, "Expected ';' at end of statement"); - return FALSE; - } - - gtk_css_parser_consume_token (parser); - return TRUE; -} - -static gboolean -parse_rect_without_semicolon (GtkCssParser *parser, - graphene_rect_t *out_rect) +parse_rect (GtkCssParser *parser, + gpointer out_rect) { double numbers[4]; @@ -55,20 +39,6 @@ parse_rect_without_semicolon (GtkCssParser *parser, } static gboolean -parse_rect (GtkCssParser *parser, - gpointer out_rect) -{ - graphene_rect_t r; - - if (!parse_rect_without_semicolon (parser, &r) || - !check_eof (parser)) - return FALSE; - - graphene_rect_init_from_rect (out_rect, &r); - return TRUE; -} - -static gboolean parse_texture (GtkCssParser *parser, gpointer out_data) { @@ -126,12 +96,6 @@ parse_texture (GtkCssParser *parser, return FALSE; } - if (!check_eof (parser)) - { - g_object_unref (texture); - return FALSE; - } - *(GdkTexture **) out_data = texture; return TRUE; } @@ -151,13 +115,11 @@ parse_rounded_rect (GtkCssParser *parser, double d; guint i; - if (!parse_rect_without_semicolon (parser, &r)) + if (!parse_rect (parser, &r)) return FALSE; if (!gtk_css_parser_try_delim (parser, '/')) { - if (!check_eof (parser)) - return FALSE; gsk_rounded_rect_init_from_rect (out_rect, &r, 0); return TRUE; } @@ -211,9 +173,6 @@ parse_rounded_rect (GtkCssParser *parser, corners[i].height = corners[i].width; } - if (!check_eof (parser)) - return FALSE; - gsk_rounded_rect_init (out_rect, &r, &corners[0], &corners[1], &corners[2], &corners[3]); return TRUE; @@ -223,30 +182,14 @@ static gboolean parse_color (GtkCssParser *parser, gpointer out_color) { - GdkRGBA color; - - if (!gdk_rgba_parser_parse (parser, &color) || - !check_eof (parser)) - return FALSE; - - *(GdkRGBA *) out_color = color; - - return TRUE; + return gdk_rgba_parser_parse (parser, out_color); } static gboolean parse_double (GtkCssParser *parser, gpointer out_double) { - double d; - - if (!gtk_css_parser_consume_number (parser, &d) || - !check_eof (parser)) - return FALSE; - - *(double *) out_double = d; - - return TRUE; + return gtk_css_parser_consume_number (parser, out_double); } static gboolean @@ -256,8 +199,7 @@ parse_point (GtkCssParser *parser, double x, y; if (!gtk_css_parser_consume_number (parser, &x) || - !gtk_css_parser_consume_number (parser, &y) || - !check_eof (parser)) + !gtk_css_parser_consume_number (parser, &y)) return FALSE; graphene_point_init (out_point, x, y); @@ -271,14 +213,12 @@ parse_transform (GtkCssParser *parser, { GskTransform *transform; - if (!gsk_transform_parser_parse (parser, &transform) || - !check_eof (parser)) + if (!gsk_transform_parser_parse (parser, &transform)) { gsk_transform_unref (transform); return FALSE; } - gsk_transform_unref (*(GskTransform **) out_transform); *(GskTransform **) out_transform = transform; return TRUE; @@ -304,12 +244,6 @@ parse_string (GtkCssParser *parser, s = g_strdup (token->string.string); gtk_css_parser_consume_token (parser); - if (!check_eof (parser)) - { - g_free (s); - return FALSE; - } - g_free (*(char **) out_string); *(char **) out_string = s; @@ -365,7 +299,7 @@ parse_stops (GtkCssParser *parser, g_array_free (*(GArray **) out_stops, TRUE); *(GArray **) out_stops = stops; - return check_eof (parser); + return TRUE; error: g_array_free (stops, TRUE); @@ -397,7 +331,7 @@ parse_colors4 (GtkCssParser *parser, return FALSE; } - return check_eof (parser); + return TRUE; } static gboolean @@ -435,7 +369,7 @@ parse_shadows (GtkCssParser *parser, break; } - return check_eof (parser); + return TRUE; } static void @@ -477,8 +411,6 @@ parse_blend_mode (GtkCssParser *parser, { if (gtk_css_parser_try_ident (parser, blend_modes[i].name)) { - if (!check_eof (parser)) - return FALSE; *(GskBlendMode *) out_mode = blend_modes[i].mode; return TRUE; } @@ -514,7 +446,7 @@ parse_font (GtkCssParser *parser, /* Skip font name token */ gtk_css_parser_consume_token (parser); - return check_eof (parser); + return TRUE; } static void @@ -573,7 +505,7 @@ parse_glyphs (GtkCssParser *parser, *((PangoGlyphString **)out_glyphs) = glyph_string; - return check_eof (parser); + return TRUE; } static void @@ -630,45 +562,54 @@ parse_declarations (GtkCssParser *parser, { guint parsed = 0; guint i; - const GtkCssToken *token; g_assert (n_declarations < 8 * sizeof (guint)); - for (token = gtk_css_parser_get_token (parser); - !gtk_css_token_is (token, GTK_CSS_TOKEN_EOF); - token = gtk_css_parser_get_token (parser)) + while (!gtk_css_parser_has_token (parser, GTK_CSS_TOKEN_EOF)) { gtk_css_parser_start_semicolon_block (parser, GTK_CSS_TOKEN_OPEN_CURLY); for (i = 0; i < n_declarations; i++) { - if (gtk_css_token_is_ident (token, declarations[i].name)) + if (gtk_css_parser_try_ident (parser, declarations[i].name)) { - gtk_css_parser_consume_token (parser); - token = gtk_css_parser_get_token (parser); - if (!gtk_css_token_is (token, GTK_CSS_TOKEN_COLON)) + if (!gtk_css_parser_try_token (parser, GTK_CSS_TOKEN_COLON)) { gtk_css_parser_error_syntax (parser, "Expected ':' after variable declaration"); } else { - gtk_css_parser_consume_token (parser); if (parsed & (1 << i)) { gtk_css_parser_warn_syntax (parser, "Variable \"%s\" defined multiple times", declarations[i].name); + /* Unset, just to be sure */ + parsed &= ~(1 << i); if (declarations[i].clear_func) declarations[i].clear_func (declarations[i].result); } - if (declarations[i].parse_func (parser, declarations[i].result)) - parsed |= (1 << i); + if (!declarations[i].parse_func (parser, declarations[i].result)) + { + /* nothing to do */ + } + else if (!gtk_css_parser_has_token (parser, GTK_CSS_TOKEN_EOF)) + { + gtk_css_parser_error_syntax (parser, "Expected ';' at end of statement"); + if (declarations[i].clear_func) + declarations[i].clear_func (declarations[i].result); + } + else + { + parsed |= (1 << i); + } } break; } } if (i == n_declarations) { - if (gtk_css_token_is (token, GTK_CSS_TOKEN_IDENT)) - gtk_css_parser_error_syntax (parser, "No variable named \"%s\"", token->string.string); + if (gtk_css_parser_has_token (parser, GTK_CSS_TOKEN_IDENT)) + gtk_css_parser_error_syntax (parser, "No variable named \"%s\"", + gtk_css_parser_get_token (parser)->string.string); else gtk_css_parser_error_syntax (parser, "Expected a variable name"); } |