char * _gtk_css_parser_try_ident (GtkCssParser *parser, gboolean skip_whitespace) { const char *start; GString *ident; g_return_val_if_fail (GTK_IS_CSS_PARSER (parser), NULL); start = parser->data; ident = g_string_new (NULL); if (*parser->data == '-') { g_string_append_c (ident, '-'); parser->data++; } if (!_gtk_css_parser_read_char (parser, ident, NMSTART)) { parser->data = start; g_string_free (ident, TRUE); return NULL; } while (_gtk_css_parser_read_char (parser, ident, NMCHAR)) ; if (skip_whitespace) _gtk_css_parser_skip_whitespace (parser); return g_string_free (ident, FALSE); }
char * _gtk_css_parser_read_uri (GtkCssParser *parser) { char *result; g_return_val_if_fail (GTK_IS_CSS_PARSER (parser), NULL); if (!_gtk_css_parser_try (parser, "url(", TRUE)) { _gtk_css_parser_error (parser, "expected 'url('"); return NULL; } _gtk_css_parser_skip_whitespace (parser); if (_gtk_css_parser_is_string (parser)) { result = _gtk_css_parser_read_string (parser); } else { GString *str = g_string_new (NULL); while (_gtk_css_parser_read_char (parser, str, URLCHAR)) ; result = g_string_free (str, FALSE); if (result == NULL) _gtk_css_parser_error (parser, "not a url"); } if (result == NULL) return NULL; _gtk_css_parser_skip_whitespace (parser); if (*parser->data != ')') { _gtk_css_parser_error (parser, "missing ')' for url"); g_free (result); return NULL; } parser->data++; _gtk_css_parser_skip_whitespace (parser); return result; }
char * _gtk_css_parser_try_name (GtkCssParser *parser, gboolean skip_whitespace) { GString *name; g_return_val_if_fail (GTK_IS_CSS_PARSER (parser), NULL); name = g_string_new (NULL); while (_gtk_css_parser_read_char (parser, name, NMCHAR)) ; if (skip_whitespace) _gtk_css_parser_skip_whitespace (parser); return g_string_free (name, FALSE); }