-
Notifications
You must be signed in to change notification settings - Fork 0
/
symtable.c
133 lines (113 loc) · 4.25 KB
/
symtable.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
///////////////////////////////////////////////////////////////////////////////////
// School: Brno University of Technology, Faculty of Information Technology //
// Course: Formal Languages and Compilers //
// Project: IFJ17 //
// Module: Hash Table //
// Authors: Kristián Liščinský (xlisci01) //
// Matúš Liščinský (xlisci02) //
// Šimon Stupinský (xstupi00) //
// Vladimír Marcin (xmarci10) //
///////////////////////////////////////////////////////////////////////////////////
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "symtable.h"
#include "error.h"
#include "scanner.h"
#include "semantic_control.h"
#include "clear.h"
/// replace malloc calls with our malloc wrapper
#define malloc(size) _malloc(size)
unsigned hash_function(const char *key){
unsigned int h = 0;
const unsigned char *p;
for(p = (const unsigned char*)key; *p != '\0'; p++){
h = 65599*h + *p;
}
return h;
}
htab_t* htab_init(unsigned size){
/// create new hash table
htab_t *t = (htab_t*) malloc(sizeof(htab_t) + size * sizeof(htab_item_t*));
if(t == NULL)
print_err(99);
t->arr_size = size;
t->n = 0;
/// init hash table
for(unsigned i = 0; i < t->arr_size; i++)
t->ptr[i] = NULL;
return t;
}
htab_item_t* htab_find(htab_t *table, const char *key){
if(table == NULL || key == NULL)
return NULL;
/// get index to table
unsigned index = hash_function(key) % table->arr_size;
htab_item_t *tmp = NULL;
for(tmp = table->ptr[index]; tmp != NULL; tmp = tmp->next)
/// return found item
if(!(strcmp(tmp->key,key)))
return tmp;
return NULL;
}
htab_item_t* htab_insert(htab_t *table, const char *key){
if(table == NULL || key == NULL)
return NULL;
unsigned index = hash_function(key) % table->arr_size;
htab_item_t *tmp = NULL;
/// create new item
htab_item_t *new_item = (htab_item_t*)malloc(sizeof(htab_item_t));
if(new_item == NULL)
print_err(99);
new_item->key = malloc((strlen(key)+1)*sizeof(char));
if(new_item->key == NULL)
print_err(99);
strcpy(new_item->key, key);
/// insertion of the item to the first position in list
tmp = table->ptr[index];
new_item->next = tmp;
table->ptr[index] = new_item;
table->n+=1;
return new_item;
}
void htab_foreach(htab_t *table, void(*func)(char*,bool,void*)){
for(unsigned i = 0; i < table->arr_size; i++){
for(htab_item_t *tmp = table->ptr[i]; tmp != NULL; tmp = tmp->next){
if(tmp->is_function)
func(tmp->key, tmp->is_function, tmp->data.fun);
else
func(tmp->key, tmp->is_function, tmp->data.var);
}
}
}
void htab_print(char *key, bool f, void *data){
(void)key;(void)f;(void)data;
/// function is defined only if DEBUG option is use while compiling
#ifdef DEBUG
printf("id:\t\t%s\n",key);
if(!f){
printf("VARIABLE\n");
printf("data type:\t%d\n",((variable_t*)data)->data_type);
switch(((variable_t*)data)->data_type){
case INTEGER:
printf("data:\t\t%d\n",((variable_t*)data)->data.i);
break;
case DOUBLE:
printf("data:\t\t%f\n",((variable_t*)data)->data.d);
break;
case STRING:
printf("data:\t\t%s\n",((variable_t*)data)->data.str);
break;
}
}
else{
printf("FUNCTION\n");
printf("return type:\t%d\n",((function_t*)data)->return_type);
printf("is defined:\t%d\n",((function_t*)data)->defined);
printf("params count:\t%lu\n",((function_t*)data)->params->length);
printf("params:\t\t%s\n",((function_t*)data)->params->string);
if(((function_t*)data)->local_symtable->n)
htab_foreach(((function_t*)data)->local_symtable,htab_print);
}
#endif
}