css: Split out a common function

It's used in two places already, and Iwant to use it in a third one.
This commit is contained in:
Benjamin Otte 2014-05-01 19:47:58 +02:00
parent d495ab1ca0
commit b356d81410
4 changed files with 52 additions and 67 deletions

View File

@ -1012,3 +1012,47 @@ _gtk_css_parser_resync (GtkCssParser *parser,
gtk_css_parser_resync_internal (parser, sync_at_semicolon, TRUE, terminator); gtk_css_parser_resync_internal (parser, sync_at_semicolon, TRUE, terminator);
} }
void
_gtk_css_print_string (GString *str,
const char *string)
{
gsize len;
g_return_if_fail (str != NULL);
g_return_if_fail (string != NULL);
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, '"');
}

View File

@ -97,6 +97,11 @@ void _gtk_css_parser_resync (GtkCssParser *parser
gboolean sync_at_semicolon, gboolean sync_at_semicolon,
char terminator); char terminator);
/* XXX: Find better place to put it? */
void _gtk_css_print_string (GString *str,
const char *string);
G_END_DECLS G_END_DECLS
#endif /* __GTK_CSS_PARSER_PRIVATE_H__ */ #endif /* __GTK_CSS_PARSER_PRIVATE_H__ */

View File

@ -65,47 +65,13 @@ static void
gtk_css_value_string_print (const GtkCssValue *value, gtk_css_value_string_print (const GtkCssValue *value,
GString *str) GString *str)
{ {
char *string = value->string; if (value->string == NULL)
gsize len;
if (string == NULL)
{ {
g_string_append (str, "none"); g_string_append (str, "none");
return; return;
} }
g_string_append_c (str, '"'); _gtk_css_print_string (str, value->string);
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 void static void

View File

@ -89,37 +89,7 @@ static void
string_append_string (GString *str, string_append_string (GString *str,
const char *string) const char *string)
{ {
gsize len; _gtk_css_print_string (str, string);
g_string_append_c (str, '"');
do {
len = strcspn (string, "\"\n\r\f");
g_string_append (str, string);
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;
default:
g_assert_not_reached ();
break;
}
} while (*string);
g_string_append_c (str, '"');
} }
/*** IMPLEMENTATIONS ***/ /*** IMPLEMENTATIONS ***/