mirror of
				https://github.com/tmux/tmux.git
				synced 2025-11-04 00:56:10 +00:00 
			
		
		
		
	Make options_tostring allocate its result instead of using a stack
buffer (needed for something in the future).
This commit is contained in:
		@@ -162,8 +162,8 @@ cmd_show_options_print(struct cmd *self, struct cmdq_item *item,
 | 
			
		||||
    struct options_entry *o, int idx)
 | 
			
		||||
{
 | 
			
		||||
	struct options_array_item	*a;
 | 
			
		||||
	const char			*name, *value;
 | 
			
		||||
	char				*tmp, *escaped;
 | 
			
		||||
	const char			*name;
 | 
			
		||||
	char				*value, *tmp, *escaped;
 | 
			
		||||
 | 
			
		||||
	if (idx != -1) {
 | 
			
		||||
		xasprintf(&tmp, "%s[%d]", options_name(o), idx);
 | 
			
		||||
@@ -191,6 +191,7 @@ cmd_show_options_print(struct cmd *self, struct cmdq_item *item,
 | 
			
		||||
		free(escaped);
 | 
			
		||||
	} else
 | 
			
		||||
		cmdq_print(item, "%s %s", name, value);
 | 
			
		||||
	free(value);
 | 
			
		||||
 | 
			
		||||
	free(tmp);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										27
									
								
								format.c
									
									
									
									
									
								
							
							
						
						
									
										27
									
								
								format.c
									
									
									
									
									
								
							@@ -904,9 +904,8 @@ format_find(struct format_tree *ft, const char *key, int modifiers)
 | 
			
		||||
	struct environ_entry	*envent;
 | 
			
		||||
	static char		 s[64];
 | 
			
		||||
	struct options_entry	*o;
 | 
			
		||||
	const char		*found;
 | 
			
		||||
	int			 idx;
 | 
			
		||||
	char			*copy, *saved;
 | 
			
		||||
	char			*found, *saved;
 | 
			
		||||
 | 
			
		||||
	if (~modifiers & FORMAT_TIMESTRING) {
 | 
			
		||||
		o = options_parse_get(global_options, key, &idx, 0);
 | 
			
		||||
@@ -933,12 +932,11 @@ format_find(struct format_tree *ft, const char *key, int modifiers)
 | 
			
		||||
				return (NULL);
 | 
			
		||||
			ctime_r(&fe->t, s);
 | 
			
		||||
			s[strcspn(s, "\n")] = '\0';
 | 
			
		||||
			found = s;
 | 
			
		||||
			found = xstrdup(s);
 | 
			
		||||
			goto found;
 | 
			
		||||
		}
 | 
			
		||||
		if (fe->t != 0) {
 | 
			
		||||
			xsnprintf(s, sizeof s, "%lld", (long long)fe->t);
 | 
			
		||||
			found = s;
 | 
			
		||||
			xasprintf(&found, "%lld", (long long)fe->t);
 | 
			
		||||
			goto found;
 | 
			
		||||
		}
 | 
			
		||||
		if (fe->value == NULL && fe->cb != NULL) {
 | 
			
		||||
@@ -946,7 +944,7 @@ format_find(struct format_tree *ft, const char *key, int modifiers)
 | 
			
		||||
			if (fe->value == NULL)
 | 
			
		||||
				fe->value = xstrdup("");
 | 
			
		||||
		}
 | 
			
		||||
		found = fe->value;
 | 
			
		||||
		found = xstrdup(fe->value);
 | 
			
		||||
		goto found;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@@ -957,7 +955,7 @@ format_find(struct format_tree *ft, const char *key, int modifiers)
 | 
			
		||||
		if (envent == NULL)
 | 
			
		||||
			envent = environ_find(global_environ, key);
 | 
			
		||||
		if (envent != NULL) {
 | 
			
		||||
			found = envent->value;
 | 
			
		||||
			found = xstrdup(envent->value);
 | 
			
		||||
			goto found;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
@@ -967,23 +965,22 @@ format_find(struct format_tree *ft, const char *key, int modifiers)
 | 
			
		||||
found:
 | 
			
		||||
	if (found == NULL)
 | 
			
		||||
		return (NULL);
 | 
			
		||||
	copy = xstrdup(found);
 | 
			
		||||
	if (modifiers & FORMAT_BASENAME) {
 | 
			
		||||
		saved = copy;
 | 
			
		||||
		copy = xstrdup(basename(saved));
 | 
			
		||||
		saved = found;
 | 
			
		||||
		found = xstrdup(basename(saved));
 | 
			
		||||
		free(saved);
 | 
			
		||||
	}
 | 
			
		||||
	if (modifiers & FORMAT_DIRNAME) {
 | 
			
		||||
		saved = copy;
 | 
			
		||||
		copy = xstrdup(dirname(saved));
 | 
			
		||||
		saved = found;
 | 
			
		||||
		found = xstrdup(dirname(saved));
 | 
			
		||||
		free(saved);
 | 
			
		||||
	}
 | 
			
		||||
	if (modifiers & FORMAT_QUOTE) {
 | 
			
		||||
		saved = copy;
 | 
			
		||||
		copy = xstrdup(format_quote(saved));
 | 
			
		||||
		saved = found;
 | 
			
		||||
		found = xstrdup(format_quote(saved));
 | 
			
		||||
		free(saved);
 | 
			
		||||
	}
 | 
			
		||||
	return (copy);
 | 
			
		||||
	return (found);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Skip until end. */
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										39
									
								
								options.c
									
									
									
									
									
								
							
							
						
						
									
										39
									
								
								options.c
									
									
									
									
									
								
							@@ -110,47 +110,43 @@ options_value_free(struct options_entry *o, union options_value *ov)
 | 
			
		||||
		free(ov->string);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static const char *
 | 
			
		||||
static char *
 | 
			
		||||
options_value_tostring(struct options_entry *o, union options_value *ov,
 | 
			
		||||
    int numeric)
 | 
			
		||||
{
 | 
			
		||||
	static char	 s[1024];
 | 
			
		||||
	const char	*tmp;
 | 
			
		||||
	char	*s;
 | 
			
		||||
 | 
			
		||||
	if (OPTIONS_IS_STYLE(o))
 | 
			
		||||
		return (style_tostring(&ov->style));
 | 
			
		||||
		return (xstrdup(style_tostring(&ov->style)));
 | 
			
		||||
	if (OPTIONS_IS_NUMBER(o)) {
 | 
			
		||||
		tmp = NULL;
 | 
			
		||||
		switch (o->tableentry->type) {
 | 
			
		||||
		case OPTIONS_TABLE_NUMBER:
 | 
			
		||||
			xsnprintf(s, sizeof s, "%lld", ov->number);
 | 
			
		||||
			xasprintf(&s, "%lld", ov->number);
 | 
			
		||||
			break;
 | 
			
		||||
		case OPTIONS_TABLE_KEY:
 | 
			
		||||
			tmp = key_string_lookup_key(ov->number);
 | 
			
		||||
			s = xstrdup(key_string_lookup_key(ov->number));
 | 
			
		||||
			break;
 | 
			
		||||
		case OPTIONS_TABLE_COLOUR:
 | 
			
		||||
			tmp = colour_tostring(ov->number);
 | 
			
		||||
			s = xstrdup(colour_tostring(ov->number));
 | 
			
		||||
			break;
 | 
			
		||||
		case OPTIONS_TABLE_FLAG:
 | 
			
		||||
			if (numeric)
 | 
			
		||||
				xsnprintf(s, sizeof s, "%lld", ov->number);
 | 
			
		||||
				xasprintf(&s, "%lld", ov->number);
 | 
			
		||||
			else
 | 
			
		||||
				tmp = (ov->number ? "on" : "off");
 | 
			
		||||
				s = xstrdup(ov->number ? "on" : "off");
 | 
			
		||||
			break;
 | 
			
		||||
		case OPTIONS_TABLE_CHOICE:
 | 
			
		||||
			tmp = o->tableentry->choices[ov->number];
 | 
			
		||||
			s = xstrdup(o->tableentry->choices[ov->number]);
 | 
			
		||||
			break;
 | 
			
		||||
		case OPTIONS_TABLE_STRING:
 | 
			
		||||
		case OPTIONS_TABLE_STYLE:
 | 
			
		||||
			break;
 | 
			
		||||
			fatalx("not a number option type");
 | 
			
		||||
		}
 | 
			
		||||
		if (tmp != NULL)
 | 
			
		||||
			xsnprintf(s, sizeof s, "%s", tmp);
 | 
			
		||||
		return (s);
 | 
			
		||||
	}
 | 
			
		||||
	if (OPTIONS_IS_STRING(o))
 | 
			
		||||
		return (ov->string);
 | 
			
		||||
	return ("");
 | 
			
		||||
		return (xstrdup(ov->string));
 | 
			
		||||
	return (xstrdup(""));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct options *
 | 
			
		||||
@@ -218,11 +214,8 @@ options_empty(struct options *oo, const struct options_table_entry *oe)
 | 
			
		||||
	o = options_add(oo, oe->name);
 | 
			
		||||
	o->tableentry = oe;
 | 
			
		||||
 | 
			
		||||
	if (oe->flags & OPTIONS_TABLE_IS_ARRAY) {
 | 
			
		||||
		if (oe->type != OPTIONS_TABLE_STRING)
 | 
			
		||||
			fatalx("arrays can only be strings");
 | 
			
		||||
	if (oe->flags & OPTIONS_TABLE_IS_ARRAY)
 | 
			
		||||
		RB_INIT(&o->value.array);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return (o);
 | 
			
		||||
}
 | 
			
		||||
@@ -443,17 +436,17 @@ options_isstring(struct options_entry *o)
 | 
			
		||||
	return (OPTIONS_IS_STRING(o));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const char *
 | 
			
		||||
char *
 | 
			
		||||
options_tostring(struct options_entry *o, int idx, int numeric)
 | 
			
		||||
{
 | 
			
		||||
	struct options_array_item	*a;
 | 
			
		||||
 | 
			
		||||
	if (OPTIONS_IS_ARRAY(o)) {
 | 
			
		||||
		if (idx == -1)
 | 
			
		||||
			return (NULL);
 | 
			
		||||
			return (xstrdup(""));
 | 
			
		||||
		a = options_array_item(o, idx);
 | 
			
		||||
		if (a == NULL)
 | 
			
		||||
			return ("");
 | 
			
		||||
			return (xstrdup(""));
 | 
			
		||||
		return (options_value_tostring(o, &a->value, numeric));
 | 
			
		||||
	}
 | 
			
		||||
	return (options_value_tostring(o, &o->value, numeric));
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								tmux.h
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								tmux.h
									
									
									
									
									
								
							@@ -1742,7 +1742,7 @@ u_int		 options_array_item_index(struct options_array_item *);
 | 
			
		||||
union options_value *options_array_item_value(struct options_array_item *);
 | 
			
		||||
int		 options_isarray(struct options_entry *);
 | 
			
		||||
int		 options_isstring(struct options_entry *);
 | 
			
		||||
const char	*options_tostring(struct options_entry *, int, int);
 | 
			
		||||
char		*options_tostring(struct options_entry *, int, int);
 | 
			
		||||
char		*options_parse(const char *, int *);
 | 
			
		||||
struct options_entry *options_parse_get(struct options *, const char *, int *,
 | 
			
		||||
		     int);
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user