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