From c11bd57422a1d84a2e507b020461f4afd74f0726 Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Thu, 21 Oct 2021 00:05:19 +0200 Subject: [PATCH 1/2] css: Split dimension token Add a signed and an unsigned version. This will become useful real soon. --- gtk/css/gtkcsstokenizer.c | 17 +++++++++++------ gtk/css/gtkcsstokenizerprivate.h | 3 ++- gtk/gtkcssdimensionvalue.c | 3 ++- gtk/gtkcssnumbervalue.c | 3 ++- 4 files changed, 17 insertions(+), 9 deletions(-) diff --git a/gtk/css/gtkcsstokenizer.c b/gtk/css/gtkcsstokenizer.c index 05fca8ed01..a6d14abc21 100644 --- a/gtk/css/gtkcsstokenizer.c +++ b/gtk/css/gtkcsstokenizer.c @@ -55,7 +55,8 @@ gtk_css_token_clear (GtkCssToken *token) case GTK_CSS_TOKEN_SIGNED_INTEGER_DIMENSION: case GTK_CSS_TOKEN_SIGNLESS_INTEGER_DIMENSION: - case GTK_CSS_TOKEN_DIMENSION: + case GTK_CSS_TOKEN_SIGNED_DIMENSION: + case GTK_CSS_TOKEN_SIGNLESS_DIMENSION: g_free (token->dimension.dimension); break; @@ -206,7 +207,8 @@ gtk_css_token_is_finite (const GtkCssToken *token) case GTK_CSS_TOKEN_BAD_URL: case GTK_CSS_TOKEN_SIGNED_INTEGER_DIMENSION: case GTK_CSS_TOKEN_SIGNLESS_INTEGER_DIMENSION: - case GTK_CSS_TOKEN_DIMENSION: + case GTK_CSS_TOKEN_SIGNED_DIMENSION: + case GTK_CSS_TOKEN_SIGNLESS_DIMENSION: return FALSE; } } @@ -281,7 +283,8 @@ gtk_css_token_is_preserved (const GtkCssToken *token, case GTK_CSS_TOKEN_BAD_URL: case GTK_CSS_TOKEN_SIGNED_INTEGER_DIMENSION: case GTK_CSS_TOKEN_SIGNLESS_INTEGER_DIMENSION: - case GTK_CSS_TOKEN_DIMENSION: + case GTK_CSS_TOKEN_SIGNED_DIMENSION: + case GTK_CSS_TOKEN_SIGNLESS_DIMENSION: if (out_closing) *out_closing = GTK_CSS_TOKEN_EOF; return TRUE; @@ -372,11 +375,12 @@ gtk_css_token_print (const GtkCssToken *token, break; case GTK_CSS_TOKEN_SIGNED_INTEGER_DIMENSION: + case GTK_CSS_TOKEN_SIGNED_DIMENSION: if (token->dimension.value >= 0) g_string_append_c (string, '+'); G_GNUC_FALLTHROUGH; case GTK_CSS_TOKEN_SIGNLESS_INTEGER_DIMENSION: - case GTK_CSS_TOKEN_DIMENSION: + case GTK_CSS_TOKEN_SIGNLESS_DIMENSION: g_ascii_dtostr (buf, G_ASCII_DTOSTR_BUF_SIZE, token->dimension.value); g_string_append (string, buf); append_ident (string, token->dimension.dimension); @@ -549,7 +553,8 @@ gtk_css_token_init_dimension (GtkCssToken *token, { case GTK_CSS_TOKEN_SIGNED_INTEGER_DIMENSION: case GTK_CSS_TOKEN_SIGNLESS_INTEGER_DIMENSION: - case GTK_CSS_TOKEN_DIMENSION: + case GTK_CSS_TOKEN_SIGNED_DIMENSION: + case GTK_CSS_TOKEN_SIGNLESS_DIMENSION: token->dimension.value = value; token->dimension.dimension = dimension; break; @@ -1122,7 +1127,7 @@ gtk_css_tokenizer_read_numeric (GtkCssTokenizer *tokenizer, if (is_int) type = has_sign ? GTK_CSS_TOKEN_SIGNED_INTEGER_DIMENSION : GTK_CSS_TOKEN_SIGNLESS_INTEGER_DIMENSION; else - type = GTK_CSS_TOKEN_DIMENSION; + type = has_sign ? GTK_CSS_TOKEN_SIGNED_DIMENSION : GTK_CSS_TOKEN_SIGNLESS_DIMENSION; gtk_css_token_init_dimension (token, type, value, gtk_css_tokenizer_read_name (tokenizer)); } diff --git a/gtk/css/gtkcsstokenizerprivate.h b/gtk/css/gtkcsstokenizerprivate.h index 40447b0b89..6211ef722f 100644 --- a/gtk/css/gtkcsstokenizerprivate.h +++ b/gtk/css/gtkcsstokenizerprivate.h @@ -67,7 +67,8 @@ typedef enum { /* dimension */ GTK_CSS_TOKEN_SIGNED_INTEGER_DIMENSION, GTK_CSS_TOKEN_SIGNLESS_INTEGER_DIMENSION, - GTK_CSS_TOKEN_DIMENSION + GTK_CSS_TOKEN_SIGNED_DIMENSION, + GTK_CSS_TOKEN_SIGNLESS_DIMENSION } GtkCssTokenType; typedef union _GtkCssToken GtkCssToken; diff --git a/gtk/gtkcssdimensionvalue.c b/gtk/gtkcssdimensionvalue.c index 84a1d0e780..4bc0c32a6a 100644 --- a/gtk/gtkcssdimensionvalue.c +++ b/gtk/gtkcssdimensionvalue.c @@ -93,7 +93,8 @@ gtk_css_dimension_value_parse (GtkCssParser *parser, } else if (gtk_css_token_is (token, GTK_CSS_TOKEN_SIGNED_INTEGER_DIMENSION) || gtk_css_token_is (token, GTK_CSS_TOKEN_SIGNLESS_INTEGER_DIMENSION) || - gtk_css_token_is (token, GTK_CSS_TOKEN_DIMENSION)) + gtk_css_token_is (token, GTK_CSS_TOKEN_SIGNED_DIMENSION) || + gtk_css_token_is (token, GTK_CSS_TOKEN_SIGNLESS_DIMENSION)) { guint i; diff --git a/gtk/gtkcssnumbervalue.c b/gtk/gtkcssnumbervalue.c index dacf9c4476..7b2dbeacc9 100644 --- a/gtk/gtkcssnumbervalue.c +++ b/gtk/gtkcssnumbervalue.c @@ -704,7 +704,8 @@ gtk_css_number_value_can_parse (GtkCssParser *parser) || gtk_css_parser_has_token (parser, GTK_CSS_TOKEN_PERCENTAGE) || gtk_css_parser_has_token (parser, GTK_CSS_TOKEN_SIGNED_INTEGER_DIMENSION) || gtk_css_parser_has_token (parser, GTK_CSS_TOKEN_SIGNLESS_INTEGER_DIMENSION) - || gtk_css_parser_has_token (parser, GTK_CSS_TOKEN_DIMENSION) + || gtk_css_parser_has_token (parser, GTK_CSS_TOKEN_SIGNED_DIMENSION) + || gtk_css_parser_has_token (parser, GTK_CSS_TOKEN_SIGNLESS_DIMENSION) || gtk_css_parser_has_function (parser, "calc"); } From 350a5edb87c447d7ef302df08cdd993e6425e8f0 Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Thu, 21 Oct 2021 00:05:56 +0200 Subject: [PATCH 2/2] css: Emit a special error for a common error This CSS: calc(5px+3px) is wrong because it gets broken to: calc( 5px +3px ) which is 2 numbers inside the calc, and what you want is: calc( 5px + 3px ) but you need to add a space to get this, like so: calc(5px + 3px) which is the recommended way to write calc() statements. So whenever we encounter an error, check if the next token is a signed number and if so, include it in the error message. --- gtk/gtkcsscalcvalue.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/gtk/gtkcsscalcvalue.c b/gtk/gtkcsscalcvalue.c index ad7380b990..d0731b267b 100644 --- a/gtk/gtkcsscalcvalue.c +++ b/gtk/gtkcsscalcvalue.c @@ -166,6 +166,14 @@ gtk_css_calc_value_parse_sum (GtkCssParser *parser, } else { + if (gtk_css_parser_has_token (parser, GTK_CSS_TOKEN_SIGNED_INTEGER) || + gtk_css_parser_has_token (parser, GTK_CSS_TOKEN_SIGNED_NUMBER) || + gtk_css_parser_has_token (parser, GTK_CSS_TOKEN_SIGNED_INTEGER_DIMENSION) || + gtk_css_parser_has_token (parser, GTK_CSS_TOKEN_SIGNED_DIMENSION)) + { + gtk_css_parser_error_syntax (parser, "Unexpected signed number, did you forget a space between sign and number?"); + gtk_css_parser_consume_token (parser); + } break; }