diff options
author | Michal Marek <mmarek@suse.cz> | 2011-02-03 01:52:13 +0300 |
---|---|---|
committer | Michal Marek <mmarek@suse.cz> | 2011-03-17 17:13:55 +0300 |
commit | 68eb8563a1adf27fae18dde4c95fb796c17563df (patch) | |
tree | 792085b5e18719922554bc72ccfb8a1d042a262c /scripts | |
parent | 7ec8eda154cbdcabb5305d90fb0952973dcaa560 (diff) | |
download | linux-68eb8563a1adf27fae18dde4c95fb796c17563df.tar.xz |
genksyms: Add helpers for building string lists
Signed-off-by: Michal Marek <mmarek@suse.cz>
Acked-by: Sam Ravnborg <sam@ravnborg.org>
Diffstat (limited to 'scripts')
-rw-r--r-- | scripts/genksyms/genksyms.c | 70 |
1 files changed, 38 insertions, 32 deletions
diff --git a/scripts/genksyms/genksyms.c b/scripts/genksyms/genksyms.c index 2a1a3b84beba..d17b7a2b941f 100644 --- a/scripts/genksyms/genksyms.c +++ b/scripts/genksyms/genksyms.c @@ -66,6 +66,8 @@ static const struct { static int equal_list(struct string_list *a, struct string_list *b); static void print_list(FILE * f, struct string_list *list); +static struct string_list *concat_list(struct string_list *start, ...); +static struct string_list *mk_node(const char *string); static void print_location(void); static void print_type_name(enum symbol_type type, const char *name); @@ -299,6 +301,35 @@ void free_list(struct string_list *s, struct string_list *e) } } +static struct string_list *mk_node(const char *string) +{ + struct string_list *newnode; + + newnode = xmalloc(sizeof(*newnode)); + newnode->string = xstrdup(string); + newnode->tag = SYM_NORMAL; + newnode->next = NULL; + + return newnode; +} + +static struct string_list *concat_list(struct string_list *start, ...) +{ + va_list ap; + struct string_list *n, *n2; + + if (!start) + return NULL; + for (va_start(ap, start); (n = va_arg(ap, struct string_list *));) { + for (n2 = n; n2->next; n2 = n2->next) + ; + n2->next = start; + start = n; + } + va_end(ap); + return start; +} + struct string_list *copy_node(struct string_list *node) { struct string_list *newnode; @@ -499,42 +530,17 @@ static unsigned long expand_and_crc_sym(struct symbol *sym, unsigned long crc) case SYM_ENUM: subsym = find_symbol(cur->string, cur->tag); if (!subsym) { - struct string_list *n, *t = NULL; + struct string_list *n; error_with_pos("expand undefined %s %s", symbol_types[cur->tag].name, cur->string); - - n = xmalloc(sizeof(*n)); - n->string = xstrdup(symbol_types[cur->tag].name); - n->tag = SYM_NORMAL; - n->next = t; - t = n; - - n = xmalloc(sizeof(*n)); - n->string = xstrdup(cur->string); - n->tag = SYM_NORMAL; - n->next = t; - t = n; - - n = xmalloc(sizeof(*n)); - n->string = xstrdup("{"); - n->tag = SYM_NORMAL; - n->next = t; - t = n; - - n = xmalloc(sizeof(*n)); - n->string = xstrdup("UNKNOWN"); - n->tag = SYM_NORMAL; - n->next = t; - t = n; - - n = xmalloc(sizeof(*n)); - n->string = xstrdup("}"); - n->tag = SYM_NORMAL; - n->next = t; - t = n; - + n = concat_list(mk_node + (symbol_types[cur->tag].name), + mk_node(cur->string), + mk_node("{"), + mk_node("UNKNOWN"), + mk_node("}"), NULL); subsym = add_symbol(cur->string, cur->tag, n, 0); } |