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 f08fdedc 2003-11-23 devnull int hash(char *s, int n)
5 f08fdedc 2003-11-23 devnull {
6 f08fdedc 2003-11-23 devnull register int h=0, i=1;
7 f08fdedc 2003-11-23 devnull while(*s) h+=*s++*i++;
8 f08fdedc 2003-11-23 devnull h%=n;
9 f08fdedc 2003-11-23 devnull return h<0?h+n:h;
10 f08fdedc 2003-11-23 devnull }
11 f08fdedc 2003-11-23 devnull #define NKW 30
12 f08fdedc 2003-11-23 devnull struct kw{
13 f08fdedc 2003-11-23 devnull char *name;
14 f08fdedc 2003-11-23 devnull int type;
15 f08fdedc 2003-11-23 devnull struct kw *next;
16 f08fdedc 2003-11-23 devnull }*kw[NKW];
17 f08fdedc 2003-11-23 devnull void kenter(int type, char *name)
18 f08fdedc 2003-11-23 devnull {
19 f08fdedc 2003-11-23 devnull register int h=hash(name, NKW);
20 f08fdedc 2003-11-23 devnull register struct kw *p=new(struct kw);
21 f08fdedc 2003-11-23 devnull p->type=type;
22 f08fdedc 2003-11-23 devnull p->name=name;
23 f08fdedc 2003-11-23 devnull p->next=kw[h];
24 f08fdedc 2003-11-23 devnull kw[h]=p;
25 f08fdedc 2003-11-23 devnull }
26 f08fdedc 2003-11-23 devnull void kinit(void){
27 f08fdedc 2003-11-23 devnull kenter(FOR, "for");
28 f08fdedc 2003-11-23 devnull kenter(IN, "in");
29 f08fdedc 2003-11-23 devnull kenter(WHILE, "while");
30 f08fdedc 2003-11-23 devnull kenter(IF, "if");
31 f08fdedc 2003-11-23 devnull kenter(NOT, "not");
32 f08fdedc 2003-11-23 devnull kenter(TWIDDLE, "~");
33 f08fdedc 2003-11-23 devnull kenter(BANG, "!");
34 f08fdedc 2003-11-23 devnull kenter(SUBSHELL, "@");
35 f08fdedc 2003-11-23 devnull kenter(SWITCH, "switch");
36 f08fdedc 2003-11-23 devnull kenter(FN, "fn");
37 f08fdedc 2003-11-23 devnull }
38 f08fdedc 2003-11-23 devnull tree *klook(char *name)
39 f08fdedc 2003-11-23 devnull {
40 f08fdedc 2003-11-23 devnull struct kw *p;
41 f08fdedc 2003-11-23 devnull tree *t=token(name, WORD);
42 f08fdedc 2003-11-23 devnull for(p=kw[hash(name, NKW)];p;p=p->next)
43 f08fdedc 2003-11-23 devnull if(strcmp(p->name, name)==0){
44 f08fdedc 2003-11-23 devnull t->type=p->type;
45 f08fdedc 2003-11-23 devnull t->iskw=1;
46 f08fdedc 2003-11-23 devnull break;
47 f08fdedc 2003-11-23 devnull }
48 f08fdedc 2003-11-23 devnull return t;
49 f08fdedc 2003-11-23 devnull }
50 f08fdedc 2003-11-23 devnull var *gvlook(char *name)
51 f08fdedc 2003-11-23 devnull {
52 f08fdedc 2003-11-23 devnull int h=hash(name, NVAR);
53 f08fdedc 2003-11-23 devnull var *v;
54 f08fdedc 2003-11-23 devnull for(v=gvar[h];v;v=v->next) if(strcmp(v->name, name)==0) return v;
55 f08fdedc 2003-11-23 devnull return gvar[h]=newvar(strdup(name), gvar[h]);
56 f08fdedc 2003-11-23 devnull }
57 f08fdedc 2003-11-23 devnull var *vlook(char *name)
58 f08fdedc 2003-11-23 devnull {
59 f08fdedc 2003-11-23 devnull var *v;
60 f08fdedc 2003-11-23 devnull if(runq)
61 f08fdedc 2003-11-23 devnull for(v=runq->local;v;v=v->next)
62 f08fdedc 2003-11-23 devnull if(strcmp(v->name, name)==0) return v;
63 f08fdedc 2003-11-23 devnull return gvlook(name);
64 f08fdedc 2003-11-23 devnull }
65 a9eaaa03 2005-01-12 devnull void _setvar(char *name, word *val, int callfn)
66 f08fdedc 2003-11-23 devnull {
67 f08fdedc 2003-11-23 devnull register struct var *v=vlook(name);
68 f08fdedc 2003-11-23 devnull freewords(v->val);
69 f08fdedc 2003-11-23 devnull v->val=val;
70 f08fdedc 2003-11-23 devnull v->changed=1;
71 a9eaaa03 2005-01-12 devnull if(callfn && v->changefn)
72 a9eaaa03 2005-01-12 devnull v->changefn(v);
73 f08fdedc 2003-11-23 devnull }
74 a9eaaa03 2005-01-12 devnull void setvar(char *name, word *val)
75 a9eaaa03 2005-01-12 devnull {
76 a9eaaa03 2005-01-12 devnull _setvar(name, val, 1);
77 a9eaaa03 2005-01-12 devnull }
78 a9eaaa03 2005-01-12 devnull void bigpath(var *v)
79 a9eaaa03 2005-01-12 devnull {
80 a9eaaa03 2005-01-12 devnull /* convert $PATH to $path */
81 a9eaaa03 2005-01-12 devnull char *p, *q;
82 a9eaaa03 2005-01-12 devnull word **l, *w;
83 a9eaaa03 2005-01-12 devnull
84 a9eaaa03 2005-01-12 devnull if(v->val == nil){
85 a9eaaa03 2005-01-12 devnull _setvar("path", nil, 0);
86 a9eaaa03 2005-01-12 devnull return;
87 a9eaaa03 2005-01-12 devnull }
88 a9eaaa03 2005-01-12 devnull p = v->val->word;
89 a9eaaa03 2005-01-12 devnull w = nil;
90 a9eaaa03 2005-01-12 devnull l = &w;
91 a9eaaa03 2005-01-12 devnull /*
92 a9eaaa03 2005-01-12 devnull * Doesn't handle escaped colon nonsense.
93 a9eaaa03 2005-01-12 devnull */
94 a9eaaa03 2005-01-12 devnull if(p[0] == 0)
95 a9eaaa03 2005-01-12 devnull p = nil;
96 a9eaaa03 2005-01-12 devnull while(p){
97 a9eaaa03 2005-01-12 devnull q = strchr(p, ':');
98 a9eaaa03 2005-01-12 devnull if(q)
99 a9eaaa03 2005-01-12 devnull *q = 0;
100 a9eaaa03 2005-01-12 devnull *l = newword(p[0] ? p : ".", nil);
101 a9eaaa03 2005-01-12 devnull l = &(*l)->next;
102 a9eaaa03 2005-01-12 devnull if(q){
103 a9eaaa03 2005-01-12 devnull *q = ':';
104 a9eaaa03 2005-01-12 devnull p = q+1;
105 a9eaaa03 2005-01-12 devnull }else
106 a9eaaa03 2005-01-12 devnull p = nil;
107 a9eaaa03 2005-01-12 devnull }
108 a9eaaa03 2005-01-12 devnull _setvar("path", w, 0);
109 a9eaaa03 2005-01-12 devnull }
110 a9eaaa03 2005-01-12 devnull void littlepath(var *v)
111 a9eaaa03 2005-01-12 devnull {
112 a9eaaa03 2005-01-12 devnull /* convert $path to $PATH */
113 a9eaaa03 2005-01-12 devnull char *p;
114 a9eaaa03 2005-01-12 devnull word *w;
115 a9eaaa03 2005-01-12 devnull
116 a9eaaa03 2005-01-12 devnull p = _list2str(v->val, ':');
117 a9eaaa03 2005-01-12 devnull w = new(word);
118 a9eaaa03 2005-01-12 devnull w->word = p;
119 a9eaaa03 2005-01-12 devnull w->next = nil;
120 a9eaaa03 2005-01-12 devnull _setvar("PATH", w, 1); /* 1: recompute $path to expose colon problems */
121 a9eaaa03 2005-01-12 devnull }
122 a9eaaa03 2005-01-12 devnull void pathinit(void)
123 a9eaaa03 2005-01-12 devnull {
124 a9eaaa03 2005-01-12 devnull var *v;
125 a9eaaa03 2005-01-12 devnull
126 a9eaaa03 2005-01-12 devnull v = gvlook("path");
127 a9eaaa03 2005-01-12 devnull v->changefn = littlepath;
128 a9eaaa03 2005-01-12 devnull v = gvlook("PATH");
129 a9eaaa03 2005-01-12 devnull v->changefn = bigpath;
130 a9eaaa03 2005-01-12 devnull bigpath(v);
131 a9eaaa03 2005-01-12 devnull }