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:
		
							
								
								
									
										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));
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user