13e12c5d1SDavid du Colombier #include "rc.h" 23e12c5d1SDavid du Colombier #include "exec.h" 33e12c5d1SDavid du Colombier #include "fns.h" 4*dc5a79c1SDavid du Colombier 5*dc5a79c1SDavid du Colombier int 6*dc5a79c1SDavid du Colombier hash(char *s, int n) 73e12c5d1SDavid du Colombier { 8*dc5a79c1SDavid du Colombier int h = 0, i = 1; 93e12c5d1SDavid du Colombier while(*s) h+=*s++*i++; 103e12c5d1SDavid du Colombier h%=n; 113e12c5d1SDavid du Colombier return h<0?h+n:h; 123e12c5d1SDavid du Colombier } 133e12c5d1SDavid du Colombier #define NKW 30 143e12c5d1SDavid du Colombier struct kw{ 153e12c5d1SDavid du Colombier char *name; 163e12c5d1SDavid du Colombier int type; 173e12c5d1SDavid du Colombier struct kw *next; 183e12c5d1SDavid du Colombier }*kw[NKW]; 19*dc5a79c1SDavid du Colombier 20*dc5a79c1SDavid du Colombier void 21*dc5a79c1SDavid du Colombier kenter(int type, char *name) 223e12c5d1SDavid du Colombier { 23*dc5a79c1SDavid du Colombier int h = hash(name, NKW); 24*dc5a79c1SDavid du Colombier struct kw *p = new(struct kw); 253e12c5d1SDavid du Colombier p->type = type; 263e12c5d1SDavid du Colombier p->name = name; 273e12c5d1SDavid du Colombier p->next = kw[h]; 283e12c5d1SDavid du Colombier kw[h] = p; 293e12c5d1SDavid du Colombier } 30*dc5a79c1SDavid du Colombier 31*dc5a79c1SDavid du Colombier void 32*dc5a79c1SDavid du Colombier kinit(void) 33*dc5a79c1SDavid du Colombier { 343e12c5d1SDavid du Colombier kenter(FOR, "for"); 353e12c5d1SDavid du Colombier kenter(IN, "in"); 363e12c5d1SDavid du Colombier kenter(WHILE, "while"); 373e12c5d1SDavid du Colombier kenter(IF, "if"); 383e12c5d1SDavid du Colombier kenter(NOT, "not"); 393e12c5d1SDavid du Colombier kenter(TWIDDLE, "~"); 403e12c5d1SDavid du Colombier kenter(BANG, "!"); 413e12c5d1SDavid du Colombier kenter(SUBSHELL, "@"); 423e12c5d1SDavid du Colombier kenter(SWITCH, "switch"); 433e12c5d1SDavid du Colombier kenter(FN, "fn"); 443e12c5d1SDavid du Colombier } 45*dc5a79c1SDavid du Colombier 46*dc5a79c1SDavid du Colombier tree* 47*dc5a79c1SDavid du Colombier klook(char *name) 483e12c5d1SDavid du Colombier { 493e12c5d1SDavid du Colombier struct kw *p; 503e12c5d1SDavid du Colombier tree *t = token(name, WORD); 513e12c5d1SDavid du Colombier for(p = kw[hash(name, NKW)];p;p = p->next) 523e12c5d1SDavid du Colombier if(strcmp(p->name, name)==0){ 533e12c5d1SDavid du Colombier t->type = p->type; 543e12c5d1SDavid du Colombier t->iskw = 1; 553e12c5d1SDavid du Colombier break; 563e12c5d1SDavid du Colombier } 573e12c5d1SDavid du Colombier return t; 583e12c5d1SDavid du Colombier } 59*dc5a79c1SDavid du Colombier 60*dc5a79c1SDavid du Colombier var* 61*dc5a79c1SDavid du Colombier gvlook(char *name) 623e12c5d1SDavid du Colombier { 633e12c5d1SDavid du Colombier int h = hash(name, NVAR); 643e12c5d1SDavid du Colombier var *v; 653e12c5d1SDavid du Colombier for(v = gvar[h];v;v = v->next) if(strcmp(v->name, name)==0) return v; 663e12c5d1SDavid du Colombier return gvar[h] = newvar(strdup(name), gvar[h]); 673e12c5d1SDavid du Colombier } 68*dc5a79c1SDavid du Colombier 69*dc5a79c1SDavid du Colombier var* 70*dc5a79c1SDavid du Colombier vlook(char *name) 713e12c5d1SDavid du Colombier { 723e12c5d1SDavid du Colombier var *v; 733e12c5d1SDavid du Colombier if(runq) 743e12c5d1SDavid du Colombier for(v = runq->local;v;v = v->next) 753e12c5d1SDavid du Colombier if(strcmp(v->name, name)==0) return v; 763e12c5d1SDavid du Colombier return gvlook(name); 773e12c5d1SDavid du Colombier } 78*dc5a79c1SDavid du Colombier 79*dc5a79c1SDavid du Colombier void 80*dc5a79c1SDavid du Colombier setvar(char *name, word *val) 813e12c5d1SDavid du Colombier { 82*dc5a79c1SDavid du Colombier struct var *v = vlook(name); 833e12c5d1SDavid du Colombier freewords(v->val); 843e12c5d1SDavid du Colombier v->val = val; 853e12c5d1SDavid du Colombier v->changed = 1; 863e12c5d1SDavid du Colombier } 87