Annotation of researchv9/cmd/sh/func.c, revision 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.