Make short string tokens static.
else if (gtk_css_token_is (token, GTK_CSS_TOKEN_HASH_ID) ||
gtk_css_token_is (token, GTK_CSS_TOKEN_HASH_UNRESTRICTED))
{
- const char *s = token->string.string;
+ const char *s = gtk_css_token_get_string (token);
switch (strlen (s))
{
{
*rgba = (GdkRGBA) { 0, 0, 0, 0 };
}
- else if (gdk_rgba_parse (rgba, token->string.string))
+ else if (gdk_rgba_parse (rgba, gtk_css_token_get_string (token)))
{
/* everything's fine */
}
else
{
- gtk_css_parser_error_syntax (parser, "\"%s\" is not a valid color name.", token->string.string);
+ gtk_css_parser_error_syntax (parser, "\"%s\" is not a valid color name.", gtk_css_token_get_string (token));
return FALSE;
}
if (!gtk_css_token_is (token, GTK_CSS_TOKEN_STRING))
return FALSE;
- s = g_strdup (token->string.string);
+ s = g_strdup (gtk_css_token_get_string (token));
gtk_css_parser_consume_token (parser);
g_free (*(char **) out_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);
+ gtk_css_token_get_string (gtk_css_parser_get_token (parser)));
else
gtk_css_parser_error_syntax (parser, "Expected a variable name");
}
if (gtk_css_parser_has_token (parser, GTK_CSS_TOKEN_IDENT))
gtk_css_parser_error_value (parser, "\"%s\" is not a valid node name",
- gtk_css_parser_get_token (parser)->string.string);
+ gtk_css_token_get_string (gtk_css_parser_get_token (parser)));
else
gtk_css_parser_error_syntax (parser, "Expected a node name");
token = gtk_css_parser_get_token (self);
g_return_val_if_fail (gtk_css_token_is (token, GTK_CSS_TOKEN_FUNCTION), FALSE);
- g_strlcpy (function_name, token->string.string, 64);
+ g_strlcpy (function_name, gtk_css_token_get_string (token), 64);
gtk_css_parser_start_block (self);
arg = 0;
token = gtk_css_parser_get_token (self);
return gtk_css_token_is (token, GTK_CSS_TOKEN_IDENT) &&
- g_ascii_strcasecmp (token->string.string, ident) == 0;
+ g_ascii_strcasecmp (gtk_css_token_get_string (token), ident) == 0;
}
gboolean
token = gtk_css_parser_get_token (self);
return gtk_css_token_is (token, GTK_CSS_TOKEN_FUNCTION) &&
- g_ascii_strcasecmp (token->string.string, name) == 0;
+ g_ascii_strcasecmp (gtk_css_token_get_string (token), name) == 0;
}
/**
token = gtk_css_parser_get_token (self);
if (!gtk_css_token_is (token, GTK_CSS_TOKEN_IDENT) ||
- g_ascii_strcasecmp (token->string.string, ident) != 0)
+ g_ascii_strcasecmp (gtk_css_token_get_string (token), ident) != 0)
return FALSE;
gtk_css_parser_consume_token (self);
token = gtk_css_parser_get_token (self);
if (!gtk_css_token_is (token, GTK_CSS_TOKEN_AT_KEYWORD) ||
- g_ascii_strcasecmp (token->string.string, keyword) != 0)
+ g_ascii_strcasecmp (gtk_css_token_get_string (token), keyword) != 0)
return FALSE;
gtk_css_parser_consume_token (self);
return NULL;
}
- ident = g_strdup (token->string.string);
+ ident = g_strdup (gtk_css_token_get_string (token));
gtk_css_parser_consume_token (self);
return ident;
return NULL;
}
- ident = g_strdup (token->string.string);
+ ident = g_strdup (gtk_css_token_get_string (token));
gtk_css_parser_consume_token (self);
return ident;
if (gtk_css_token_is (token, GTK_CSS_TOKEN_URL))
{
- url = g_strdup (token->string.string);
+ url = g_strdup (gtk_css_token_get_string (token));
gtk_css_parser_consume_token (self);
}
else if (gtk_css_token_is_function (token, "url"))
case GTK_CSS_TOKEN_HASH_UNRESTRICTED:
case GTK_CSS_TOKEN_HASH_ID:
case GTK_CSS_TOKEN_URL:
- g_free (token->string.string);
+ if (token->string.len >= 16)
+ g_free (token->string.u.string);
break;
case GTK_CSS_TOKEN_SIGNED_INTEGER_DIMENSION:
const char *ident)
{
return gtk_css_token_is (token, GTK_CSS_TOKEN_IDENT)
- && (g_ascii_strcasecmp (token->string.string, ident) == 0);
+ && (g_ascii_strcasecmp (gtk_css_token_get_string (token), ident) == 0);
}
gboolean
const char *ident)
{
return gtk_css_token_is (token, GTK_CSS_TOKEN_FUNCTION)
- && (g_ascii_strcasecmp (token->string.string, ident) == 0);
+ && (g_ascii_strcasecmp (gtk_css_token_get_string (token), ident) == 0);
}
gboolean
switch (token->type)
{
case GTK_CSS_TOKEN_STRING:
- append_string (string, token->string.string);
+ append_string (string, gtk_css_token_get_string (token));
break;
case GTK_CSS_TOKEN_IDENT:
- append_ident (string, token->string.string);
+ append_ident (string, gtk_css_token_get_string (token));
break;
case GTK_CSS_TOKEN_URL:
g_string_append (string, "url(");
- append_ident (string, token->string.string);
+ append_ident (string, gtk_css_token_get_string (token));
g_string_append (string, ")");
break;
case GTK_CSS_TOKEN_FUNCTION:
- append_ident (string, token->string.string);
+ append_ident (string, gtk_css_token_get_string (token));
g_string_append_c (string, '(');
break;
case GTK_CSS_TOKEN_AT_KEYWORD:
g_string_append_c (string, '@');
- append_ident (string, token->string.string);
+ append_ident (string, gtk_css_token_get_string (token));
break;
case GTK_CSS_TOKEN_HASH_UNRESTRICTED:
case GTK_CSS_TOKEN_HASH_ID:
g_string_append_c (string, '#');
- append_ident (string, token->string.string);
+ append_ident (string, gtk_css_token_get_string (token));
break;
case GTK_CSS_TOKEN_DELIM:
static void
gtk_css_token_init_string (GtkCssToken *token,
GtkCssTokenType type,
- char *string)
+ GString *string)
{
token->type = type;
case GTK_CSS_TOKEN_HASH_UNRESTRICTED:
case GTK_CSS_TOKEN_HASH_ID:
case GTK_CSS_TOKEN_URL:
- token->string.string = string;
+ token->string.len = string->len;
+ if (string->len < 16)
+ g_strlcpy (token->string.u.buf, string->str, 16);
+ else
+ token->string.u.string = g_strdup (string->str);
break;
default:
g_assert_not_reached ();
gtk_css_token_init_dimension (GtkCssToken *token,
GtkCssTokenType type,
double value,
- const char *dimension,
- int len)
+ GString *string)
{
token->type = type;
case GTK_CSS_TOKEN_SIGNED_DIMENSION:
case GTK_CSS_TOKEN_SIGNLESS_DIMENSION:
token->dimension.value = value;
- for (int i = 0; i < MIN (8, len); i++)
- {
- token->dimension.dimension[i] = dimension[i];
- if (dimension[i] == 0)
- break;
- }
- token->dimension.dimension[7] = 0;
+ g_strlcpy (token->dimension.dimension, string->str, 8);
break;
default:
g_assert_not_reached ();
return value;
}
-static char *
+static void
gtk_css_tokenizer_read_name (GtkCssTokenizer *tokenizer)
{
g_string_set_size (tokenizer->name_buffer, 0);
}
}
while (tokenizer->data != tokenizer->end);
-
- return g_strndup (tokenizer->name_buffer->str, tokenizer->name_buffer->len);
}
static void
}
}
- gtk_css_token_init_string (token, GTK_CSS_TOKEN_URL, g_string_free (url, FALSE));
+ gtk_css_token_init_string (token, GTK_CSS_TOKEN_URL, url);
+ g_string_free (url, TRUE);
return TRUE;
}
GtkCssToken *token,
GError **error)
{
- char *name = gtk_css_tokenizer_read_name (tokenizer);
+ gtk_css_tokenizer_read_name (tokenizer);
if (*tokenizer->data == '(')
{
gtk_css_tokenizer_consume_ascii (tokenizer);
- if (g_ascii_strcasecmp (name, "url") == 0)
+ if (g_ascii_strcasecmp (tokenizer->name_buffer->str, "url") == 0)
{
const char *data = tokenizer->data;
data++;
if (*data != '"' && *data != '\'')
- {
- g_free (name);
- return gtk_css_tokenizer_read_url (tokenizer, token, error);
- }
+ return gtk_css_tokenizer_read_url (tokenizer, token, error);
}
- gtk_css_token_init_string (token, GTK_CSS_TOKEN_FUNCTION, name);
+ gtk_css_token_init_string (token, GTK_CSS_TOKEN_FUNCTION, tokenizer->name_buffer);
return TRUE;
}
else
{
- gtk_css_token_init_string (token, GTK_CSS_TOKEN_IDENT, name);
+ gtk_css_token_init_string (token, GTK_CSS_TOKEN_IDENT, tokenizer->name_buffer);
return TRUE;
}
}
else
type = has_sign ? GTK_CSS_TOKEN_SIGNED_DIMENSION : GTK_CSS_TOKEN_SIGNLESS_DIMENSION;
- char *name = gtk_css_tokenizer_read_name (tokenizer);
- gtk_css_token_init_dimension (token, type, value, name, strlen (name));
+ gtk_css_tokenizer_read_name (tokenizer);
+ gtk_css_token_init_dimension (token, type, value, tokenizer->name_buffer);
}
else if (gtk_css_tokenizer_remaining (tokenizer) > 0 && *tokenizer->data == '%')
{
}
}
- gtk_css_token_init_string (token, GTK_CSS_TOKEN_STRING, g_strdup (tokenizer->name_buffer->str));
+ gtk_css_token_init_string (token, GTK_CSS_TOKEN_STRING, tokenizer->name_buffer);
return TRUE;
}
else
type = GTK_CSS_TOKEN_HASH_UNRESTRICTED;
- gtk_css_token_init_string (token,
- type,
- gtk_css_tokenizer_read_name (tokenizer));
+ gtk_css_tokenizer_read_name (tokenizer);
+ gtk_css_token_init_string (token, type, tokenizer->name_buffer);
}
else
{
gtk_css_tokenizer_consume_ascii (tokenizer);
if (gtk_css_tokenizer_has_identifier (tokenizer))
{
- gtk_css_token_init_string (token,
- GTK_CSS_TOKEN_AT_KEYWORD,
- gtk_css_tokenizer_read_name (tokenizer));
+ gtk_css_tokenizer_read_name (tokenizer);
+ gtk_css_token_init_string (token, GTK_CSS_TOKEN_AT_KEYWORD, tokenizer->name_buffer);
}
else
{
struct _GtkCssStringToken {
GtkCssTokenType type;
- char *string;
+ int len;
+ union {
+ char buf[16];
+ char *string;
+ } u;
};
struct _GtkCssDelimToken {
GtkCssDimensionToken dimension;
};
+static inline const char *
+gtk_css_token_get_string (const GtkCssToken *token)
+{
+ if (token->string.len < 16)
+ return token->string.u.buf;
+ else
+ return token->string.u.string;
+}
+
void gtk_css_token_clear (GtkCssToken *token);
gboolean gtk_css_token_is_finite (const GtkCssToken *token) G_GNUC_PURE;
{
const GtkCssToken *token = gtk_css_parser_get_token (parser);
- value = _gtk_css_color_value_new_name (token->string.string);
+ value = _gtk_css_color_value_new_name (gtk_css_token_get_string (token));
gtk_css_parser_consume_token (parser);
return value;
selector = gtk_css_selector_new (negate ? >K_CSS_SELECTOR_NOT_CLASS
: >K_CSS_SELECTOR_CLASS,
selector);
- selector->style_class.style_class = g_quark_from_string (token->string.string);
+ selector->style_class.style_class = g_quark_from_string (gtk_css_token_get_string (token));
gtk_css_parser_consume_token (parser);
return selector;
}
return parse_plus_b (parser, TRUE, b);
}
else if (gtk_css_token_is (token, GTK_CSS_TOKEN_IDENT) &&
- string_has_number (token->string.string, "n-", b))
+ string_has_number (gtk_css_token_get_string (token), "n-", b))
{
*a = before;
*b = -*b;
}
else if (!seen_sign &&
gtk_css_token_is (token, GTK_CSS_TOKEN_IDENT) &&
- string_has_number (token->string.string, "-n-", b))
+ string_has_number (gtk_css_token_get_string (token), "-n-", b))
{
*a = -1;
*b = -*b;
return parse_n_plus_b (parser, seen_sign ? seen_sign : 1, a, b);
}
else if (gtk_css_token_is (token, GTK_CSS_TOKEN_IDENT) &&
- string_has_number (token->string.string, "n-", b))
+ string_has_number (gtk_css_token_get_string (token), "n-", b))
{
*a = seen_sign ? seen_sign : 1;
*b = -*b;
return TRUE;
}
else if (!seen_sign && gtk_css_token_is (token, GTK_CSS_TOKEN_IDENT) &&
- string_has_number (token->string.string, "-n-", b))
+ string_has_number (gtk_css_token_get_string (token), "-n-", b))
{
*a = -1;
*b = -*b;
for (i = 0; i < G_N_ELEMENTS (pseudo_classes); i++)
{
- if (g_ascii_strcasecmp (pseudo_classes[i].name, token->string.string) == 0)
+ if (g_ascii_strcasecmp (pseudo_classes[i].name, gtk_css_token_get_string (token)) == 0)
{
if (pseudo_classes[i].state_flag)
{
else if (gtk_css_token_is (token, GTK_CSS_TOKEN_IDENT))
{
selector = gtk_css_selector_new (>K_CSS_SELECTOR_NOT_NAME, selector);
- selector->name.name = g_quark_from_string (token->string.string);
+ selector->name.name = g_quark_from_string (gtk_css_token_get_string (token));
gtk_css_parser_consume_token (parser);
}
else if (gtk_css_token_is (token, GTK_CSS_TOKEN_HASH_ID))
{
selector = gtk_css_selector_new (>K_CSS_SELECTOR_NOT_ID, selector);
- selector->id.name = g_quark_from_string (token->string.string);
+ selector->id.name = g_quark_from_string (gtk_css_token_get_string (token));
gtk_css_parser_consume_token (parser);
}
else if (gtk_css_token_is_delim (token, '.'))
else if (!parsed_something && gtk_css_token_is (token, GTK_CSS_TOKEN_IDENT))
{
selector = gtk_css_selector_new (>K_CSS_SELECTOR_NAME, selector);
- selector->name.name = g_quark_from_string (token->string.string);
+ selector->name.name = g_quark_from_string (gtk_css_token_get_string (token));
gtk_css_parser_consume_token (parser);
}
else if (gtk_css_token_is (token, GTK_CSS_TOKEN_HASH_ID))
{
selector = gtk_css_selector_new (>K_CSS_SELECTOR_ID, selector);
- selector->id.name = g_quark_from_string (token->string.string);
+ selector->id.name = g_quark_from_string (gtk_css_token_get_string (token));
gtk_css_parser_consume_token (parser);
}
else if (gtk_css_token_is_delim (token, '.'))