Allow formats in status options.

This commit is contained in:
Nicholas Marriott 2013-02-10 18:53:25 +00:00
parent 6ad2c5c40f
commit 6c53a1ed68
2 changed files with 21 additions and 12 deletions

View File

@ -251,10 +251,11 @@ format_expand(struct format_tree *ft, const char *fmt)
continue;
}
}
while (len - off < 2) {
while (len - off < 3) {
buf = xrealloc(buf, 2, len);
len *= 2;
}
buf[off++] = '#';
buf[off++] = ch;
continue;
}

View File

@ -393,13 +393,6 @@ status_replace1(struct client *c, struct session *s, struct winlink *wl,
long limit;
u_int idx;
if (s == NULL)
s = c->session;
if (wl == NULL)
wl = s->curw;
if (wp == NULL)
wp = wl->window->active;
errno = 0;
limit = strtol(*iptr, &endptr, 10);
if ((limit == 0 && errno != EINVAL) ||
@ -468,6 +461,9 @@ status_replace1(struct client *c, struct session *s, struct winlink *wl,
*/
ch = ']';
goto skip_to;
case '{':
ptr = (char *) "#{";
goto do_replace;
case '#':
*(*optr)++ = '#';
break;
@ -507,13 +503,21 @@ char *
status_replace(struct client *c, struct session *s, struct winlink *wl,
struct window_pane *wp, const char *fmt, time_t t, int jobsflag)
{
static char out[BUFSIZ];
char in[BUFSIZ], ch, *iptr, *optr;
size_t len;
static char out[BUFSIZ];
char in[BUFSIZ], ch, *iptr, *optr;
size_t len;
struct format_tree *ft;
if (fmt == NULL)
return (xstrdup(""));
if (s == NULL)
s = c->session;
if (wl == NULL)
wl = s->curw;
if (wp == NULL)
wp = wl->window->active;
len = strftime(in, sizeof in, fmt, localtime(&t));
in[len] = '\0';
@ -534,7 +538,11 @@ status_replace(struct client *c, struct session *s, struct winlink *wl,
}
*optr = '\0';
return (xstrdup(out));
ft = format_create();
format_session(ft, s);
format_winlink(ft, s, wl);
format_window_pane(ft, wp);
return (format_expand(ft, out));
}
/* Figure out job name and get its result, starting it off if necessary. */