|
|
1.1 root 1: /* @(#)func.c 1.2 */
2: /*
3: * UNIX shell
4: *
5: * Bell Telephone Laboratories
6: *
7: */
8:
9: #include "defs.h"
10:
11: #define prfc(c) pushstak(c)
12:
13: freefunc(val)
14: char *val;
15: {
16: freetree((struct trenod *)val);
17: }
18:
19:
20: freetree(t)
21: register struct trenod *t;
22: {
23: if (t)
24: {
25: register int type;
26:
27: if (t->tretyp & CNTMSK)
28: {
29: t->tretyp--;
30: return;
31: }
32:
33: type = t->tretyp & COMMSK;
34:
35: switch (type)
36: {
37: case TFND:
38: shfree(fndptr(t)->fndnam);
39: freetree(fndptr(t)->fndval);
40: break;
41:
42: case TCOM:
43: freeio(comptr(t)->comio);
44: free_arg(comptr(t)->comarg);
45: free_arg(comptr(t)->comset);
46: break;
47:
48: case TFORK:
49: freeio(forkptr(t)->forkio);
50: freetree(forkptr(t)->forktre);
51: break;
52:
53: case TPAR:
54: freetree(parptr(t)->partre);
55: break;
56:
57: case TFIL:
58: case TLST:
59: case TAND:
60: case TORF:
61: freetree(lstptr(t)->lstlef);
62: freetree(lstptr(t)->lstrit);
63: break;
64:
65: case TFOR:
66: {
67: struct fornod *f = (struct fornod *)t;
68:
69: shfree(f->fornam);
70: freetree(f->fortre);
71: if (f->forlst)
72: {
73: freeio(f->forlst->comio);
74: free_arg(f->forlst->comarg);
75: free_arg(f->forlst->comset);
76: shfree(f->forlst);
77: }
78: }
79: break;
80:
81: case TWH:
82: case TUN:
83: freetree(whptr(t)->whtre);
84: freetree(whptr(t)->dotre);
85: break;
86:
87: case TIF:
88: freetree(ifptr(t)->iftre);
89: freetree(ifptr(t)->thtre);
90: freetree(ifptr(t)->eltre);
91: break;
92:
93: case TSW:
94: shfree(swptr(t)->swarg);
95: freereg(swptr(t)->swlst);
96: break;
97: }
98: shfree(t);
99: }
100: }
101:
102: free_arg(argp)
103: register struct argnod *argp;
104: {
105: register struct argnod *sav;
106:
107: while (argp)
108: {
109: sav = argp->argnxt;
110: shfree(argp);
111: argp = sav;
112: }
113: }
114:
115:
116: freeio(iop)
117: register struct ionod *iop;
118: {
119: register struct ionod *sav;
120:
121: while (iop)
122: {
123: if ((iop->iofile & IODOC) && fiotemp != 0)
124: {
125:
126: #ifdef DEBUG
127: prs("unlinking ");
128: prs(iop->ioname);
129: newline();
130: #endif
131:
132: unlink(iop->ioname);
133:
134: if (fiotemp == iop)
135: fiotemp = iop->iolst;
136: else
137: {
138: struct ionod *fiop = fiotemp;
139:
140: while (fiop->iolst != iop)
141: fiop = fiop->iolst;
142:
143: fiop->iolst = iop->iolst;
144: }
145: }
146: shfree(iop->ioname);
147: shfree(iop->iolink);
148: sav = iop->ionxt;
149: shfree(iop);
150: iop = sav;
151: }
152: }
153:
154:
155: freereg(regp)
156: register struct regnod *regp;
157: {
158: register struct regnod *sav;
159:
160: while (regp)
161: {
162: free_arg(regp->regptr);
163: freetree(regp->regcom);
164: sav = regp->regnxt;
165: shfree(regp);
166: regp = sav;
167: }
168: }
169: /*
170: * Leaves string on top of stack
171: */
172: char *
173: strf(n)
174: register struct namnod *n;
175: {
176: char *s = locstak();
177: prfstr(n->namid);
178: prfstr("(){\n");
179: prf(n->namval.val);
180: prfstr("\n}");
181: prfc('\0');
182: return staktop=s;
183: }
184: prfstr(s)
185: register char *s;
186: {
187: while(*s)
188: prfc(*s++);
189: }
190: prf(t)
191: register struct trenod *t;
192: {
193: sigchk();
194:
195: if (t)
196: {
197: register int type;
198:
199: type = t->tretyp & COMMSK;
200:
201: switch(type)
202: {
203: case TFND:
204: {
205: register struct fndnod *f = (struct fndnod *)t;
206:
207: prfstr(f->fndnam);
208: prfstr("(){\n");
209: prf(f->fndval);
210: prfstr("\n}");
211: break;
212: }
213:
214: case TCOM:
215: {
216: prarg(comptr(t)->comset);
217: prarg(comptr(t)->comarg);
218: prio(comptr(t)->comio);
219: break;
220: }
221:
222: case TFORK:
223: prf(forkptr(t)->forktre);
224: prio(forkptr(t)->forkio);
225: if (forkptr(t)->forktyp & FAMP)
226: prfstr(" &");
227: break;
228:
229: case TPAR:
230: prfstr("(");
231: prf(parptr(t)->partre);
232: prfstr(")");
233: break;
234:
235: case TFIL:
236: prf(lstptr(t)->lstlef);
237: prfstr(" | ");
238: prf(lstptr(t)->lstrit);
239: break;
240:
241: case TLST:
242: prf(lstptr(t)->lstlef);
243: prfc(NL);
244: prf(lstptr(t)->lstrit);
245: break;
246:
247: case TAND:
248: prf(lstptr(t)->lstlef);
249: prfstr(" && ");
250: prf(lstptr(t)->lstrit);
251: break;
252:
253: case TORF:
254: prf(lstptr(t)->lstlef);
255: prfstr(" || ");
256: prf(lstptr(t)->lstrit);
257: break;
258:
259: case TFOR:
260: {
261: register struct argnod *arg;
262: register struct fornod *f = (struct fornod *)t;
263:
264: prfstr("for ");
265: prfstr(f->fornam);
266:
267: if (f->forlst)
268: {
269: arg = f->forlst->comarg;
270: prfstr(" in");
271:
272: while(arg != ENDARGS)
273: {
274: prfc(SP);
275: prfqstr(arg->argval);
276: arg = arg->argnxt;
277: }
278: }
279:
280: prfstr("\ndo\n");
281: prf(f->fortre);
282: prfstr("\ndone");
283: }
284: break;
285:
286: case TWH:
287: case TUN:
288: if (type == TWH)
289: prfstr("while ");
290: else
291: prfstr("until ");
292: prf(whptr(t)->whtre);
293: prfstr("\ndo\n");
294: prf(whptr(t)->dotre);
295: prfstr("\ndone");
296: break;
297:
298: case TIF:
299: {
300: struct ifnod *f = (struct ifnod *)t;
301:
302: prfstr("if ");
303: prf(f->iftre);
304: prfstr("\nthen\n");
305: prf(f->thtre);
306:
307: if (f->eltre)
308: {
309: prfstr("\nelse\n");
310: prf(f->eltre);
311: }
312:
313: prfstr("\nfi");
314: break;
315: }
316:
317: case TSW:
318: {
319: register struct regnod *swl;
320:
321: prfstr("case ");
322: prfqstr(swptr(t)->swarg);
323: prfstr(" in\n");
324:
325: swl = swptr(t)->swlst;
326: while(swl)
327: {
328: struct argnod *arg = swl->regptr;
329:
330: if (arg)
331: {
332: prfqstr(arg->argval);
333: arg = arg->argnxt;
334: }
335:
336: while(arg)
337: {
338: prfc('|');
339: prfqstr(arg->argval);
340: arg = arg->argnxt;
341: }
342:
343: prfstr(") ");
344: prf(swl->regcom);
345: prfstr(";;\n");
346: swl = swl->regnxt;
347: }
348: prfstr("esac");
349: }
350: break;
351: }
352: }
353:
354: sigchk();
355: }
356:
357: prarg(argp)
358: register struct argnod *argp;
359: {
360: while (argp)
361: {
362: prfqstr(argp->argval);
363: prfc(SP);
364: argp=argp->argnxt;
365: }
366: }
367:
368: prio(iop)
369: register struct ionod *iop;
370: {
371: register int iof;
372: register char *ion;
373:
374: while (iop)
375: {
376: iof = iop->iofile;
377: ion = iop->ioname;
378:
379: if (*ion)
380: {
381: itos(iof & IOUFD);
382: prfstr(numbuf);
383:
384: if (iof & IODOC)
385: prfstr("<");
386: else if (iof & IOMOV)
387: {
388: if (iof & IOPUT)
389: prfstr(">&");
390: else
391: prfstr("<&");
392:
393: }
394: else if ((iof & IOPUT) == 0)
395: prfc('<');
396: else if (iof & IOAPP)
397: prfstr(">>");
398: else
399: prfc('>');
400:
401: prfstr(ion);
402: prfc(SP);
403: }
404: iop = iop->ionxt;
405: }
406: }
407: prfqstr(p)
408: register char *p;
409: {
410: int quote, equote;
411: int allquotes;
412: more:
413: quote = equote = allquotes = 0;
414: if(*p == '"'){
415: register char *t = p;
416: quote = equote = '"';
417: allquotes = 1;
418: while(*++t!='"')
419: if(!(*t"E)){
420: allquotes=0;
421: break;
422: }
423: if(allquotes)
424: quote='\'';
425: prfc(quote);
426: p++;
427: }
428: while(*p != equote){
429: if(*p=='"')
430: goto more;
431: if(!allquotes && (*p"E))
432: prfc('\\');
433: prfc(*p++&~QUOTE);
434: }
435: if(quote){
436: prfc(quote);
437: if(*++p != 0)
438: goto more;
439: }
440: }
441:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.