comparison lwcc/symbol.c @ 495:5b8871fd7503

Merged previous lwcc development branch into mainline.
author William Astle <lost@l-w.ca>
date Mon, 05 Aug 2019 21:27:09 -0600
parents 54f213c8fb81
children
comparison
equal deleted inserted replaced
493:6073f4a33475 495:5b8871fd7503
1 /*
2 lwcc/symbol.c
3
4 Copyright © 2013 William Astle
5
6 This file is part of LWTOOLS.
7
8 LWTOOLS is free software: you can redistribute it and/or modify it under the
9 terms of the GNU General Public License as published by the Free Software
10 Foundation, either version 3 of the License, or (at your option) any later
11 version.
12
13 This program is distributed in the hope that it will be useful, but WITHOUT
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
16 more details.
17
18 You should have received a copy of the GNU General Public License along with
19 this program. If not, see <http://www.gnu.org/licenses/>.
20 */
21
22 #include <string.h>
23
24 #include <lw_alloc.h>
25 #include <lw_string.h>
26
27 #include "cpp.h"
28 #include "symbol.h"
29 #include "token.h"
30
31 void symbol_free(struct symtab_e *s)
32 {
33 int i;
34
35 lw_free(s -> name);
36
37 for (i = 0; i < s -> nargs; i++)
38 lw_free(s -> params[i]);
39 lw_free(s -> params);
40 token_list_destroy(s -> tl);
41 }
42
43 struct symtab_e *symtab_find(struct preproc_info *pp, char *name)
44 {
45 struct symtab_e *s;
46
47 for (s = pp -> sh; s; s = s -> next)
48 {
49 if (strcmp(s -> name, name) == 0)
50 {
51 return s;
52 }
53 }
54 return NULL;
55 }
56
57 void symtab_undef(struct preproc_info *pp, char *name)
58 {
59 struct symtab_e *s, **p;
60
61 p = &(pp -> sh);
62 for (s = pp -> sh; s; s = s -> next)
63 {
64 if (strcmp(s -> name, name) == 0)
65 {
66 (*p) -> next = s -> next;
67 symbol_free(s);
68 return;
69 }
70 p = &((*p) -> next);
71 }
72 }
73
74 void symtab_define(struct preproc_info *pp, char *name, struct token_list *def, int nargs, char **params, int vargs)
75 {
76 struct symtab_e *s;
77 int i;
78
79 s = lw_alloc(sizeof(struct symtab_e));
80 s -> name = lw_strdup(name);
81 s -> tl = def;
82 s -> nargs = nargs;
83 s -> params = NULL;
84 if (params)
85 {
86 s -> params = lw_alloc(sizeof(char *) * nargs);
87 for (i = 0; i < nargs; i++)
88 s -> params[i] = lw_strdup(params[i]);
89 }
90 s -> vargs = vargs;
91 s -> next = pp -> sh;
92 pp -> sh = s;
93 }
94
95 void symtab_dump(struct preproc_info *pp)
96 {
97 struct symtab_e *s;
98 struct token *t;
99 int i;
100
101 for (s = pp -> sh; s; s = s -> next)
102 {
103 printf("%s", s -> name);
104 if (s -> nargs >= 0)
105 {
106 printf("(");
107 for (i = 0; i < s -> nargs; i++)
108 {
109 if (i)
110 printf(",");
111 printf("%s", s -> params[i]);
112 }
113 if (s -> vargs)
114 {
115 if (s -> nargs)
116 printf(",");
117 printf("...");
118 }
119 printf(")");
120 }
121 printf(" => ");
122 if (s -> tl)
123 {
124 for (t = s -> tl -> head; t; t = t -> next)
125 {
126 token_print(t, stdout);
127 }
128 }
129 printf("\n");
130 }
131 }