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