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 } 72