have to leave instrs.adb around, kernel uses it for kdb
[unix-history] / usr / src / old / sh / name.c
CommitLineData
f6227721 1#ifndef lint
b52fd52a 2static char sccsid[] = "@(#)name.c 4.4 %G%";
f6227721 3#endif
ca6f972f
KM
4
5#
6/*
7 * UNIX shell
8 *
9 * S. R. Bourne
10 * Bell Telephone Laboratories
11 *
12 */
13
14#include "defs.h"
15
16PROC BOOL chkid();
17
18
19NAMNOD ps2nod = { NIL, NIL, ps2name},
20 fngnod = { NIL, NIL, fngname},
21 pathnod = { NIL, NIL, pathname},
22 ifsnod = { NIL, NIL, ifsname},
23 ps1nod = { &pathnod, &ps2nod, ps1name},
24 homenod = { &fngnod, &ifsnod, homename},
25 mailnod = { &homenod, &ps1nod, mailname};
26
27NAMPTR namep = &mailnod;
28
29
30/* ======== variable and string handling ======== */
31
32syslook(w,syswds)
33 STRING w;
34 SYSTAB syswds;
35{
36 REG CHAR first;
37 REG STRING s;
38 REG SYSPTR syscan;
39
40 syscan=syswds; first = *w;
41
42 WHILE s=syscan->sysnam
43 DO IF first == *s
44 ANDF eq(w,s)
45 THEN return(syscan->sysval);
46 FI
47 syscan++;
48 OD
49 return(0);
50}
51
52setlist(arg,xp)
53 REG ARGPTR arg;
54 INT xp;
55{
56 WHILE arg
57 DO REG STRING s=mactrim(arg->argval);
58 setname(s, xp);
59 arg=arg->argnxt;
60 IF flags&execpr
61 THEN prs(s);
62 IF arg THEN blank(); ELSE newline(); FI
63 FI
64 OD
65}
66
67VOID setname(argi, xp)
68 STRING argi;
69 INT xp;
70{
71 REG STRING argscan=argi;
72 REG NAMPTR n;
73
74 IF letter(*argscan)
75 THEN WHILE alphanum(*argscan) DO argscan++ OD
76 IF *argscan=='='
77 THEN *argscan = 0;
78 n=lookup(argi);
79 *argscan++ = '=';
80 attrib(n, xp);
81 IF xp&N_ENVNAM
b52fd52a
JB
82 THEN
83 /*
84 * Importing IFS can be very dangerous
85 */
86 IF !bcmp(argi, "IFS=", sizeof("IFS=") - 1)
87 THEN
88 int uid;
89 IF (uid = getuid())!=geteuid() ORF !uid
90 THEN
91 return;
92 FI
93 FI
94 n->namenv = n->namval = argscan;
ca6f972f
KM
95 ELSE assign(n, argscan);
96 FI
97 return;
98 FI
99 FI
100 failed(argi,notid);
101}
102
103replace(a, v)
104 REG STRING *a;
105 STRING v;
106{
107 free(*a); *a=make(v);
108}
109
110dfault(n,v)
111 NAMPTR n;
112 STRING v;
113{
114 IF n->namval==0
115 THEN assign(n,v)
116 FI
117}
118
119assign(n,v)
120 NAMPTR n;
121 STRING v;
122{
123 IF n->namflg&N_RDONLY
124 THEN failed(n->namid,wtfailed);
125 ELSE replace(&n->namval,v);
126 FI
127}
128
129INT readvar(names)
130 STRING *names;
131{
132 FILEBLK fb;
133 REG FILE f = &fb;
134 REG CHAR c;
135 REG INT rc=0;
136 NAMPTR n=lookup(*names++); /* done now to avoid storage mess */
137 STKPTR rel=relstak();
138
139 push(f); initf(dup(0));
140 IF lseek(0,0L,1)==-1
141 THEN f->fsiz=1;
142 FI
143
144 LOOP c=nextc(0);
145 IF (*names ANDF any(c, ifsnod.namval)) ORF eolchar(c)
146 THEN zerostak();
147 assign(n,absstak(rel)); setstak(rel);
148 IF *names
149 THEN n=lookup(*names++);
150 ELSE n=0;
151 FI
152 IF eolchar(c)
153 THEN break;
154 FI
155 ELSE pushstak(c);
156 FI
157 POOL
158 WHILE n
159 DO assign(n, nullstr);
160 IF *names THEN n=lookup(*names++); ELSE n=0; FI
161 OD
162
163 IF eof THEN rc=1 FI
164 lseek(0, (long)(f->fnxt-f->fend), 1);
165 pop();
166 return(rc);
167}
168
169assnum(p, i)
170 STRING *p;
171 INT i;
172{
173 itos(i); replace(p,numbuf);
174}
175
176STRING make(v)
177 STRING v;
178{
179 REG STRING p;
180
181 IF v
182 THEN movstr(v,p=alloc(length(v)));
183 return(p);
184 ELSE return(0);
185 FI
186}
187
188
189NAMPTR lookup(nam)
190 REG STRING nam;
191{
192 REG NAMPTR nscan=namep;
193 REG NAMPTR *prev;
194 INT LR;
195
196 IF !chkid(nam)
197 THEN failed(nam,notid);
198 FI
199 WHILE nscan
200 DO IF (LR=cf(nam,nscan->namid))==0
201 THEN return(nscan);
202 ELIF LR<0
203 THEN prev = &(nscan->namlft);
204 ELSE prev = &(nscan->namrgt);
205 FI
206 nscan = *prev;
207 OD
208
209 /* add name node */
210 nscan=alloc(sizeof *nscan);
211 nscan->namlft=nscan->namrgt=NIL;
212 nscan->namid=make(nam);
213 nscan->namval=0; nscan->namflg=N_DEFAULT; nscan->namenv=0;
214 return(*prev = nscan);
215}
216
217LOCAL BOOL chkid(nam)
218 STRING nam;
219{
220 REG CHAR * cp=nam;
221
222 IF !letter(*cp)
223 THEN return(FALSE);
224 ELSE WHILE *++cp
225 DO IF !alphanum(*cp)
226 THEN return(FALSE);
227 FI
228 OD
229 FI
230 return(TRUE);
231}
232
233LOCAL VOID (*namfn)();
234namscan(fn)
235 VOID (*fn)();
236{
237 namfn=fn;
238 namwalk(namep);
239}
240
241LOCAL VOID namwalk(np)
242 REG NAMPTR np;
243{
244 IF np
245 THEN namwalk(np->namlft);
246 (*namfn)(np);
247 namwalk(np->namrgt);
248 FI
249}
250
251VOID printnam(n)
252 NAMPTR n;
253{
254 REG STRING s;
255
256 sigchk();
257 IF s=n->namval
258 THEN prs(n->namid);
259 prc('='); prs(s);
260 newline();
261 FI
262}
263
264LOCAL STRING staknam(n)
265 REG NAMPTR n;
266{
267 REG STRING p;
268
269 p=movstr(n->namid,staktop);
270 p=movstr("=",p);
271 p=movstr(n->namval,p);
272 return(getstak(p+1-ADR(stakbot)));
273}
274
275VOID exname(n)
276 REG NAMPTR n;
277{
278 IF n->namflg&N_EXPORT
279 THEN free(n->namenv);
280 n->namenv = make(n->namval);
281 ELSE free(n->namval);
282 n->namval = make(n->namenv);
283 FI
284}
285
286VOID printflg(n)
287 REG NAMPTR n;
288{
289 IF n->namflg&N_EXPORT
290 THEN prs(export); blank();
291 FI
292 IF n->namflg&N_RDONLY
293 THEN prs(readonly); blank();
294 FI
295 IF n->namflg&(N_EXPORT|N_RDONLY)
296 THEN prs(n->namid); newline();
297 FI
298}
299
9501e300 300VOID setupenv()
ca6f972f
KM
301{
302 REG STRING *e=environ;
303
304 WHILE *e
305 DO setname(*e++, N_ENVNAM) OD
306}
307
308LOCAL INT namec;
309
310VOID countnam(n)
311 NAMPTR n;
312{
313 namec++;
314}
315
316LOCAL STRING *argnam;
317
318VOID pushnam(n)
319 NAMPTR n;
320{
321 IF n->namval
322 THEN *argnam++ = staknam(n);
323 FI
324}
325
326STRING *setenv()
327{
328 REG STRING *er;
329
330 namec=0;
331 namscan(countnam);
332 argnam = er = getstak(namec*BYTESPERWORD+BYTESPERWORD);
333 namscan(pushnam);
334 *argnam++ = 0;
335 return(er);
336}