diff src/misc.c @ 1023:650c02c0c8ff

Move quoted_value() and escquote_value() to misc.[ch].
author zas_
date Sun, 31 Aug 2008 11:27:24 +0000
parents 9962b24b6b43
children 1646720364cf
line wrap: on
line diff
--- a/src/misc.c	Sun Aug 31 10:51:41 2008 +0000
+++ b/src/misc.c	Sun Aug 31 11:27:24 2008 +0000
@@ -108,3 +108,81 @@
 		return g_build_filename(home, G_DIR_SEPARATOR_S, NULL);
 #endif
 }
+
+/*
+   returns text without quotes or NULL for empty or broken string
+   any text up to first '"' is skipped
+   tail is set to point at the char after the second '"'
+   or at the ending \0
+
+*/
+
+gchar *quoted_value(const gchar *text, const gchar **tail)
+{
+	const gchar *ptr;
+	gint c = 0;
+	gint l = strlen(text);
+	gchar *retval = NULL;
+
+	if (tail) *tail = text;
+
+	if (l == 0) return retval;
+
+	while (c < l && text[c] != '"') c++;
+	if (text[c] == '"')
+		{
+		gint e;
+		c++;
+		ptr = text + c;
+		e = c;
+		while (e < l)
+			{
+			if (text[e-1] != '\\' && text[e] == '"') break;
+			e++;
+			}
+		if (text[e] == '"')
+			{
+			if (e - c > 0)
+				{
+				gchar *substring = g_strndup(ptr, e - c);
+
+				if (substring)
+					{
+					retval = g_strcompress(substring);
+					g_free(substring);
+					}
+				}
+			}
+		if (tail) *tail = text + e + 1;
+		}
+	else
+		/* for compatibility with older formats (<0.3.7)
+		 * read a line without quotes too */
+		{
+		c = 0;
+		while (c < l && text[c] != '\n' && !g_ascii_isspace(text[c])) c++;
+		if (c != 0)
+			{
+			retval = g_strndup(text, c);
+			}
+		if (tail) *tail = text + c;
+		}
+
+	return retval;
+}
+
+gchar *escquote_value(const gchar *text)
+{
+	gchar *e;
+
+	if (!text) return g_strdup("\"\"");
+
+	e = g_strescape(text, "");
+	if (e)
+		{
+		gchar *retval = g_strdup_printf("\"%s\"", e);
+		g_free(e);
+		return retval;
+		}
+	return g_strdup("\"\"");
+}