Count brackets in #{?...} so that nested conditional formats work, from
authornicm <nicm@openbsd.org>
Tue, 27 Oct 2015 09:28:31 +0000 (09:28 +0000)
committernicm <nicm@openbsd.org>
Tue, 27 Oct 2015 09:28:31 +0000 (09:28 +0000)
Daniel De Graaf.

usr.bin/tmux/format.c
usr.bin/tmux/screen.c

index f449651..98398a7 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: format.c,v 1.88 2015/10/27 09:18:06 nicm Exp $ */
+/* $OpenBSD: format.c,v 1.89 2015/10/27 09:28:31 nicm Exp $ */
 
 /*
  * Copyright (c) 2011 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -670,7 +670,7 @@ format_replace(struct format_tree *ft, const char *key, size_t keylen,
        char            *copy, *copy0, *endptr, *ptr, *saved, *trimmed, *value;
        size_t           valuelen;
        u_long           limit = 0;
-       int              modifiers = 0;
+       int              modifiers = 0, brackets;
 
        /* Make a copy of the key. */
        copy0 = copy = xmalloc(keylen + 1);
@@ -718,20 +718,26 @@ format_replace(struct format_tree *ft, const char *key, size_t keylen,
                        goto fail;
                *ptr = '\0';
 
-               value = saved = format_find(ft, copy + 1, modifiers);
-               if (value != NULL && *value != '\0' &&
-                   (value[0] != '0' || value[1] != '\0')) {
-                       value = ptr + 1;
-                       ptr = strchr(value, ',');
-                       if (ptr == NULL)
-                               goto fail;
+               value = ptr + 1;
+               saved = format_find(ft, copy + 1, modifiers);
+
+               brackets = 0;
+               for (ptr = ptr + 1; *ptr != '\0'; ptr++) {
+                       if (*ptr == '{')
+                               brackets++;
+                       if (*ptr == '}')
+                               brackets--;
+                       if (*ptr == ',' && brackets == 0)
+                               break;
+               }
+               if (*ptr == '\0')
+                       goto fail;
+
+               if (saved != NULL && *saved != '\0' &&
+                   (saved[0] != '0' || saved[1] != '\0')) {
                        *ptr = '\0';
-               } else {
-                       ptr = strchr(ptr + 1, ',');
-                       if (ptr == NULL)
-                               goto fail;
+               } else
                        value = ptr + 1;
-               }
                value = format_expand(ft, value);
                free(saved);
                saved = value;
index 94e0933..b6fe4f5 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: screen.c,v 1.34 2015/08/28 17:11:12 nicm Exp $ */
+/* $OpenBSD: screen.c,v 1.35 2015/10/27 09:28:31 nicm Exp $ */
 
 /*
  * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -194,8 +194,6 @@ screen_resize_y(struct screen *s, u_int sy)
                 * Now just increase the history size, if possible, to take
                 * over the lines which are left. If history is off, delete
                 * lines from the top.
-                *
-                * XXX Should apply history limit?
                 */
                available = s->cy;
                if (gd->flags & GRID_HISTORY)