Parse compound statements, 'break', 'continue', 'default', 'case' and
[smatch.git] / lib.c
blob05c4526498ff4fb944b626d4d73ffcf67a790c3b
1 /*
2 * Helper routines
3 */
4 #include <stdarg.h>
5 #include <stdio.h>
6 #include <stdlib.h>
7 #include <string.h>
9 #include "list.h"
10 #include "token.h"
12 void iterate(struct ptr_list *list, void (*callback)(void *))
14 while (list) {
15 int i;
16 for (i = 0; i < list->nr; i++)
17 callback(list->list[i]);
18 list = list->next;
22 void add_ptr_list(struct ptr_list **listp, void *ptr)
24 struct ptr_list *list = *listp;
25 int nr;
27 if (!list || (nr = list->nr) >= LIST_NODE_NR) {
28 struct ptr_list *newlist = malloc(sizeof(*newlist));
29 if (!newlist)
30 die("out of memory for symbol/statement lists");
31 memset(newlist, 0, sizeof(*newlist));
32 newlist->next = list;
33 list = newlist;
34 *listp = newlist;
35 nr = 0;
37 list->list[nr] = ptr;
38 nr++;
39 list->nr = nr;
42 void warn(struct token *token, const char * fmt, ...)
44 static char buffer[512];
45 const char *name;
46 int pos,line;
48 va_list args;
49 va_start(args, fmt);
50 vsprintf(buffer, fmt, args);
51 va_end(args);
53 name = "EOF";
54 pos = 0;
55 line = 0;
56 if (token) {
57 name = input_streams[token->stream].name;
58 pos = token->pos;
59 line = token->line;
62 fprintf(stderr, "warning: %s:%d:%d: %s\n",
63 name, line, pos, buffer);
67 void die(const char *fmt, ...)
69 va_list args;
70 static char buffer[512];
72 va_start(args, fmt);
73 vsnprintf(buffer, sizeof(buffer), fmt, args);
74 va_end(args);
76 fprintf(stderr, "%s\n", buffer);
77 exit(1);