=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tmux/options.c,v retrieving revision 1.20 retrieving revision 1.21 diff -c -r1.20 -r1.21 *** src/usr.bin/tmux/options.c 2016/10/10 21:29:23 1.20 --- src/usr.bin/tmux/options.c 2017/01/11 14:56:44 1.21 *************** *** 1,4 **** ! /* $OpenBSD: options.c,v 1.20 2016/10/10 21:29:23 nicm Exp $ */ /* * Copyright (c) 2008 Nicholas Marriott --- 1,4 ---- ! /* $OpenBSD: options.c,v 1.21 2017/01/11 14:56:44 nicm Exp $ */ /* * Copyright (c) 2008 Nicholas Marriott *************** *** 37,44 **** static int options_cmp(struct options_entry *, struct options_entry *); RB_GENERATE_STATIC(options_tree, options_entry, entry, options_cmp); - static void options_free1(struct options *, struct options_entry *); - static int options_cmp(struct options_entry *o1, struct options_entry *o2) { --- 37,42 ---- *************** *** 66,71 **** --- 64,91 ---- free(o); } + static struct options_entry * + options_new(struct options *oo, const char *name, char **s) + { + struct options_entry *o; + + if (s != NULL) + *s = NULL; + + if ((o = options_find1(oo, name)) == NULL) { + o = xmalloc(sizeof *o); + o->name = xstrdup(name); + RB_INSERT(options_tree, &oo->tree, o); + memcpy(&o->style, &grid_default_cell, sizeof o->style); + } else if (o->type == OPTIONS_STRING) { + if (s != NULL) + *s = o->str; + else + free(o->str); + } + return (o); + } + void options_free(struct options *oo) { *************** *** 129,149 **** va_list ap; char *s; - s = NULL; - if ((o = options_find1(oo, name)) == NULL) { - o = xmalloc(sizeof *o); - o->name = xstrdup(name); - RB_INSERT(options_tree, &oo->tree, o); - memcpy(&o->style, &grid_default_cell, sizeof o->style); - } else if (o->type == OPTIONS_STRING) - s = o->str; - va_start(ap, fmt); o->type = OPTIONS_STRING; xvasprintf(&o->str, fmt, ap); - va_end(ap); - free(s); return (o); } --- 149,162 ---- va_list ap; char *s; va_start(ap, fmt); + + o = options_new(oo, name, &s); o->type = OPTIONS_STRING; xvasprintf(&o->str, fmt, ap); free(s); + + va_end(ap); return (o); } *************** *** 164,179 **** { struct options_entry *o; ! if ((o = options_find1(oo, name)) == NULL) { ! o = xmalloc(sizeof *o); ! o->name = xstrdup(name); ! RB_INSERT(options_tree, &oo->tree, o); ! memcpy(&o->style, &grid_default_cell, sizeof o->style); ! } else if (o->type == OPTIONS_STRING) ! free(o->str); ! o->type = OPTIONS_NUMBER; o->num = value; return (o); } --- 177,186 ---- { struct options_entry *o; ! o = options_new(oo, name, NULL); o->type = OPTIONS_NUMBER; o->num = value; + return (o); } *************** *** 205,219 **** if (style_parse(&grid_default_cell, &tmpgc, value) == -1) return (NULL); ! if (o == NULL) { ! o = xmalloc(sizeof *o); ! o->name = xstrdup(name); ! RB_INSERT(options_tree, &oo->tree, o); ! } else if (o->type == OPTIONS_STRING) ! free(o->str); ! o->type = OPTIONS_STYLE; memcpy(&o->style, &tmpgc, sizeof o->style); return (o); } --- 212,221 ---- if (style_parse(&grid_default_cell, &tmpgc, value) == -1) return (NULL); ! o = options_new(oo, name, NULL); o->type = OPTIONS_STYLE; memcpy(&o->style, &tmpgc, sizeof o->style); + return (o); }