xref: /plan9-contrib/sys/src/cmd/rc/var.c (revision c6df144405f586b73992827d584728dc975dff14)
13e12c5d1SDavid du Colombier #include "rc.h"
23e12c5d1SDavid du Colombier #include "exec.h"
33e12c5d1SDavid du Colombier #include "fns.h"
4dc5a79c1SDavid du Colombier 
54e3613abSDavid du Colombier unsigned
hash(char * as,int n)64e3613abSDavid du Colombier hash(char *as, int n)
73e12c5d1SDavid du Colombier {
84e3613abSDavid du Colombier 	int i = 1;
94e3613abSDavid du Colombier 	unsigned h = 0;
104e3613abSDavid du Colombier 	uchar *s;
114e3613abSDavid du Colombier 
124e3613abSDavid du Colombier 	s = (uchar *)as;
134e3613abSDavid du Colombier 	while (*s)
144e3613abSDavid du Colombier 		h += *s++ * i++;
154e3613abSDavid du Colombier 	return h % n;
163e12c5d1SDavid du Colombier }
174e3613abSDavid du Colombier 
183e12c5d1SDavid du Colombier #define	NKW	30
193e12c5d1SDavid du Colombier struct kw{
203e12c5d1SDavid du Colombier 	char *name;
213e12c5d1SDavid du Colombier 	int type;
223e12c5d1SDavid du Colombier 	struct kw *next;
233e12c5d1SDavid du Colombier }*kw[NKW];
24dc5a79c1SDavid du Colombier 
25dc5a79c1SDavid du Colombier void
kenter(int type,char * name)26dc5a79c1SDavid du Colombier kenter(int type, char *name)
273e12c5d1SDavid du Colombier {
28dc5a79c1SDavid du Colombier 	int h = hash(name, NKW);
29dc5a79c1SDavid du Colombier 	struct kw *p = new(struct kw);
303e12c5d1SDavid du Colombier 	p->type = type;
313e12c5d1SDavid du Colombier 	p->name = name;
323e12c5d1SDavid du Colombier 	p->next = kw[h];
333e12c5d1SDavid du Colombier 	kw[h] = p;
343e12c5d1SDavid du Colombier }
35dc5a79c1SDavid du Colombier 
36dc5a79c1SDavid du Colombier void
kinit(void)37dc5a79c1SDavid du Colombier kinit(void)
38dc5a79c1SDavid du Colombier {
393e12c5d1SDavid du Colombier 	kenter(FOR, "for");
403e12c5d1SDavid du Colombier 	kenter(IN, "in");
413e12c5d1SDavid du Colombier 	kenter(WHILE, "while");
423e12c5d1SDavid du Colombier 	kenter(IF, "if");
433e12c5d1SDavid du Colombier 	kenter(NOT, "not");
443e12c5d1SDavid du Colombier 	kenter(TWIDDLE, "~");
453e12c5d1SDavid du Colombier 	kenter(BANG, "!");
463e12c5d1SDavid du Colombier 	kenter(SUBSHELL, "@");
473e12c5d1SDavid du Colombier 	kenter(SWITCH, "switch");
483e12c5d1SDavid du Colombier 	kenter(FN, "fn");
493e12c5d1SDavid du Colombier }
50dc5a79c1SDavid du Colombier 
51dc5a79c1SDavid du Colombier tree*
klook(char * name)52dc5a79c1SDavid du Colombier klook(char *name)
533e12c5d1SDavid du Colombier {
543e12c5d1SDavid du Colombier 	struct kw *p;
553e12c5d1SDavid du Colombier 	tree *t = token(name, WORD);
563e12c5d1SDavid du Colombier 	for(p = kw[hash(name, NKW)];p;p = p->next)
573e12c5d1SDavid du Colombier 		if(strcmp(p->name, name)==0){
583e12c5d1SDavid du Colombier 			t->type = p->type;
593e12c5d1SDavid du Colombier 			t->iskw = 1;
603e12c5d1SDavid du Colombier 			break;
613e12c5d1SDavid du Colombier 		}
623e12c5d1SDavid du Colombier 	return t;
633e12c5d1SDavid du Colombier }
64dc5a79c1SDavid du Colombier 
65dc5a79c1SDavid du Colombier var*
gvlook(char * name)66dc5a79c1SDavid du Colombier gvlook(char *name)
673e12c5d1SDavid du Colombier {
683e12c5d1SDavid du Colombier 	int h = hash(name, NVAR);
693e12c5d1SDavid du Colombier 	var *v;
70*c6df1444SDavid du Colombier 
71*c6df1444SDavid du Colombier 	for (v = gvar[h]; v; v = v->next)
72*c6df1444SDavid du Colombier 		if (strcmp(v->name, name) == 0)
73*c6df1444SDavid du Colombier 			return v;
743e12c5d1SDavid du Colombier 	return gvar[h] = newvar(strdup(name), gvar[h]);
753e12c5d1SDavid du Colombier }
76dc5a79c1SDavid du Colombier 
77dc5a79c1SDavid du Colombier var*
vlook(char * name)78dc5a79c1SDavid du Colombier vlook(char *name)
793e12c5d1SDavid du Colombier {
803e12c5d1SDavid du Colombier 	var *v;
81*c6df1444SDavid du Colombier 
823e12c5d1SDavid du Colombier 	if (runq)
833e12c5d1SDavid du Colombier 		for (v = runq->local; v; v = v->next)
84*c6df1444SDavid du Colombier 			if (strcmp(v->name, name) == 0)
85*c6df1444SDavid du Colombier 				return v;
863e12c5d1SDavid du Colombier 	return gvlook(name);
873e12c5d1SDavid du Colombier }
88dc5a79c1SDavid du Colombier 
89dc5a79c1SDavid du Colombier void
setvar(char * name,word * val)90dc5a79c1SDavid du Colombier setvar(char *name, word *val)
913e12c5d1SDavid du Colombier {
92dc5a79c1SDavid du Colombier 	struct var *v = vlook(name);
933e12c5d1SDavid du Colombier 	freewords(v->val);
943e12c5d1SDavid du Colombier 	v->val = val;
953e12c5d1SDavid du Colombier 	v->changed = 1;
963e12c5d1SDavid du Colombier }
97