Blame


1 f08fdedc 2003-11-23 devnull #include "rc.h"
2 f08fdedc 2003-11-23 devnull #include "exec.h"
3 f08fdedc 2003-11-23 devnull #include "fns.h"
4 c8f53842 2007-03-26 devnull
5 c8f53842 2007-03-26 devnull int
6 c8f53842 2007-03-26 devnull hash(char *s, int n)
7 f08fdedc 2003-11-23 devnull {
8 c8f53842 2007-03-26 devnull int h = 0, i = 1;
9 f08fdedc 2003-11-23 devnull while(*s) h+=*s++*i++;
10 f08fdedc 2003-11-23 devnull h%=n;
11 f08fdedc 2003-11-23 devnull return h<0?h+n:h;
12 f08fdedc 2003-11-23 devnull }
13 f08fdedc 2003-11-23 devnull #define NKW 30
14 f08fdedc 2003-11-23 devnull struct kw{
15 f08fdedc 2003-11-23 devnull char *name;
16 f08fdedc 2003-11-23 devnull int type;
17 f08fdedc 2003-11-23 devnull struct kw *next;
18 f08fdedc 2003-11-23 devnull }*kw[NKW];
19 c8f53842 2007-03-26 devnull
20 c8f53842 2007-03-26 devnull void
21 c8f53842 2007-03-26 devnull kenter(int type, char *name)
22 f08fdedc 2003-11-23 devnull {
23 c8f53842 2007-03-26 devnull int h = hash(name, NKW);
24 c8f53842 2007-03-26 devnull struct kw *p = new(struct kw);
25 c8f53842 2007-03-26 devnull p->type = type;
26 c8f53842 2007-03-26 devnull p->name = name;
27 c8f53842 2007-03-26 devnull p->next = kw[h];
28 c8f53842 2007-03-26 devnull kw[h] = p;
29 f08fdedc 2003-11-23 devnull }
30 c8f53842 2007-03-26 devnull
31 c8f53842 2007-03-26 devnull void
32 c8f53842 2007-03-26 devnull kinit(void)
33 c8f53842 2007-03-26 devnull {
34 f08fdedc 2003-11-23 devnull kenter(FOR, "for");
35 f08fdedc 2003-11-23 devnull kenter(IN, "in");
36 f08fdedc 2003-11-23 devnull kenter(WHILE, "while");
37 f08fdedc 2003-11-23 devnull kenter(IF, "if");
38 f08fdedc 2003-11-23 devnull kenter(NOT, "not");
39 f08fdedc 2003-11-23 devnull kenter(TWIDDLE, "~");
40 f08fdedc 2003-11-23 devnull kenter(BANG, "!");
41 f08fdedc 2003-11-23 devnull kenter(SUBSHELL, "@");
42 f08fdedc 2003-11-23 devnull kenter(SWITCH, "switch");
43 f08fdedc 2003-11-23 devnull kenter(FN, "fn");
44 f08fdedc 2003-11-23 devnull }
45 c8f53842 2007-03-26 devnull
46 c8f53842 2007-03-26 devnull tree*
47 c8f53842 2007-03-26 devnull klook(char *name)
48 f08fdedc 2003-11-23 devnull {
49 f08fdedc 2003-11-23 devnull struct kw *p;
50 c8f53842 2007-03-26 devnull tree *t = token(name, WORD);
51 c8f53842 2007-03-26 devnull for(p = kw[hash(name, NKW)];p;p = p->next)
52 f08fdedc 2003-11-23 devnull if(strcmp(p->name, name)==0){
53 c8f53842 2007-03-26 devnull t->type = p->type;
54 c8f53842 2007-03-26 devnull t->iskw = 1;
55 f08fdedc 2003-11-23 devnull break;
56 f08fdedc 2003-11-23 devnull }
57 f08fdedc 2003-11-23 devnull return t;
58 f08fdedc 2003-11-23 devnull }
59 c8f53842 2007-03-26 devnull
60 c8f53842 2007-03-26 devnull var*
61 c8f53842 2007-03-26 devnull gvlook(char *name)
62 f08fdedc 2003-11-23 devnull {
63 c8f53842 2007-03-26 devnull int h = hash(name, NVAR);
64 f08fdedc 2003-11-23 devnull var *v;
65 c8f53842 2007-03-26 devnull for(v = gvar[h];v;v = v->next) if(strcmp(v->name, name)==0) return v;
66 c8f53842 2007-03-26 devnull return gvar[h] = newvar(strdup(name), gvar[h]);
67 f08fdedc 2003-11-23 devnull }
68 c8f53842 2007-03-26 devnull
69 c8f53842 2007-03-26 devnull var*
70 c8f53842 2007-03-26 devnull vlook(char *name)
71 f08fdedc 2003-11-23 devnull {
72 f08fdedc 2003-11-23 devnull var *v;
73 f08fdedc 2003-11-23 devnull if(runq)
74 c8f53842 2007-03-26 devnull for(v = runq->local;v;v = v->next)
75 f08fdedc 2003-11-23 devnull if(strcmp(v->name, name)==0) return v;
76 f08fdedc 2003-11-23 devnull return gvlook(name);
77 f08fdedc 2003-11-23 devnull }
78 c8f53842 2007-03-26 devnull
79 c8f53842 2007-03-26 devnull void
80 c8f53842 2007-03-26 devnull _setvar(char *name, word *val, int callfn)
81 f08fdedc 2003-11-23 devnull {
82 c8f53842 2007-03-26 devnull struct var *v = vlook(name);
83 f08fdedc 2003-11-23 devnull freewords(v->val);
84 f08fdedc 2003-11-23 devnull v->val=val;
85 f08fdedc 2003-11-23 devnull v->changed=1;
86 a9eaaa03 2005-01-12 devnull if(callfn && v->changefn)
87 a9eaaa03 2005-01-12 devnull v->changefn(v);
88 f08fdedc 2003-11-23 devnull }
89 c8f53842 2007-03-26 devnull
90 c8f53842 2007-03-26 devnull void
91 c8f53842 2007-03-26 devnull setvar(char *name, word *val)
92 a9eaaa03 2005-01-12 devnull {
93 a9eaaa03 2005-01-12 devnull _setvar(name, val, 1);
94 a9eaaa03 2005-01-12 devnull }
95 c8f53842 2007-03-26 devnull
96 c8f53842 2007-03-26 devnull void
97 c8f53842 2007-03-26 devnull bigpath(var *v)
98 a9eaaa03 2005-01-12 devnull {
99 a9eaaa03 2005-01-12 devnull /* convert $PATH to $path */
100 a9eaaa03 2005-01-12 devnull char *p, *q;
101 a9eaaa03 2005-01-12 devnull word **l, *w;
102 a9eaaa03 2005-01-12 devnull
103 a9eaaa03 2005-01-12 devnull if(v->val == nil){
104 a9eaaa03 2005-01-12 devnull _setvar("path", nil, 0);
105 a9eaaa03 2005-01-12 devnull return;
106 a9eaaa03 2005-01-12 devnull }
107 a9eaaa03 2005-01-12 devnull p = v->val->word;
108 a9eaaa03 2005-01-12 devnull w = nil;
109 a9eaaa03 2005-01-12 devnull l = &w;
110 a9eaaa03 2005-01-12 devnull /*
111 a9eaaa03 2005-01-12 devnull * Doesn't handle escaped colon nonsense.
112 a9eaaa03 2005-01-12 devnull */
113 a9eaaa03 2005-01-12 devnull if(p[0] == 0)
114 a9eaaa03 2005-01-12 devnull p = nil;
115 a9eaaa03 2005-01-12 devnull while(p){
116 a9eaaa03 2005-01-12 devnull q = strchr(p, ':');
117 a9eaaa03 2005-01-12 devnull if(q)
118 a9eaaa03 2005-01-12 devnull *q = 0;
119 a9eaaa03 2005-01-12 devnull *l = newword(p[0] ? p : ".", nil);
120 a9eaaa03 2005-01-12 devnull l = &(*l)->next;
121 a9eaaa03 2005-01-12 devnull if(q){
122 a9eaaa03 2005-01-12 devnull *q = ':';
123 a9eaaa03 2005-01-12 devnull p = q+1;
124 a9eaaa03 2005-01-12 devnull }else
125 a9eaaa03 2005-01-12 devnull p = nil;
126 a9eaaa03 2005-01-12 devnull }
127 a9eaaa03 2005-01-12 devnull _setvar("path", w, 0);
128 a9eaaa03 2005-01-12 devnull }
129 c8f53842 2007-03-26 devnull
130 c8f53842 2007-03-26 devnull char*
131 c8f53842 2007-03-26 devnull list2strcolon(word *words)
132 a9eaaa03 2005-01-12 devnull {
133 c8f53842 2007-03-26 devnull char *value, *s, *t;
134 c8f53842 2007-03-26 devnull int len = 0;
135 c8f53842 2007-03-26 devnull word *ap;
136 c8f53842 2007-03-26 devnull for(ap = words;ap;ap = ap->next)
137 c8f53842 2007-03-26 devnull len+=1+strlen(ap->word);
138 c8f53842 2007-03-26 devnull value = emalloc(len+1);
139 c8f53842 2007-03-26 devnull s = value;
140 c8f53842 2007-03-26 devnull for(ap = words;ap;ap = ap->next){
141 c8f53842 2007-03-26 devnull for(t = ap->word;*t;) *s++=*t++;
142 c8f53842 2007-03-26 devnull *s++=':';
143 c8f53842 2007-03-26 devnull }
144 c8f53842 2007-03-26 devnull if(s==value)
145 c8f53842 2007-03-26 devnull *s='\0';
146 c8f53842 2007-03-26 devnull else s[-1]='\0';
147 c8f53842 2007-03-26 devnull return value;
148 c8f53842 2007-03-26 devnull }
149 c8f53842 2007-03-26 devnull void
150 c8f53842 2007-03-26 devnull littlepath(var *v)
151 c8f53842 2007-03-26 devnull {
152 a9eaaa03 2005-01-12 devnull /* convert $path to $PATH */
153 a9eaaa03 2005-01-12 devnull char *p;
154 a9eaaa03 2005-01-12 devnull word *w;
155 a9eaaa03 2005-01-12 devnull
156 c8f53842 2007-03-26 devnull p = list2strcolon(v->val);
157 a9eaaa03 2005-01-12 devnull w = new(word);
158 a9eaaa03 2005-01-12 devnull w->word = p;
159 a9eaaa03 2005-01-12 devnull w->next = nil;
160 a9eaaa03 2005-01-12 devnull _setvar("PATH", w, 1); /* 1: recompute $path to expose colon problems */
161 a9eaaa03 2005-01-12 devnull }
162 c8f53842 2007-03-26 devnull
163 c8f53842 2007-03-26 devnull void
164 c8f53842 2007-03-26 devnull pathinit(void)
165 a9eaaa03 2005-01-12 devnull {
166 a9eaaa03 2005-01-12 devnull var *v;
167 a9eaaa03 2005-01-12 devnull
168 a9eaaa03 2005-01-12 devnull v = gvlook("path");
169 a9eaaa03 2005-01-12 devnull v->changefn = littlepath;
170 a9eaaa03 2005-01-12 devnull v = gvlook("PATH");
171 a9eaaa03 2005-01-12 devnull v->changefn = bigpath;
172 a9eaaa03 2005-01-12 devnull bigpath(v);
173 a9eaaa03 2005-01-12 devnull }