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"
6 c8f53842 2007-03-26 devnull hash(char *s, int n)
8 c8f53842 2007-03-26 devnull int h = 0, i = 1;
9 f08fdedc 2003-11-23 devnull while(*s) h+=*s++*i++;
11 f08fdedc 2003-11-23 devnull return h<0?h+n:h;
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];
21 c8f53842 2007-03-26 devnull kenter(int type, char *name)
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;
32 c8f53842 2007-03-26 devnull kinit(void)
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");
47 c8f53842 2007-03-26 devnull klook(char *name)
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;
57 f08fdedc 2003-11-23 devnull return t;
61 c8f53842 2007-03-26 devnull gvlook(char *name)
63 c8f53842 2007-03-26 devnull int h = hash(name, NVAR);
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]);
70 c8f53842 2007-03-26 devnull vlook(char *name)
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);
80 c8f53842 2007-03-26 devnull _setvar(char *name, word *val, int callfn)
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);
91 c8f53842 2007-03-26 devnull setvar(char *name, word *val)
93 a9eaaa03 2005-01-12 devnull _setvar(name, val, 1);
97 c8f53842 2007-03-26 devnull bigpath(var *v)
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;
103 a9eaaa03 2005-01-12 devnull if(v->val == nil){
104 a9eaaa03 2005-01-12 devnull _setvar("path", nil, 0);
107 a9eaaa03 2005-01-12 devnull p = v->val->word;
108 a9eaaa03 2005-01-12 devnull w = nil;
111 a9eaaa03 2005-01-12 devnull * Doesn't handle escaped colon nonsense.
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, ':');
119 a9eaaa03 2005-01-12 devnull *l = newword(p[0] ? p : ".", nil);
120 a9eaaa03 2005-01-12 devnull l = &(*l)->next;
122 a9eaaa03 2005-01-12 devnull *q = ':';
123 a9eaaa03 2005-01-12 devnull p = q+1;
125 a9eaaa03 2005-01-12 devnull p = nil;
127 a9eaaa03 2005-01-12 devnull _setvar("path", w, 0);
131 c8f53842 2007-03-26 devnull list2strcolon(word *words)
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++=':';
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;
150 c8f53842 2007-03-26 devnull littlepath(var *v)
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;
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 */
164 c8f53842 2007-03-26 devnull pathinit(void)
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);