=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tmux/format.c,v retrieving revision 1.282 retrieving revision 1.283 diff -c -r1.282 -r1.283 *** src/usr.bin/tmux/format.c 2021/03/11 07:08:18 1.282 --- src/usr.bin/tmux/format.c 2021/04/12 06:50:25 1.283 *************** *** 1,4 **** ! /* $OpenBSD: format.c,v 1.282 2021/03/11 07:08:18 nicm Exp $ */ /* * Copyright (c) 2011 Nicholas Marriott --- 1,4 ---- ! /* $OpenBSD: format.c,v 1.283 2021/04/12 06:50:25 nicm Exp $ */ /* * Copyright (c) 2011 Nicholas Marriott *************** *** 100,105 **** --- 100,106 ---- #define FORMAT_QUOTE_STYLE 0x2000 #define FORMAT_WINDOW_NAME 0x4000 #define FORMAT_SESSION_NAME 0x8000 + #define FORMAT_CHARACTER 0x10000 /* Limit on recursion. */ #define FORMAT_LOOP_LIMIT 10 *************** *** 3522,3528 **** /* * Modifiers are a ; separated list of the forms: ! * l,m,C,b,d,n,t,w,q,E,T,S,W,P,<,> * =a * =/a * =/a/ --- 3523,3529 ---- /* * Modifiers are a ; separated list of the forms: ! * l,m,C,a,b,d,n,t,w,q,E,T,S,W,P,<,> * =a * =/a * =/a/ *************** *** 3539,3545 **** cp++; /* Check single character modifiers with no arguments. */ ! if (strchr("lbdnwETSWP<>", cp[0]) != NULL && format_is_end(cp[1])) { format_add_modifier(&list, count, cp, 1, NULL, 0); cp++; --- 3540,3546 ---- cp++; /* Check single character modifiers with no arguments. */ ! if (strchr("labdnwETSWP<>", cp[0]) != NULL && format_is_end(cp[1])) { format_add_modifier(&list, count, cp, 1, NULL, 0); cp++; *************** *** 3956,3962 **** mright = (long long)mright; } format_log(es, "expression left side is: %.*f", prec, mleft); ! format_log(es, "expression right side is: %.*f", prec, mright); switch (operator) { case ADD: --- 3957,3963 ---- mright = (long long)mright; } format_log(es, "expression left side is: %.*f", prec, mleft); ! format_log(es, "expression right side is: %.*f", prec, mright); switch (operator) { case ADD: *************** *** 4016,4025 **** { struct format_tree *ft = es->ft; struct window_pane *wp = ft->wp; ! const char *errptr, *copy, *cp, *marker = NULL; const char *time_format = NULL; char *copy0, *condition, *found, *new; ! char *value, *left, *right; size_t valuelen; int modifiers = 0, limit = 0, width = 0; int j; --- 4017,4026 ---- { struct format_tree *ft = es->ft; struct window_pane *wp = ft->wp; ! const char *errstr, *copy, *cp, *marker = NULL; const char *time_format = NULL; char *copy0, *condition, *found, *new; ! char *value, *left, *right, c; size_t valuelen; int modifiers = 0, limit = 0, width = 0; int j; *************** *** 4063,4070 **** if (fm->argc < 1) break; limit = strtonum(fm->argv[0], INT_MIN, INT_MAX, ! &errptr); ! if (errptr != NULL) limit = 0; if (fm->argc >= 2 && fm->argv[1] != NULL) marker = fm->argv[1]; --- 4064,4071 ---- if (fm->argc < 1) break; limit = strtonum(fm->argv[0], INT_MIN, INT_MAX, ! &errstr); ! if (errstr != NULL) limit = 0; if (fm->argc >= 2 && fm->argv[1] != NULL) marker = fm->argv[1]; *************** *** 4073,4080 **** if (fm->argc < 1) break; width = strtonum(fm->argv[0], INT_MIN, INT_MAX, ! &errptr); ! if (errptr != NULL) width = 0; break; case 'w': --- 4074,4081 ---- if (fm->argc < 1) break; width = strtonum(fm->argv[0], INT_MIN, INT_MAX, ! &errstr); ! if (errstr != NULL) width = 0; break; case 'w': *************** *** 4088,4093 **** --- 4089,4097 ---- case 'l': modifiers |= FORMAT_LITERAL; break; + case 'a': + modifiers |= FORMAT_CHARACTER; + break; case 'b': modifiers |= FORMAT_BASENAME; break; *************** *** 4151,4156 **** --- 4155,4172 ---- /* Is this a literal string? */ if (modifiers & FORMAT_LITERAL) { value = xstrdup(copy); + goto done; + } + + /* Is this a character? */ + if (modifiers & FORMAT_CHARACTER) { + new = format_expand1(es, copy); + c = strtonum(new, 32, 126, &errstr); + if (errstr != NULL) + value = xstrdup(""); + else + xasprintf(&value, "%c", c); + free (new); goto done; }