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