forked from shichao-an/ooc
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathSymtab.dc
63 lines (51 loc) · 1.2 KB
/
Symtab.dc
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
#include <stdlib.h>
#include <string.h>
#include "binary.h"
#include "Symbol.h"
% Symtab ctor {
struct Symtab * self = super_ctor(Symtab(), _self, app);
if (! (self -> dim = va_arg(* app, size_t)))
self -> dim = 1;
self -> buf = malloc(self -> dim * sizeof(void *));
assert(self -> buf);
return self;
}
% : Symtab delete { // don't delete
}
static int cmp (const void * _key, const void * _elt)
{ const char * const * key = _key;
const void * const * elt = _elt;
return strcmp(* key, name(* elt));
}
static void ** search (struct Symtab * self, const char ** np)
{
if (self -> count >= self -> dim)
{ self -> buf = realloc(self -> buf,
(self -> dim *= 2) * sizeof(void *));
assert(self -> buf);
}
return binary(np, self -> buf, & self -> count,
sizeof(void *), cmp);
}
% Symtab install {
const char * nm;
void ** pp;
%casts
nm = name(entry);
pp = search(self, & nm);
if (* pp != nm) // found entry
delete(* pp);
* pp = (void *) entry;
}
% Symtab screen {
void ** pp;
%casts
pp = search(self, & name);
if (* pp == name) // entered name
{ char * copy = malloc(strlen(name) + 1);
assert(copy);
* pp = new(Symbol(), strcpy(copy, name), lex);
}
return * pp;
}
%init