Merged from silc_1_0_branch.
[silc.git] / apps / irssi / src / fe-common / core / themes.c
index baa1d3e599d112d554dee9dfbf571801d6b8efb2..437b118faeccf36a8a08eb1b6823c39164ecec22 100644 (file)
@@ -301,12 +301,51 @@ static int data_is_empty(const char **data)
         return FALSE;
 }
 
+/* return "data" from {abstract data} string */
+char *theme_format_expand_get(THEME_REC *theme, const char **format)
+{
+       GString *str;
+       char *ret, dummy;
+       int braces = 1; /* we start with one brace opened */
+
+       str = g_string_new(NULL);
+       while ((**format != '\0') && (braces)) {
+               if (**format == '{')
+                       braces++;
+               else if (**format == '}')
+                       braces--;
+               else if ((braces > 1) && (**format == ' ')) {
+                       g_string_append(str, "\\x20");
+                       (*format)++;
+                       continue;
+               } else {
+                       theme_format_append_next(theme, str, format,
+                                                'n', 'n',
+                                                &dummy, &dummy, 0);
+                       continue;
+               }
+               
+               if (!braces) {
+                       (*format)++;
+                       break;
+               }
+
+               g_string_append_c(str, **format);
+               (*format)++;
+       }
+
+       ret = str->str;
+        g_string_free(str, FALSE);
+        return ret;
+}
+
 /* expand a single {abstract ...data... } */
 static char *theme_format_expand_abstract(THEME_REC *theme,
                                          const char **formatp,
                                          char default_fg, char default_bg,
                                          int flags)
 {
+       GString *str;
        const char *p, *format;
        char *abstract, *data, *ret;
        int len;
@@ -345,9 +384,8 @@ static char *theme_format_expand_abstract(THEME_REC *theme,
        abstract = g_strdup(data);
 
        /* we'll need to get the data part. it may contain
-          more abstracts, they are automatically expanded. */
-       data = theme_format_expand_data(theme, formatp, default_fg, default_bg,
-                                       NULL, NULL, flags);
+          more abstracts, they are _NOT_ expanded. */
+       data = theme_format_expand_get(theme, formatp);
        len = strlen(data);
 
        if (len > 1 && i_isdigit(data[len-1]) && data[len-2] == '$') {
@@ -367,7 +405,21 @@ static char *theme_format_expand_abstract(THEME_REC *theme,
                                   PARSE_FLAG_ONLY_ARGS);
        g_free(abstract);
         g_free(data);
-       abstract = ret;
+       str = g_string_new(NULL);
+       p = ret;
+       while (*p != '\0') {
+               if (*p == '\\') {
+                       int chr;
+                       p++;
+                       chr = expand_escape(&p);
+                       g_string_append_c(str, chr != -1 ? chr : *p);
+               } else
+                       g_string_append_c(str, *p);
+               p++;
+       }
+       g_free(ret);
+       abstract = str->str;
+       g_string_free(str, FALSE);
 
        /* abstract may itself contain abstracts or replaces */
        p = abstract;