Add length limit operator for formats.

pull/1/head
nicm 2013-10-10 11:50:20 +00:00
parent 2756d12750
commit 40811eb8d4
3 changed files with 41 additions and 7 deletions

View File

@ -18,6 +18,8 @@
#include <sys/types.h> #include <sys/types.h>
#include <ctype.h>
#include <errno.h>
#include <netdb.h> #include <netdb.h>
#include <stdarg.h> #include <stdarg.h>
#include <stdlib.h> #include <stdlib.h>
@ -188,18 +190,40 @@ format_find(struct format_tree *ft, const char *key)
* #{?blah,a,b} is replace with a if blah exists and is nonzero else b. * #{?blah,a,b} is replace with a if blah exists and is nonzero else b.
*/ */
int int
format_replace(struct format_tree *ft, format_replace(struct format_tree *ft, const char *key, size_t keylen,
const char *key, size_t keylen, char **buf, size_t *len, size_t *off) char **buf, size_t *len, size_t *off)
{ {
char *copy, *ptr; char *copy, *copy0, *endptr, *ptr;
const char *value; const char *value;
size_t valuelen; size_t valuelen;
u_long limit = ULONG_MAX;
/* Make a copy of the key. */ /* Make a copy of the key. */
copy = xmalloc(keylen + 1); copy0 = copy = xmalloc(keylen + 1);
memcpy(copy, key, keylen); memcpy(copy, key, keylen);
copy[keylen] = '\0'; copy[keylen] = '\0';
/* Is there a length limit or whatnot? */
if (!islower((u_char) *copy) && *copy != '?') {
while (*copy != ':' && *copy != '\0') {
switch (*copy) {
case '=':
errno = 0;
limit = strtoul(copy + 1, &endptr, 10);
if (errno == ERANGE && limit == ULONG_MAX)
goto fail;
copy = endptr;
break;
default:
copy++;
break;
}
}
if (*copy != ':')
goto fail;
copy++;
}
/* /*
* Is this a conditional? If so, check it exists and extract either the * Is this a conditional? If so, check it exists and extract either the
* first or second element. If not, look up the key directly. * first or second element. If not, look up the key directly.
@ -230,6 +254,10 @@ format_replace(struct format_tree *ft,
} }
valuelen = strlen(value); valuelen = strlen(value);
/* Truncate the value if needed. */
if (valuelen > limit)
valuelen = limit;
/* Expand the buffer and copy in the value. */ /* Expand the buffer and copy in the value. */
while (*len - *off < valuelen + 1) { while (*len - *off < valuelen + 1) {
*buf = xrealloc(*buf, 2, *len); *buf = xrealloc(*buf, 2, *len);
@ -238,11 +266,11 @@ format_replace(struct format_tree *ft,
memcpy(*buf + *off, value, valuelen); memcpy(*buf + *off, value, valuelen);
*off += valuelen; *off += valuelen;
free(copy); free(copy0);
return (0); return (0);
fail: fail:
free(copy); free(copy0);
return (-1); return (-1);
} }

View File

@ -387,7 +387,7 @@ const struct options_table_entry session_options_table[] = {
{ .name = "status-right", { .name = "status-right",
.type = OPTIONS_TABLE_STRING, .type = OPTIONS_TABLE_STRING,
.default_str = "\"#22T\" %H:%M %d-%b-%y" .default_str = "\"#{=22:pane_title}\" %H:%M %d-%b-%y"
}, },
{ .name = "status-right-attr", { .name = "status-right-attr",

6
tmux.1
View File

@ -3024,6 +3024,12 @@ will include the string
if the session is attached and the string if the session is attached and the string
.Ql not attached .Ql not attached
if it is unattached. if it is unattached.
A limit may be placed on the length of the resultant string by prefixing it
by an
.Ql = ,
a number and a colon, so
.Ql #{=10:pane_title}
will include at most the first 10 characters of the pane title.
.Pp .Pp
The following variables are available, where appropriate: The following variables are available, where appropriate:
.Bl -column "XXXXXXXXXXXXXXXXXXX" "XXXXX" .Bl -column "XXXXXXXXXXXXXXXXXXX" "XXXXX"