1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23#ifndef MODUTILS_GENKSYMS_H
24#define MODUTILS_GENKSYMS_H 1
25
26#include <stdio.h>
27
28enum symbol_type {
29 SYM_NORMAL, SYM_TYPEDEF, SYM_ENUM, SYM_STRUCT, SYM_UNION
30};
31
32enum symbol_status {
33 STATUS_UNCHANGED, STATUS_DEFINED, STATUS_MODIFIED
34};
35
36struct string_list {
37 struct string_list *next;
38 enum symbol_type tag;
39 char *string;
40};
41
42struct symbol {
43 struct symbol *hash_next;
44 const char *name;
45 enum symbol_type type;
46 struct string_list *defn;
47 struct symbol *expansion_trail;
48 struct symbol *visited;
49 int is_extern;
50 int is_declared;
51 enum symbol_status status;
52 int is_override;
53};
54
55typedef struct string_list **yystype;
56#define YYSTYPE yystype
57
58extern int cur_line;
59extern char *cur_filename;
60
61struct symbol *find_symbol(const char *name, enum symbol_type ns);
62struct symbol *add_symbol(const char *name, enum symbol_type type,
63 struct string_list *defn, int is_extern);
64void export_symbol(const char *);
65
66void free_node(struct string_list *list);
67void free_list(struct string_list *s, struct string_list *e);
68struct string_list *copy_node(struct string_list *);
69
70int yylex(void);
71int yyparse(void);
72
73void error_with_pos(const char *, ...);
74
75
76#define xmalloc(size) ({ void *__ptr = malloc(size); \
77 if(!__ptr && size != 0) { \
78 fprintf(stderr, "out of memory\n"); \
79 exit(1); \
80 } \
81 __ptr; })
82#define xstrdup(str) ({ char *__str = strdup(str); \
83 if (!__str) { \
84 fprintf(stderr, "out of memory\n"); \
85 exit(1); \
86 } \
87 __str; })
88
89#endif
90