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