| #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; |
| } |