diff --git a/gtk/Makefile.am b/gtk/Makefile.am index f359fe4c05..351545bdf6 100644 --- a/gtk/Makefile.am +++ b/gtk/Makefile.am @@ -445,6 +445,7 @@ gtk_private_h_sources = \ gtkcssselectorprivate.h \ gtkcssshadowvalueprivate.h \ gtkcssshorthandpropertyprivate.h \ + gtkcssstringvalueprivate.h \ gtkcssstylefuncsprivate.h \ gtkcssstylepropertyprivate.h \ gtkcssvalueprivate.h \ @@ -647,6 +648,7 @@ gtk_base_c_sources = \ gtkcssrgbavalue.c \ gtkcsssection.c \ gtkcssselector.c \ + gtkcssstringvalue.c \ gtkcssshadowvalue.c \ gtkcssshorthandproperty.c \ gtkcssshorthandpropertyimpl.c \ diff --git a/gtk/gtkcssstringvalue.c b/gtk/gtkcssstringvalue.c new file mode 100644 index 0000000000..16debf991c --- /dev/null +++ b/gtk/gtkcssstringvalue.c @@ -0,0 +1,128 @@ +/* GTK - The GIMP Toolkit + * Copyright (C) 2011 Red Hat, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see . + */ + +#include "config.h" + +#include "gtkcssstringvalueprivate.h" + +#include + +struct _GtkCssValue { + GTK_CSS_VALUE_BASE + char *string; +}; + +static void +gtk_css_value_string_free (GtkCssValue *value) +{ + g_slice_free (GtkCssValue, value); +} + +static gboolean +gtk_css_value_string_equal (const GtkCssValue *value1, + const GtkCssValue *value2) +{ + return g_strcmp0 (value1->string, value2->string) == 0; +} + +static void +gtk_css_value_string_print (const GtkCssValue *value, + GString *str) +{ + char *string = value->string; + gsize len; + + g_string_append_c (str, '"'); + + do { + len = strcspn (string, "\"\n\r\f"); + g_string_append_len (str, string, len); + string += len; + switch (*string) + { + case '\0': + break; + case '\n': + g_string_append (str, "\\A "); + break; + case '\r': + g_string_append (str, "\\D "); + break; + case '\f': + g_string_append (str, "\\C "); + break; + case '\"': + g_string_append (str, "\\\""); + break; + case '\\': + g_string_append (str, "\\\\"); + break; + default: + g_assert_not_reached (); + break; + } + } while (*string); + + g_string_append_c (str, '"'); +} + +static const GtkCssValueClass GTK_CSS_VALUE_STRING = { + gtk_css_value_string_free, + gtk_css_value_string_equal, + gtk_css_value_string_print +}; + +GtkCssValue * +_gtk_css_string_value_new (const char *string) +{ + return _gtk_css_string_value_new_take (g_strdup (string)); +} + +GtkCssValue * +_gtk_css_string_value_new_take (char *string) +{ + GtkCssValue *result; + + result = _gtk_css_value_new (GtkCssValue, >K_CSS_VALUE_STRING); + result->string = string; + + return result; +} + +GtkCssValue * +_gtk_css_string_value_parse (GtkCssParser *parser) +{ + char *s; + + g_return_val_if_fail (parser != NULL, NULL); + + s = _gtk_css_parser_read_string (parser); + if (s == NULL) + return NULL; + + return _gtk_css_string_value_new_take (s); +} + +const char * +_gtk_css_string_value_get (const GtkCssValue *value) +{ + g_return_val_if_fail (value != NULL, NULL); + g_return_val_if_fail (value->class == >K_CSS_VALUE_STRING, NULL); + + return value->string; +} + diff --git a/gtk/gtkcssstringvalueprivate.h b/gtk/gtkcssstringvalueprivate.h new file mode 100644 index 0000000000..5338f02e0d --- /dev/null +++ b/gtk/gtkcssstringvalueprivate.h @@ -0,0 +1,38 @@ +/* + * Copyright © 2012 Red Hat Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see . + * + * Authors: Alexander Larsson + */ + +#ifndef __GTK_CSS_STRING_VALUE_PRIVATE_H__ +#define __GTK_CSS_STRING_VALUE_PRIVATE_H__ + +#include "gtkcssparserprivate.h" +#include "gtkcsstypesprivate.h" +#include "gtkcssvalueprivate.h" + +G_BEGIN_DECLS + +GtkCssValue * _gtk_css_string_value_new (const char *string); +GtkCssValue * _gtk_css_string_value_new_take (char *string); +GtkCssValue * _gtk_css_string_value_parse (GtkCssParser *parser); + +const char * _gtk_css_string_value_get (const GtkCssValue *string); + + +G_END_DECLS + +#endif /* __GTK_CSS_STRING_VALUE_PRIVATE_H__ */ diff --git a/gtk/gtkcssvalue.c b/gtk/gtkcssvalue.c index 0ab7f56273..fa80c5287d 100644 --- a/gtk/gtkcssvalue.c +++ b/gtk/gtkcssvalue.c @@ -213,17 +213,6 @@ _gtk_css_value_new_from_double (double d) return value; } -GtkCssValue * -_gtk_css_value_new_take_string (char *string) -{ - GtkCssValue *value; - - value = gtk_css_value_new (G_TYPE_STRING); - value->u.ptr = string; - - return value; -} - GtkCssValue * _gtk_css_value_new_take_strv (char **strv) { @@ -515,13 +504,6 @@ _gtk_css_value_get_double (const GtkCssValue *value) return value->u.dbl; } -const char * -_gtk_css_value_get_string (const GtkCssValue *value) -{ - g_return_val_if_fail (_gtk_css_value_holds (value, G_TYPE_STRING), 0); - return value->u.ptr; -} - gpointer _gtk_css_value_dup_object (const GtkCssValue *value) { diff --git a/gtk/gtkcssvalueprivate.h b/gtk/gtkcssvalueprivate.h index 4fa5589ff8..51a094144d 100644 --- a/gtk/gtkcssvalueprivate.h +++ b/gtk/gtkcssvalueprivate.h @@ -76,7 +76,6 @@ GtkCssValue *_gtk_css_value_new_from_int (gint GtkCssValue *_gtk_css_value_new_from_enum (GType type, gint val); GtkCssValue *_gtk_css_value_new_from_double (double d); -GtkCssValue *_gtk_css_value_new_take_string (char *string); GtkCssValue *_gtk_css_value_new_take_strv (char **strv); GtkCssValue *_gtk_css_value_new_from_boxed (GType type, gpointer boxed); @@ -95,7 +94,6 @@ void _gtk_css_value_init_gvalue (const GtkCssValue int _gtk_css_value_get_int (const GtkCssValue *value); int _gtk_css_value_get_enum (const GtkCssValue *value); double _gtk_css_value_get_double (const GtkCssValue *value); -const char * _gtk_css_value_get_string (const GtkCssValue *value); gpointer _gtk_css_value_dup_object (const GtkCssValue *value); gpointer _gtk_css_value_get_object (const GtkCssValue *value); gpointer _gtk_css_value_get_boxed (const GtkCssValue *value);