xref: /plan9/sys/src/cmd/rc/var.c (revision dc5a79c1208f0704eeb474acc990728f8b4854f5)
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