+/* returns TRUE if data is empty, or the data is a $variable which is empty */
+static int data_is_empty(const char **data)
+{
+ /* since we don't know the real argument list, assume there's always
+ an argument in them */
+ static char *arglist[] = {
+ "x", "x", "x", "x", "x", "x","x", "x", "x", "x",
+ NULL
+ };
+ SERVER_REC *server;
+ const char *p;
+ char *ret;
+ int free_ret, empty;
+
+ p = *data;
+ while (*p == ' ') p++;
+
+ if (*p == '}') {
+ /* empty */
+ *data = p+1;
+ return TRUE;
+ }
+
+ if (*p != '$') {
+ /* not empty */
+ return FALSE;
+ }
+
+ /* variable - check if it's empty */
+ p++;
+
+ server = active_win == NULL ? NULL :
+ active_win->active_server != NULL ?
+ active_win->active_server : active_win->connect_server;
+
+ ret = parse_special((char **) &p, server,
+ active_win == NULL ? NULL : active_win->active,
+ arglist, &free_ret, NULL, 0);
+ p++;
+
+ while (*p == ' ') p++;
+ empty = *p == '}' && (ret == NULL || *ret == '\0');
+ if (free_ret) g_free(ret);
+
+ if (empty) {
+ /* empty */
+ *data = p+1;
+ return TRUE;
+ }
+
+ 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;
+}
+