]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/rc/var.c
audiohda: fix syntax error
[plan9front.git] / sys / src / cmd / rc / var.c
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(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 }