mirror of
https://github.com/tmux/tmux.git
synced 2025-01-07 08:18:48 +00:00
Add length limit operator for formats.
This commit is contained in:
parent
7581762c8e
commit
84c22d053b
40
format.c
40
format.c
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -386,7 +386,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
6
tmux.1
@ -3026,6 +3026,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"
|
||||||
|
Loading…
Reference in New Issue
Block a user