mirror of
				https://github.com/tmux/tmux.git
				synced 2025-11-04 09:26:05 +00:00 
			
		
		
		
	Add length limit operator for formats.
This commit is contained in:
		
							
								
								
									
										40
									
								
								format.c
									
									
									
									
									
								
							
							
						
						
									
										40
									
								
								format.c
									
									
									
									
									
								
							@@ -18,6 +18,8 @@
 | 
			
		||||
 | 
			
		||||
#include <sys/types.h>
 | 
			
		||||
 | 
			
		||||
#include <ctype.h>
 | 
			
		||||
#include <errno.h>
 | 
			
		||||
#include <netdb.h>
 | 
			
		||||
#include <stdarg.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.
 | 
			
		||||
 */
 | 
			
		||||
int
 | 
			
		||||
format_replace(struct format_tree *ft,
 | 
			
		||||
    const char *key, size_t keylen, char **buf, size_t *len, size_t *off)
 | 
			
		||||
format_replace(struct format_tree *ft, const char *key, size_t keylen,
 | 
			
		||||
    char **buf, size_t *len, size_t *off)
 | 
			
		||||
{
 | 
			
		||||
	char		*copy, *ptr;
 | 
			
		||||
	char		*copy, *copy0, *endptr, *ptr;
 | 
			
		||||
	const char	*value;
 | 
			
		||||
	size_t		 valuelen;
 | 
			
		||||
	u_long		 limit = ULONG_MAX;
 | 
			
		||||
 | 
			
		||||
	/* Make a copy of the key. */
 | 
			
		||||
	copy = xmalloc(keylen + 1);
 | 
			
		||||
	copy0 = copy = xmalloc(keylen + 1);
 | 
			
		||||
	memcpy(copy, key, keylen);
 | 
			
		||||
	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
 | 
			
		||||
	 * first or second element. If not, look up the key directly.
 | 
			
		||||
@@ -230,6 +254,10 @@ format_replace(struct format_tree *ft,
 | 
			
		||||
	}
 | 
			
		||||
	valuelen = strlen(value);
 | 
			
		||||
 | 
			
		||||
	/* Truncate the value if needed. */
 | 
			
		||||
	if (valuelen > limit)
 | 
			
		||||
		valuelen = limit;
 | 
			
		||||
 | 
			
		||||
	/* Expand the buffer and copy in the value. */
 | 
			
		||||
	while (*len - *off < valuelen + 1) {
 | 
			
		||||
		*buf = xrealloc(*buf, 2, *len);
 | 
			
		||||
@@ -238,11 +266,11 @@ format_replace(struct format_tree *ft,
 | 
			
		||||
	memcpy(*buf + *off, value, valuelen);
 | 
			
		||||
	*off += valuelen;
 | 
			
		||||
 | 
			
		||||
	free(copy);
 | 
			
		||||
	free(copy0);
 | 
			
		||||
	return (0);
 | 
			
		||||
 | 
			
		||||
fail:
 | 
			
		||||
	free(copy);
 | 
			
		||||
	free(copy0);
 | 
			
		||||
	return (-1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -386,7 +386,7 @@ const struct options_table_entry session_options_table[] = {
 | 
			
		||||
 | 
			
		||||
	{ .name = "status-right",
 | 
			
		||||
	  .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",
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										6
									
								
								tmux.1
									
									
									
									
									
								
							
							
						
						
									
										6
									
								
								tmux.1
									
									
									
									
									
								
							@@ -3026,6 +3026,12 @@ will include the string
 | 
			
		||||
if the session is attached and the string
 | 
			
		||||
.Ql not attached
 | 
			
		||||
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
 | 
			
		||||
The following variables are available, where appropriate:
 | 
			
		||||
.Bl -column "XXXXXXXXXXXXXXXXXXX" "XXXXX"
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user