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