Annotation of researchv9/cmd/sh/func.c, revision 1.1.1.1

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&QUOTE)){
                    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&QUOTE))
                    432:                        prfc('\\');
                    433:                prfc(*p++&~QUOTE);
                    434:        }
                    435:        if(quote){
                    436:                prfc(quote);
                    437:                if(*++p != 0)
                    438:                        goto more;
                    439:        }
                    440: }
                    441: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.