|
|
1.1 root 1: #include "rc.h"
2: #include "exec.h"
3: #include "fns.h"
4: int hash(char *s, int n)
5: {
6: register int h=0, i=1;
7: while(*s) h+=*s++*i++;
8: h%=n;
9: return h<0?h+n:h;
10: }
11: #define NKW 30
12: struct kw{
13: char *name;
14: int type;
15: struct kw *next;
16: }*kw[NKW];
17: void kenter(int type, char *name)
18: {
19: register int h=hash(name, NKW);
20: register struct kw *p=new(struct kw);
21: p->type=type;
22: p->name=name;
23: p->next=kw[h];
24: kw[h]=p;
25: }
26: void kinit(void){
27: kenter(FOR, "for");
28: kenter(IN, "in");
29: kenter(WHILE, "while");
30: kenter(IF, "if");
31: kenter(NOT, "not");
32: kenter(TWIDDLE, "~");
33: kenter(BANG, "!");
34: kenter(SUBSHELL, "@");
35: kenter(SWITCH, "switch");
36: kenter(FN, "fn");
37: }
38: tree *klook(char *name)
39: {
40: struct kw *p;
41: tree *t=token(name, WORD);
42: for(p=kw[hash(name, NKW)];p;p=p->next)
43: if(strcmp(p->name, name)==0){
44: t->type=p->type;
45: t->iskw=1;
46: break;
47: }
48: return t;
49: }
50: var *gvlook(char *name)
51: {
52: int h=hash(name, NVAR);
53: var *v;
54: for(v=gvar[h];v;v=v->next) if(strcmp(v->name, name)==0) return v;
55: return gvar[h]=newvar(strdup(name), gvar[h]);
56: }
57: var *vlook(char *name)
58: {
59: var *v;
60: if(runq)
61: for(v=runq->local;v;v=v->next)
62: if(strcmp(v->name, name)==0) return v;
63: return gvlook(name);
64: }
65: void setvar(char *name, word *val)
66: {
67: register struct var *v=vlook(name);
68: freewords(v->val);
69: v->val=val;
70: v->changed=1;
71: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.