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