4 #include "symbol_table.h"
6 struct symbol_t *new_table(void) {
7 return (struct symbol_t *)NULL;
10 struct symbol_t *clone_table(struct symbol_t *table) {
11 struct symbol_t *element;
12 struct symbol_t *new_tablex;
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);
19 element=element->next;
25 struct symbol_t *table_add_symbol(struct symbol_t *table, char *identifier, short type, short check) {
26 struct symbol_t *element;
27 struct symbol_t *new_element;
29 if(table_lookup(table,identifier)!=(struct symbol_t *)NULL) {
31 fprintf(stderr,"Duplicate field %s.\n",identifier);
35 table=table_remove_symbol(table,identifier);
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;
43 if((struct symbol_t *)NULL==table) {
48 while((struct symbol_t *)NULL!=element->next) {
49 element=element->next;
52 element->next=new_element;
57 struct symbol_t *table_lookup(struct symbol_t *table, char *identifier) {
58 struct symbol_t *element;
62 if((struct symbol_t *)NULL==table) {
63 return (struct symbol_t *)NULL;
66 if(strcmp(element->identifier,identifier)==0) {
70 while((struct symbol_t *)NULL!=element->next) {
71 element=element->next;
72 if(strcmp(element->identifier,identifier)==0) {
77 return (struct symbol_t *)NULL;
80 struct symbol_t *table_merge(struct symbol_t *table, struct symbol_t *to_add, short check) {
81 struct symbol_t *element;
82 struct symbol_t *new_table=clone_table(table);
85 while(element!=(struct symbol_t *)NULL) {
86 new_table=table_add_symbol(new_table,element->identifier,element->type,check);
87 element=element->next;
93 struct symbol_t *table_remove_symbol(struct symbol_t *table, char *identifier) {
94 struct symbol_t *element;
95 struct symbol_t *previous_element;
96 struct symbol_t *new_element;
98 if((struct symbol_t *)NULL==table) {
102 previous_element=(struct symbol_t *)NULL;
105 while((struct symbol_t *)NULL!=element) {
106 if(strcmp(element->identifier,identifier)==0) {
107 if((struct symbol_t *)NULL==previous_element) {
108 new_element=element->next;
111 previous_element->next=element->next;
114 (void)free(element->identifier);
118 previous_element=element;
119 element=element->next;
125 void check_variable(struct symbol_t *table, char *identifier) {
126 struct symbol_t *element=table_lookup(table,identifier);
127 if(element!=(struct symbol_t *)NULL) {
128 if(element->type!=SYMBOL_TYPE_VAR) {
129 fprintf(stderr,"Identifier %s not a variable.\n",identifier);
134 fprintf(stderr,"Unknown identifier %s.\n",identifier);
139 void check_field(struct symbol_t *table, char *identifier) {
140 struct symbol_t *element=table_lookup(table,identifier);
141 if(element!=(struct symbol_t *)NULL) {
142 if(element->type!=SYMBOL_TYPE_FIELD) {
143 fprintf(stderr,"Identifier %s not a variable.\n",identifier);
148 fprintf(stderr,"Unknown identifier %s.\n",identifier);