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
|
#include "rc.h"
#include "exec.h"
#include "fns.h"
int hash(char *s, int n)
{
register int h=0, i=1;
while(*s) h+=*s++*i++;
h%=n;
return h<0?h+n:h;
}
#define NKW 30
struct kw{
char *name;
int type;
struct kw *next;
}*kw[NKW];
void kenter(int type, char *name)
{
register int h=hash(name, NKW);
register struct kw *p=new(struct kw);
p->type=type;
p->name=name;
p->next=kw[h];
kw[h]=p;
}
void kinit(void){
kenter(FOR, "for");
kenter(IN, "in");
kenter(WHILE, "while");
kenter(IF, "if");
kenter(NOT, "not");
kenter(TWIDDLE, "~");
kenter(BANG, "!");
kenter(SUBSHELL, "@");
kenter(SWITCH, "switch");
kenter(FN, "fn");
}
tree *klook(char *name)
{
struct kw *p;
tree *t=token(name, WORD);
for(p=kw[hash(name, NKW)];p;p=p->next)
if(strcmp(p->name, name)==0){
t->type=p->type;
t->iskw=1;
break;
}
return t;
}
var *gvlook(char *name)
{
int h=hash(name, NVAR);
var *v;
for(v=gvar[h];v;v=v->next) if(strcmp(v->name, name)==0) return v;
return gvar[h]=newvar(strdup(name), gvar[h]);
}
var *vlook(char *name)
{
var *v;
if(runq)
for(v=runq->local;v;v=v->next)
if(strcmp(v->name, name)==0) return v;
return gvlook(name);
}
void setvar(char *name, word *val)
{
register struct var *v=vlook(name);
freewords(v->val);
v->val=val;
v->changed=1;
}
|