#include "rc.h" #include "exec.h" #include "fns.h" int hash(char *s, int n) { register int h=0, i=1; while(*s) h+=*s++*i++; h%=n; return h<0?h+n:h; } #define NKW 30 struct kw{ char *name; int type; struct kw *next; }*kw[NKW]; void kenter(int type, char *name) { register int h=hash(name, NKW); register struct kw *p=new(struct kw); p->type=type; p->name=name; p->next=kw[h]; kw[h]=p; } void kinit(void){ kenter(FOR, "for"); kenter(IN, "in"); kenter(WHILE, "while"); kenter(IF, "if"); kenter(NOT, "not"); kenter(TWIDDLE, "~"); kenter(BANG, "!"); kenter(SUBSHELL, "@"); kenter(SWITCH, "switch"); kenter(FN, "fn"); } tree *klook(char *name) { struct kw *p; tree *t=token(name, WORD); for(p=kw[hash(name, NKW)];p;p=p->next) if(strcmp(p->name, name)==0){ t->type=p->type; t->iskw=1; break; } return t; } var *gvlook(char *name) { int h=hash(name, NVAR); var *v; for(v=gvar[h];v;v=v->next) if(strcmp(v->name, name)==0) return v; return gvar[h]=newvar(strdup(name), gvar[h]); } var *vlook(char *name) { var *v; if(runq) for(v=runq->local;v;v=v->next) if(strcmp(v->name, name)==0) return v; return gvlook(name); } void setvar(char *name, word *val) { register struct var *v=vlook(name); freewords(v->val); v->val=val; v->changed=1; }