doc: paulchen beispiele {code{a,b},gesamt} entpackt (jedes mal entpacken nervt langsa...
[uebersetzerbau-ss10.git] / aus_sammelwut / paulchen / ublu / ss08 / abgabe / gesamt / symbol_table.c
1 #include <string.h>
2 #include <stdlib.h>
3 #include <stdio.h>
4 #include "symbol_table.h"
5
6 struct symbol_t *new_table(void) {
7         return (struct symbol_t *)NULL;
8 }
9
10 struct symbol_t *clone_table(struct symbol_t *table) {
11         struct symbol_t *element;
12         struct symbol_t *new_tablex;
13
14         element=table;
15         new_tablex=new_table();
16         while((struct symbol_t *)NULL!=element) {
17                 /* check return value */
18                 if(element->param_index!=-1) {
19                         new_tablex=table_add_param(new_tablex,element->identifier,element->param_index);
20                 }
21                 else {
22                         new_tablex=table_add_symbol(new_tablex,element->identifier,element->type,0,element->stack_offset);
23                 }
24                 element=element->next;
25         }
26
27         return new_tablex;
28 }
29
30 struct symbol_t *table_add_symbol(struct symbol_t *table, char *identifier, short type, short check, int stack_offset) {
31         struct symbol_t *element;
32         struct symbol_t *new_element;
33
34         if(table_lookup(table,identifier)!=(struct symbol_t *)NULL) {
35                 if(check) {
36                         fprintf(stderr,"Duplicate field %s.\n",identifier);
37                         exit(3);
38                 }
39
40                 table=table_remove_symbol(table,identifier);
41         }
42         
43         new_element=(struct symbol_t *)malloc(sizeof(struct symbol_t));
44         new_element->next=(struct symbol_t *)NULL;
45         new_element->identifier=strdup(identifier);
46         new_element->type=type;
47         new_element->stack_offset=stack_offset;
48         new_element->param_index=-1;
49
50         if((struct symbol_t *)NULL==table) {
51                 return new_element;
52         }
53         element=table;
54
55         while((struct symbol_t *)NULL!=element->next) {
56                 element=element->next;
57         }
58
59         element->next=new_element;
60         
61         return table;
62 }
63
64 struct symbol_t *table_add_param(struct symbol_t *table, char *identifier, int param_index) {
65         struct symbol_t *element;
66         struct symbol_t *new_element;
67
68         if(table_lookup(table,identifier)!=(struct symbol_t *)NULL) {
69                 table=table_remove_symbol(table,identifier);
70         }
71         
72         new_element=(struct symbol_t *)malloc(sizeof(struct symbol_t));
73         new_element->next=(struct symbol_t *)NULL;
74         new_element->identifier=strdup(identifier);
75         new_element->type=SYMBOL_TYPE_PARAM;
76         new_element->param_index=param_index;
77
78         if((struct symbol_t *)NULL==table) {
79                 return new_element;
80         }
81         element=table;
82
83         while((struct symbol_t *)NULL!=element->next) {
84                 element=element->next;
85         }
86
87         element->next=new_element;
88         
89         return table;
90 }
91
92 struct symbol_t *table_lookup(struct symbol_t *table, char *identifier) {
93         struct symbol_t *element;
94
95         element=table;
96
97         if((struct symbol_t *)NULL==table) {
98                 return (struct symbol_t *)NULL;
99         }
100         
101         if(strcmp(element->identifier,identifier)==0) {
102                 return element;
103         }
104         
105         while((struct symbol_t *)NULL!=element->next) {
106                 element=element->next;
107                 if(strcmp(element->identifier,identifier)==0) {
108                         return element;
109                 }
110         }
111
112         return (struct symbol_t *)NULL;
113 }
114
115 struct symbol_t *table_merge(struct symbol_t *table, struct symbol_t *to_add, short check) {
116         struct symbol_t *element;
117         struct symbol_t *new_table=clone_table(table);
118         
119         element=to_add;
120         while(element!=(struct symbol_t *)NULL) {
121                 if(element->param_index!=-1) {
122                         new_table=table_add_param(new_table,element->identifier,element->param_index);
123                 }
124                 else {
125                         new_table=table_add_symbol(new_table,element->identifier,element->type,check,element->stack_offset);
126                 }
127                 element=element->next;
128         }
129
130         return new_table;
131 }
132
133 struct symbol_t *table_remove_symbol(struct symbol_t *table, char *identifier) {
134         struct symbol_t *element;
135         struct symbol_t *previous_element;
136         struct symbol_t *new_element;
137
138         if((struct symbol_t *)NULL==table) {
139                 return table;
140         }
141
142         previous_element=(struct symbol_t *)NULL;
143         element=table;
144
145         while((struct symbol_t *)NULL!=element) {
146                 if(strcmp(element->identifier,identifier)==0) {
147                         if((struct symbol_t *)NULL==previous_element) {
148                                 new_element=element->next;
149                         }
150                         else {
151                                 previous_element->next=element->next;
152                                 new_element=table;
153                         }
154                         (void)free(element->identifier);
155                         (void)free(element);
156                         return new_element;
157                 }
158                 previous_element=element;
159                 element=element->next;
160         }
161
162         return table;
163 }
164
165 void check_variable(struct symbol_t *table, char *identifier) {
166         struct symbol_t *element=table_lookup(table,identifier);
167         if(element!=(struct symbol_t *)NULL) {
168                 if(element->type!=SYMBOL_TYPE_VAR && element->type!=SYMBOL_TYPE_PARAM) {
169                         fprintf(stderr,"Identifier %s not a variable.\n",identifier);
170                         exit(3);
171                 }
172         }
173         else {
174                 fprintf(stderr,"Unknown identifier %s.\n",identifier);
175                 exit(3);
176         }
177 }
178
179 void check_field(struct symbol_t *table, char *identifier) {
180         struct symbol_t *element=table_lookup(table,identifier);
181         if(element!=(struct symbol_t *)NULL) {
182                 if(element->type!=SYMBOL_TYPE_FIELD) {
183                         fprintf(stderr,"Identifier %s not a variable.\n",identifier);
184                         exit(3);
185                 }
186         }
187         else {
188                 fprintf(stderr,"Unknown identifier %s.\n",identifier);
189                 exit(3);
190         }
191 }
192