forked from AuroraMiddleware/gtk
cssprovider: Rework declaration parsing loop
The new loop can cope better with invalid identifiers and manages to resume parsing properly.
This commit is contained in:
parent
fbf658b04e
commit
22bda2b92f
@ -1587,6 +1587,16 @@ gtk_css_provider_take_error (GtkCssProvider *provider,
|
|||||||
g_error_free (error);
|
g_error_free (error);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gtk_css_provider_error_literal (GtkCssProvider *provider,
|
||||||
|
GQuark domain,
|
||||||
|
gint code,
|
||||||
|
const char *message)
|
||||||
|
{
|
||||||
|
gtk_css_provider_take_error (provider,
|
||||||
|
g_error_new_literal (domain, code, message));
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gtk_css_provider_error (GtkCssProvider *provider,
|
gtk_css_provider_error (GtkCssProvider *provider,
|
||||||
GQuark domain,
|
GQuark domain,
|
||||||
@ -2348,15 +2358,32 @@ parse_rule (GtkCssProvider *css_provider,
|
|||||||
|
|
||||||
/* Declarations parsing */
|
/* Declarations parsing */
|
||||||
css_provider_push_scope (css_provider, SCOPE_DECLARATION);
|
css_provider_push_scope (css_provider, SCOPE_DECLARATION);
|
||||||
g_scanner_get_next_token (scanner);
|
|
||||||
|
|
||||||
while (scanner->token == G_TOKEN_IDENTIFIER)
|
g_scanner_get_next_token (scanner);
|
||||||
|
|
||||||
|
while (scanner->token != G_TOKEN_RIGHT_CURLY &&
|
||||||
|
!g_scanner_eof (scanner))
|
||||||
{
|
{
|
||||||
gchar *value_str = NULL;
|
gchar *value_str = NULL;
|
||||||
GtkStylePropertyParser parse_func = NULL;
|
GtkStylePropertyParser parse_func = NULL;
|
||||||
GParamSpec *pspec = NULL;;
|
GParamSpec *pspec = NULL;;
|
||||||
gchar *prop;
|
gchar *prop;
|
||||||
|
|
||||||
|
if (scanner->token == ';')
|
||||||
|
{
|
||||||
|
g_scanner_get_next_token (scanner);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (scanner->token != G_TOKEN_IDENTIFIER)
|
||||||
|
{
|
||||||
|
gtk_css_provider_error_literal (css_provider,
|
||||||
|
GTK_CSS_PROVIDER_ERROR,
|
||||||
|
GTK_CSS_PROVIDER_ERROR_PROPERTY_NAME,
|
||||||
|
"Expected a valid property name");
|
||||||
|
goto find_end_of_declaration;
|
||||||
|
}
|
||||||
|
|
||||||
prop = g_strdup (scanner->value.v_identifier);
|
prop = g_strdup (scanner->value.v_identifier);
|
||||||
|
|
||||||
if (!gtk_style_properties_lookup_property (prop, &parse_func, &pspec) &&
|
if (!gtk_style_properties_lookup_property (prop, &parse_func, &pspec) &&
|
||||||
@ -2491,22 +2518,11 @@ parse_rule (GtkCssProvider *css_provider,
|
|||||||
}
|
}
|
||||||
|
|
||||||
find_end_of_declaration:
|
find_end_of_declaration:
|
||||||
while (scanner->token != ';' &&
|
while (scanner->token != G_TOKEN_RIGHT_CURLY &&
|
||||||
scanner->token != G_TOKEN_RIGHT_CURLY &&
|
!g_scanner_eof (scanner))
|
||||||
scanner->token != G_TOKEN_EOF)
|
|
||||||
g_scanner_get_next_token (scanner);
|
g_scanner_get_next_token (scanner);
|
||||||
|
|
||||||
if (scanner->token == G_TOKEN_RIGHT_CURLY ||
|
|
||||||
scanner->token == G_TOKEN_EOF)
|
|
||||||
break;
|
|
||||||
|
|
||||||
g_scanner_get_next_token (scanner);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (scanner->token != G_TOKEN_RIGHT_CURLY &&
|
|
||||||
scanner->token != G_TOKEN_EOF)
|
|
||||||
return G_TOKEN_RIGHT_CURLY;
|
|
||||||
|
|
||||||
css_provider_pop_scope (css_provider);
|
css_provider_pop_scope (css_provider);
|
||||||
|
|
||||||
return G_TOKEN_NONE;
|
return G_TOKEN_NONE;
|
||||||
|
Loading…
Reference in New Issue
Block a user