-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsymbol.c
61 lines (55 loc) · 1.37 KB
/
symbol.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
#include <stdio.h>
#include <string.h>
#include "es.h"
Sexp *intern_symbol(char* symbol)
{
Atom** interned = (Atom**)emalloc(sizeof(Atom*));
scan_symbol(symbol, symbol_table, interned);
return mk_S(*interned, 0);
}
int lookup_symbol(char* symbol, Symbols* symtable, Atom** gap)
{
if (symtable->sym == NULL){
return 0;
} else {
Atom* ap = symtable->sym;
if (!strcmp(ap->u.sym, symbol)){
*gap = ap;
return 1;
} else if (symtable->next == NULL){
return 0;
} else {
return lookup_symbol(symbol, symtable->next, gap);
}
}
}
void scan_symbol(char* symbol, Symbols* symtable, Atom** gap)
{
if (symtable->sym == NULL){
*gap = symalloc(symbol, symtable);
} else {
Atom* ap = symtable->sym;
if (!strcmp(ap->u.sym, symbol)){
*gap = ap;
} else if (symtable->next == NULL){
Symbols* newsymtbl;
newsymtbl = (Symbols*)emalloc(sizeof(Symbols));
symtable->next = newsymtbl;
*gap = symalloc(symbol, symtable->next);
} else {
scan_symbol(symbol, symtable->next, gap);
}
}
}
Atom *symalloc(char* symbol, Symbols* symtable)
{
Atom* ap;
ap = (Atom*)emalloc(sizeof(Atom));
ap->type = 1;
ap->u.sym = (char*)emalloc(strlen(symbol)+1);
strcpy(ap->u.sym, symbol);
symtable->sym = ap;
symtable->next = NULL;
/* printf("newly interns symbol: %s\n", ap->u.sym); */
return ap;
}