|
|
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: static char *strfp; ! 12: ! 13: #define prfc(c) (*strfp++ = (c)) ! 14: ! 15: freefunc(val) ! 16: char *val; ! 17: { ! 18: freetree((struct trenod *)val); ! 19: } ! 20: ! 21: ! 22: freetree(t) ! 23: register struct trenod *t; ! 24: { ! 25: if (t) ! 26: { ! 27: register int type; ! 28: ! 29: if (t->tretyp & CNTMSK) ! 30: { ! 31: t->tretyp--; ! 32: return; ! 33: } ! 34: ! 35: type = t->tretyp & COMMSK; ! 36: ! 37: switch (type) ! 38: { ! 39: case TFND: ! 40: free(fndptr(t)->fndnam); ! 41: freetree(fndptr(t)->fndval); ! 42: break; ! 43: ! 44: case TCOM: ! 45: freeio(comptr(t)->comio); ! 46: free_arg(comptr(t)->comarg); ! 47: free_arg(comptr(t)->comset); ! 48: break; ! 49: ! 50: case TFORK: ! 51: freeio(forkptr(t)->forkio); ! 52: freetree(forkptr(t)->forktre); ! 53: break; ! 54: ! 55: case TPAR: ! 56: freetree(parptr(t)->partre); ! 57: break; ! 58: ! 59: case TFIL: ! 60: case TLST: ! 61: case TAND: ! 62: case TORF: ! 63: freetree(lstptr(t)->lstlef); ! 64: freetree(lstptr(t)->lstrit); ! 65: break; ! 66: ! 67: case TFOR: ! 68: { ! 69: struct fornod *f = (struct fornod *)t; ! 70: ! 71: free(f->fornam); ! 72: freetree(f->fortre); ! 73: if (f->forlst) ! 74: { ! 75: freeio(f->forlst->comio); ! 76: free_arg(f->forlst->comarg); ! 77: free_arg(f->forlst->comset); ! 78: free(f->forlst); ! 79: } ! 80: } ! 81: break; ! 82: ! 83: case TWH: ! 84: case TUN: ! 85: freetree(whptr(t)->whtre); ! 86: freetree(whptr(t)->dotre); ! 87: break; ! 88: ! 89: case TIF: ! 90: freetree(ifptr(t)->iftre); ! 91: freetree(ifptr(t)->thtre); ! 92: freetree(ifptr(t)->eltre); ! 93: break; ! 94: ! 95: case TSW: ! 96: free(swptr(t)->swarg); ! 97: freereg(swptr(t)->swlst); ! 98: break; ! 99: } ! 100: free(t); ! 101: } ! 102: } ! 103: ! 104: free_arg(argp) ! 105: register struct argnod *argp; ! 106: { ! 107: register struct argnod *sav; ! 108: ! 109: while (argp) ! 110: { ! 111: sav = argp->argnxt; ! 112: free(argp); ! 113: argp = sav; ! 114: } ! 115: } ! 116: ! 117: ! 118: freeio(iop) ! 119: register struct ionod *iop; ! 120: { ! 121: register struct ionod *sav; ! 122: ! 123: while (iop) ! 124: { ! 125: if ((iop->iofile & IODOC) && fiotemp != 0) ! 126: { ! 127: ! 128: #ifdef DEBUG ! 129: prs("unlinking "); ! 130: prs(iop->ioname); ! 131: newline(); ! 132: #endif ! 133: ! 134: unlink(iop->ioname); ! 135: ! 136: if (fiotemp == iop) ! 137: fiotemp = iop->iolst; ! 138: else ! 139: { ! 140: struct ionod *fiop = fiotemp; ! 141: ! 142: while (fiop->iolst != iop) ! 143: fiop = fiop->iolst; ! 144: ! 145: fiop->iolst = iop->iolst; ! 146: } ! 147: } ! 148: free(iop->ioname); ! 149: free(iop->iolink); ! 150: sav = iop->ionxt; ! 151: free(iop); ! 152: iop = sav; ! 153: } ! 154: } ! 155: ! 156: ! 157: freereg(regp) ! 158: register struct regnod *regp; ! 159: { ! 160: register struct regnod *sav; ! 161: ! 162: while (regp) ! 163: { ! 164: free_arg(regp->regptr); ! 165: freetree(regp->regcom); ! 166: sav = regp->regnxt; ! 167: free(regp); ! 168: regp = sav; ! 169: } ! 170: } ! 171: /* ! 172: * Leaves string on top of stack ! 173: */ ! 174: char * ! 175: strf(n) ! 176: register struct namnod *n; ! 177: { ! 178: strfp = locstak(); ! 179: prfstr(n->namid); ! 180: prfstr("(){\n"); ! 181: prf(n->namval.val); ! 182: prfstr("\n}"); ! 183: return curstak(); ! 184: } ! 185: prfstr(s) ! 186: char *s; ! 187: { ! 188: strfp = movstr(s, strfp); ! 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.