aboutsummaryrefslogtreecommitdiffstats
path: root/scripts
diff options
context:
space:
mode:
authorMichal Marek <mmarek@suse.cz>2011-02-02 17:52:13 -0500
committerMichal Marek <mmarek@suse.cz>2011-03-17 10:13:55 -0400
commit68eb8563a1adf27fae18dde4c95fb796c17563df (patch)
tree792085b5e18719922554bc72ccfb8a1d042a262c /scripts
parent7ec8eda154cbdcabb5305d90fb0952973dcaa560 (diff)
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.c70
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 {
66 66
67static int equal_list(struct string_list *a, struct string_list *b); 67static int equal_list(struct string_list *a, struct string_list *b);
68static void print_list(FILE * f, struct string_list *list); 68static void print_list(FILE * f, struct string_list *list);
69static struct string_list *concat_list(struct string_list *start, ...);
70static struct string_list *mk_node(const char *string);
69static void print_location(void); 71static void print_location(void);
70static void print_type_name(enum symbol_type type, const char *name); 72static void print_type_name(enum symbol_type type, const char *name);
71 73
@@ -299,6 +301,35 @@ void free_list(struct string_list *s, struct string_list *e)
299 } 301 }
300} 302}
301 303
304static struct string_list *mk_node(const char *string)
305{
306 struct string_list *newnode;
307
308 newnode = xmalloc(sizeof(*newnode));
309 newnode->string = xstrdup(string);
310 newnode->tag = SYM_NORMAL;
311 newnode->next = NULL;
312
313 return newnode;
314}
315
316static struct string_list *concat_list(struct string_list *start, ...)
317{
318 va_list ap;
319 struct string_list *n, *n2;
320
321 if (!start)
322 return NULL;
323 for (va_start(ap, start); (n = va_arg(ap, struct string_list *));) {
324 for (n2 = n; n2->next; n2 = n2->next)
325 ;
326 n2->next = start;
327 start = n;
328 }
329 va_end(ap);
330 return start;
331}
332
302struct string_list *copy_node(struct string_list *node) 333struct string_list *copy_node(struct string_list *node)
303{ 334{
304 struct string_list *newnode; 335 struct string_list *newnode;
@@ -499,42 +530,17 @@ static unsigned long expand_and_crc_sym(struct symbol *sym, unsigned long crc)
499 case SYM_ENUM: 530 case SYM_ENUM:
500 subsym = find_symbol(cur->string, cur->tag); 531 subsym = find_symbol(cur->string, cur->tag);
501 if (!subsym) { 532 if (!subsym) {
502 struct string_list *n, *t = NULL; 533 struct string_list *n;
503 534
504 error_with_pos("expand undefined %s %s", 535 error_with_pos("expand undefined %s %s",
505 symbol_types[cur->tag].name, 536 symbol_types[cur->tag].name,
506 cur->string); 537 cur->string);
507 538 n = concat_list(mk_node
508 n = xmalloc(sizeof(*n)); 539 (symbol_types[cur->tag].name),
509 n->string = xstrdup(symbol_types[cur->tag].name); 540 mk_node(cur->string),
510 n->tag = SYM_NORMAL; 541 mk_node("{"),
511 n->next = t; 542 mk_node("UNKNOWN"),
512 t = n; 543 mk_node("}"), NULL);
513
514 n = xmalloc(sizeof(*n));
515 n->string = xstrdup(cur->string);
516 n->tag = SYM_NORMAL;
517 n->next = t;
518 t = n;
519
520 n = xmalloc(sizeof(*n));
521 n->string = xstrdup("{");
522 n->tag = SYM_NORMAL;
523 n->next = t;
524 t = n;
525
526 n = xmalloc(sizeof(*n));
527 n->string = xstrdup("UNKNOWN");
528 n->tag = SYM_NORMAL;
529 n->next = t;
530 t = n;
531
532 n = xmalloc(sizeof(*n));
533 n->string = xstrdup("}");
534 n->tag = SYM_NORMAL;
535 n->next = t;
536 t = n;
537
538 subsym = 544 subsym =
539 add_symbol(cur->string, cur->tag, n, 0); 545 add_symbol(cur->string, cur->tag, n, 0);
540 } 546 }