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