-
Notifications
You must be signed in to change notification settings - Fork 0
/
Table_des_symboles.c
80 lines (58 loc) · 1.57 KB
/
Table_des_symboles.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
/*
* Table des symboles.c
*
* Created by Janin on 12/10/10.
* Copyright 2010 LaBRI. All rights reserved.
*
*/
#include <stdlib.h>
#include <stdio.h>
#include "Table_des_symboles.h"
/* bit type handling */
/* Attribute types */
attribute new_attribute () {
attribute r;
r = malloc (sizeof (struct ATTRIBUTE));
if (r==NULL) {printf("Failed Malloc\n"); exit(-1);}
return r;
};
attribute makeSymbol(int type, int offset, int depth)
{
attribute r = new_attribute();
r -> type = type;
r -> offset = offset;
r -> depth = depth;
r -> arg_count = 0;
return r;
}
/* The storage structure is implemented as a linked chain */
/* linked element def */
typedef struct elem {
sid symbol_name;
attribute symbol_value;
struct elem * next;
} elem;
/* linked chain initial element */
static elem * storage=NULL;
/* get the symbol value of symb_id from the symbol table */
attribute get_symbol_value(sid symb_id) {
elem * tracker=storage;
/* look into the linked list for the symbol value */
while (tracker) {
if (tracker -> symbol_name == symb_id) return tracker -> symbol_value;
tracker = tracker -> next;
}
/* if not found does cause an error */
fprintf(stderr,"Error : symbol %s is not a valid defined symbol\n",(char *) symb_id);
exit(-1);
};
/* add the symbol symb_id with given value */
attribute set_symbol_value(sid symb_id,attribute value) {
elem * tracker;
tracker = malloc(sizeof(elem));
tracker -> symbol_name = symb_id;
tracker -> symbol_value = value;
tracker -> next = storage;
storage = tracker;
return storage -> symbol_value;
}