doc: paulchen beispiele {code{a,b},gesamt} entpackt (jedes mal entpacken nervt langsa...
[uebersetzerbau-ss10.git] / aus_sammelwut / paulchen / ublu / ss08 / abgabe / codea / .svn / text-base / symbol_table.c.svn-base
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                 new_tablex=table_add_symbol(new_tablex,element->identifier,element->type,0,element->stack_offset);
19                 element=element->next;
20         }
21
22         return new_tablex;
23 }
24
25 struct symbol_t *table_add_symbol(struct symbol_t *table, char *identifier, short type, short check, int stack_offset) {
26         struct symbol_t *element;
27         struct symbol_t *new_element;
28
29         if(table_lookup(table,identifier)!=(struct symbol_t *)NULL) {
30                 if(check) {
31                         fprintf(stderr,"Duplicate field %s.\n",identifier);
32                         exit(3);
33                 }
34
35                 table=table_remove_symbol(table,identifier);
36         }
37         
38         new_element=(struct symbol_t *)malloc(sizeof(struct symbol_t));
39         new_element->next=(struct symbol_t *)NULL;
40         new_element->identifier=strdup(identifier);
41         new_element->type=type;
42         new_element->stack_offset=stack_offset;
43
44         if((struct symbol_t *)NULL==table) {
45                 return new_element;
46         }
47         element=table;
48
49         while((struct symbol_t *)NULL!=element->next) {
50                 element=element->next;
51         }
52
53         element->next=new_element;
54         
55         return table;
56 }
57
58 struct symbol_t *table_lookup(struct symbol_t *table, char *identifier) {
59         struct symbol_t *element;
60
61         element=table;
62
63         if((struct symbol_t *)NULL==table) {
64                 return (struct symbol_t *)NULL;
65         }
66         
67         if(strcmp(element->identifier,identifier)==0) {
68                 return element;
69         }
70         
71         while((struct symbol_t *)NULL!=element->next) {
72                 element=element->next;
73                 if(strcmp(element->identifier,identifier)==0) {
74                         return element;
75                 }
76         }
77
78         return (struct symbol_t *)NULL;
79 }
80
81 struct symbol_t *table_merge(struct symbol_t *table, struct symbol_t *to_add, short check) {
82         struct symbol_t *element;
83         struct symbol_t *new_table=clone_table(table);
84         
85         element=to_add;
86         while(element!=(struct symbol_t *)NULL) {
87                 printf("%s\n",element->identifier);
88                 new_table=table_add_symbol(new_table,element->identifier,element->type,check,element->stack_offset);
89                 element=element->next;
90         }
91
92         return new_table;
93 }
94
95 struct symbol_t *table_remove_symbol(struct symbol_t *table, char *identifier) {
96         struct symbol_t *element;
97         struct symbol_t *previous_element;
98         struct symbol_t *new_element;
99
100         if((struct symbol_t *)NULL==table) {
101                 return table;
102         }
103
104         previous_element=(struct symbol_t *)NULL;
105         element=table;
106
107         while((struct symbol_t *)NULL!=element) {
108                 if(strcmp(element->identifier,identifier)==0) {
109                         if((struct symbol_t *)NULL==previous_element) {
110                                 new_element=element->next;
111                         }
112                         else {
113                                 previous_element->next=element->next;
114                                 new_element=table;
115                         }
116                         (void)free(element->identifier);
117                         (void)free(element);
118                         return new_element;
119                 }
120                 previous_element=element;
121                 element=element->next;
122         }
123
124         return table;
125 }
126
127 void check_variable(struct symbol_t *table, char *identifier) {
128         struct symbol_t *element=table_lookup(table,identifier);
129         if(element!=(struct symbol_t *)NULL) {
130                 if(element->type!=SYMBOL_TYPE_VAR && element->type!=SYMBOL_TYPE_PARAM) {
131                         fprintf(stderr,"Identifier %s not a variable.\n",identifier);
132                         exit(3);
133                 }
134         }
135         else {
136                 fprintf(stderr,"Unknown identifier %s.\n",identifier);
137                 exit(3);
138         }
139 }
140
141 void check_field(struct symbol_t *table, char *identifier) {
142         struct symbol_t *element=table_lookup(table,identifier);
143         if(element!=(struct symbol_t *)NULL) {
144                 if(element->type!=SYMBOL_TYPE_FIELD) {
145                         fprintf(stderr,"Identifier %s not a variable.\n",identifier);
146                         exit(3);
147                 }
148         }
149         else {
150                 fprintf(stderr,"Unknown identifier %s.\n",identifier);
151                 exit(3);
152         }
153 }
154