=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tmux/format.c,v retrieving revision 1.112 retrieving revision 1.113 diff -c -r1.112 -r1.113 *** src/usr.bin/tmux/format.c 2016/10/16 19:36:37 1.112 --- src/usr.bin/tmux/format.c 2016/11/17 10:06:08 1.113 *************** *** 1,4 **** ! /* $OpenBSD: format.c,v 1.112 2016/10/16 19:36:37 nicm Exp $ */ /* * Copyright (c) 2011 Nicholas Marriott --- 1,4 ---- ! /* $OpenBSD: format.c,v 1.113 2016/11/17 10:06:08 nicm Exp $ */ /* * Copyright (c) 2011 Nicholas Marriott *************** *** 78,83 **** --- 78,84 ---- /* Entry in format job tree. */ struct format_job { const char *cmd; + const char *expanded; time_t last; char *out; *************** *** 232,253 **** static char * format_job_get(struct format_tree *ft, const char *cmd) { ! struct format_job fj0, *fj; ! time_t t; fj0.cmd = cmd; if ((fj = RB_FIND(format_job_tree, &format_jobs, &fj0)) == NULL) { fj = xcalloc(1, sizeof *fj); fj->cmd = xstrdup(cmd); xasprintf(&fj->out, "<'%s' not ready>", fj->cmd); RB_INSERT(format_job_tree, &format_jobs, fj); } t = time(NULL); ! if (fj->job == NULL && ((ft->flags & FORMAT_FORCE) || fj->last != t)) { ! fj->job = job_run(fj->cmd, NULL, NULL, format_job_callback, NULL, fj); if (fj->job == NULL) { free(fj->out); --- 233,265 ---- static char * format_job_get(struct format_tree *ft, const char *cmd) { ! struct format_job fj0, *fj; ! time_t t; ! char *expanded; ! int force; fj0.cmd = cmd; if ((fj = RB_FIND(format_job_tree, &format_jobs, &fj0)) == NULL) { fj = xcalloc(1, sizeof *fj); fj->cmd = xstrdup(cmd); + fj->expanded = NULL; xasprintf(&fj->out, "<'%s' not ready>", fj->cmd); RB_INSERT(format_job_tree, &format_jobs, fj); } + expanded = format_expand(ft, cmd); + if (fj->expanded == NULL || strcmp(expanded, fj->expanded) != 0) { + free((void *)fj->expanded); + fj->expanded = xstrdup(expanded); + force = 1; + } else + force = (ft->flags & FORMAT_FORCE); + t = time(NULL); ! if (fj->job == NULL && (force || fj->last != t)) { ! fj->job = job_run(expanded, NULL, NULL, format_job_callback, NULL, fj); if (fj->job == NULL) { free(fj->out); *************** *** 259,264 **** --- 271,277 ---- if (ft->flags & FORMAT_STATUS) fj->status = 1; + free(expanded); return (format_expand(ft, fj->out)); } *************** *** 281,286 **** --- 294,300 ---- if (fj->job != NULL) job_free(fj->job); + free((void *)fj->expanded); free((void *)fj->cmd); free(fj->out); *************** *** 883,889 **** char * format_expand(struct format_tree *ft, const char *fmt) { ! char *buf, *tmp, *cmd, *out; const char *ptr, *s, *saved = fmt; size_t off, len, n, outlen; int ch, brackets; --- 897,903 ---- char * format_expand(struct format_tree *ft, const char *fmt) { ! char *buf, *out; const char *ptr, *s, *saved = fmt; size_t off, len, n, outlen; int ch, brackets; *************** *** 920,935 **** break; n = ptr - fmt; ! tmp = xmalloc(n + 1); ! memcpy(tmp, fmt, n); ! tmp[n] = '\0'; ! cmd = format_expand(ft, tmp); ! ! out = format_job_get(ft, cmd); outlen = strlen(out); - - free(cmd); - free(tmp); while (len - off < outlen + 1) { buf = xreallocarray(buf, 2, len); --- 934,941 ---- break; n = ptr - fmt; ! out = format_job_get(ft, xstrndup(fmt, n)); outlen = strlen(out); while (len - off < outlen + 1) { buf = xreallocarray(buf, 2, len);