Annotation of 42BSD/ucb/pascal/pxp/yycomm.c, revision 1.1

1.1     ! root        1: static char *sccsid = "@(#)yycomm.c    1.2 (Berkeley) 2/5/83";
        !             2: /* Copyright (c) 1979 Regents of the University of California */
        !             3: #
        !             4: /*
        !             5:  * pxp - Pascal execution profiler
        !             6:  *
        !             7:  * Bill Joy UCB
        !             8:  * Version 1.2 January 1979
        !             9:  */
        !            10: 
        !            11: #include "whoami.h"
        !            12: #include "0.h"
        !            13: #include "yy.h"
        !            14: 
        !            15: /*
        !            16:  * COMMENT PROCESSING CLUSTER
        !            17:  *
        !            18:  * The global organization of this cluster is as follows.
        !            19:  * While parsing the program information is saved in the tree which
        !            20:  * tells the source text coordinates (sequence numbers and columns)
        !            21:  * bounding each production.  The comments from the source program
        !            22:  * are also saved, with information about their source text position
        !            23:  * and a classification as to their kind.
        !            24:  *
        !            25:  * When printing the reformatted program we flush out the comments
        !            26:  * at various points using the information in the comments and the parse
        !            27:  * tree to "resynchronize".  A number of special cases are recognized to
        !            28:  * deal with the vagarities of producing a true "fixed point" so that
        !            29:  * a prettyprinted program will re-prettyprint to itself.
        !            30:  */
        !            31: 
        !            32: /*
        !            33:  * Save sequence id's and column markers bounding a production
        !            34:  * for later use in placing comments.  We save the sequence id
        !            35:  * and column of the leftmost token and the following token, and
        !            36:  * the sequence id of the last token in this reduction.
        !            37:  * See putcm, putcml, and putcmp below for motivation.
        !            38:  */
        !            39: line2of(l)
        !            40:        int l;
        !            41: {
        !            42: 
        !            43:        return (lineNof(l, 2));
        !            44: }
        !            45: 
        !            46: lineof(l)
        !            47:        int l;
        !            48: {
        !            49: 
        !            50:        return (lineNof(l, 1));
        !            51: }
        !            52: 
        !            53: lineNof(l, i)
        !            54:        int l, i;
        !            55: {
        !            56: 
        !            57:        return(tree(6, l, yypw[i].Wseqid, yypw[i].Wcol, yyseqid, yycol, yypw[N].Wseqid));
        !            58: }
        !            59: 
        !            60: /*
        !            61:  * After a call to setline, Seqid is set to the sequence id
        !            62:  * of the symbol which followed the reduction in which the
        !            63:  * lineof call was embedded, Col to the associated column,
        !            64:  * and LSeqid to the sequence id of the last symbol in the reduction
        !            65:  * (Note that this is exact only if the last symbol was a terminal
        !            66:  * this is always true when it matters.)
        !            67:  */
        !            68: int    Seqid, Col, LSeqid;
        !            69: 
        !            70: /*
        !            71:  * Retrieve the information from a call to lineof before beginning the
        !            72:  * output of a tree from a reduction.  First flush to the left margin
        !            73:  * of the production, and then set so that later calls to putcm, putcml
        !            74:  * and putcmp will deal with the right margin of this comment.
        !            75:  *
        !            76:  * The routine setinfo is called when the lineof has no embedded line
        !            77:  * number to avoid trashing the current "line".
        !            78:  *
        !            79:  * The routine setinfo is often called after completing the output of
        !            80:  * the text of a tree to restore Seqid, Col, and LSeqid which may have
        !            81:  * been destroyed by the nested processing calls to setline.
        !            82:  * In this case the only effect of the call to setinfo is to
        !            83:  * modify the above three variables as a side effect.
        !            84:  *
        !            85:  * We return a word giving information about the comments which were
        !            86:  * actually put out.  See putcm for details.
        !            87:  */
        !            88: setline(ip)
        !            89:        int *ip;
        !            90: {
        !            91: 
        !            92:        line = ip[0];
        !            93:        return(setinfo(ip));
        !            94: }
        !            95: 
        !            96: setinfo(ip)
        !            97:        register int *ip;
        !            98: {
        !            99:        register int i;
        !           100: 
        !           101:        ip++;
        !           102:        Seqid = *ip++;
        !           103:        Col = *ip++;
        !           104:        i = putcm();
        !           105:        Seqid = *ip++;
        !           106:        Col = *ip++;
        !           107:        LSeqid = *ip++;
        !           108:        return (i);
        !           109: }
        !           110: 
        !           111: char   cmeof, incomm;
        !           112: 
        !           113: /*
        !           114:  * Get the text of a comment from the input stream,
        !           115:  * recording its type and linking it into the linked
        !           116:  * list of comments headed by cmhp.
        !           117:  */
        !           118: getcm(cmdelim)
        !           119:        char cmdelim;
        !           120: {
        !           121:        int cmjust, col;
        !           122:        register struct comment *cp;
        !           123:        register struct commline *kp;
        !           124: 
        !           125:        incomm = 1;
        !           126:        if (cmdelim == '*' && yycol == 10 || cmdelim == '{' && yycol == 9)
        !           127:                cmjust = CLMARG;
        !           128:        else if (yytokcnt <= 1)
        !           129:                cmjust = CALIGN;
        !           130:        else if (yywhcnt < 2)
        !           131:                cmjust = CTRAIL;
        !           132:        else
        !           133:                cmjust = CRMARG;
        !           134:        col = yycol - (cmdelim == '{' ? 1 : 2);
        !           135:        cp = tree5(NIL, cmdelim, NIL, cmjust, yyseqid);
        !           136:        cmeof = 0;
        !           137:        do {
        !           138:                kp = getcmline(cmdelim);
        !           139:                if (cp->cml == NIL) {
        !           140:                        kp->cml = kp;
        !           141:                        kp->cmcol = col;
        !           142:                } else {
        !           143:                        kp->cml = cp->cml->cml;
        !           144:                        cp->cml->cml = kp;
        !           145:                        switch (cp->cmjust) {
        !           146:                                case CTRAIL:
        !           147:                                case CRMARG:
        !           148:                                        cp->cmjust = CALIGN;
        !           149:                        }
        !           150:                }
        !           151:                cp->cml = kp;
        !           152:        } while (!cmeof);
        !           153:        newcomm(cp);
        !           154:        incomm = 0;
        !           155: }
        !           156: 
        !           157: /*
        !           158:  * Chain the new comment at "cp" onto the linked list of comments.
        !           159:  */
        !           160: newcomm(cp)
        !           161:        register struct comment *cp;
        !           162: {
        !           163: 
        !           164:        if (cmhp == NIL)
        !           165:                cp->cmnext = cp;
        !           166:        else {
        !           167:                cp->cmnext = cmhp->cmnext;
        !           168:                cmhp->cmnext = cp;
        !           169:        }
        !           170:        cmhp = cp;
        !           171: }
        !           172: 
        !           173: 
        !           174: int    nilcml[3];
        !           175: 
        !           176: quickcomm(t)
        !           177:        int t;
        !           178: {
        !           179: 
        !           180:        if (incomm)
        !           181:                return;
        !           182:        newcomm(tree5(nilcml, NIL, NIL, t, yyseqid));
        !           183: }
        !           184: 
        !           185: commincl(cp, ch)
        !           186:        char *cp, ch;
        !           187: {
        !           188: 
        !           189:        newcomm(tree5(nilcml, savestr(cp), ch, CINCLUD, yyseqid));
        !           190: }
        !           191: 
        !           192: getcmline(cmdelim)
        !           193:        char cmdelim;
        !           194: {
        !           195:        char lastc;
        !           196:        register char *tp;
        !           197:        register CHAR c;
        !           198:        register struct commline *kp;
        !           199: 
        !           200:        c = readch();
        !           201:        kp = tree3(NIL, yycol, NIL);
        !           202:        tp = token;
        !           203:        lastc = 0;
        !           204:        for (;;) {
        !           205:                switch (c) {
        !           206:                        case '}':
        !           207:                                if (cmdelim == '{')
        !           208:                                        goto endcm;
        !           209:                                break;
        !           210:                        case ')':
        !           211:                                if (cmdelim == '*' && lastc == '*') {
        !           212:                                        --tp;
        !           213:                                        goto endcm;
        !           214:                                }
        !           215:                                break;
        !           216:                        case '\n':
        !           217:                                goto done;
        !           218:                        case -1:
        !           219:                                yerror("Comment does not terminate - QUIT");
        !           220:                                pexit(ERRS);
        !           221:                }
        !           222:                lastc = c;
        !           223:                *tp++ = c;
        !           224:                c = readch();
        !           225:        }
        !           226: endcm:
        !           227:        cmeof++;
        !           228: done:
        !           229:        *tp = 0;
        !           230:        kp->cmtext = copystr(token);
        !           231:        return (kp);
        !           232: }
        !           233: 
        !           234: /*
        !           235:  * Flush through the line this token is on.
        !           236:  * Ignore if next token on same line as this one.
        !           237:  */
        !           238: putcml()
        !           239: {
        !           240:        register int i, SSeqid, SCol;
        !           241: 
        !           242:        if (Seqid == LSeqid)
        !           243:                return (1);
        !           244:        SSeqid = Seqid, SCol = Col;
        !           245:        Seqid = LSeqid, Col = 32767;
        !           246:        i = putcm();
        !           247:        Seqid = SSeqid, Col = SCol;
        !           248:        return (i);
        !           249: }
        !           250: 
        !           251: /*
        !           252:  * Flush to the beginning of the line this token is on.
        !           253:  * Ignore if this token is on the same line as the previous one
        !           254:  * (effectively since all such already then flushed.)
        !           255:  */
        !           256: putcmp()
        !           257: {
        !           258:        register int i, SSeqid, SCol;
        !           259: 
        !           260:        SSeqid = Seqid, SCol = Col;
        !           261:        Seqid = LSeqid, Col = 0;
        !           262:        i = putcm();
        !           263:        Seqid = SSeqid, Col = SCol;
        !           264:        return (i);
        !           265: }
        !           266: 
        !           267: /*
        !           268:  * Put out the comments to the border indicated by Seqid and Col
        !           269:  */
        !           270: putcm()
        !           271: {
        !           272:        register struct comment *cp;
        !           273:        register int i;
        !           274: 
        !           275:        cp = cmhp;
        !           276:        if (cp == NIL)
        !           277:                return (0);
        !           278:        i = 0;
        !           279:        cp = cp->cmnext;
        !           280:        while (cp->cmseqid < Seqid || cp->cmseqid == Seqid && cp->cml->cmcol < Col) {
        !           281:                putone(cp);
        !           282:                i =| 1 << cp->cmjust;
        !           283:                if (cp->cmnext == cp) {
        !           284:                        cmhp = NIL;
        !           285:                        break;
        !           286:                }
        !           287:                cp = cp->cmnext;
        !           288:                cmhp->cmnext = cp;
        !           289:        }
        !           290:        return (i);
        !           291: }
        !           292: 
        !           293: /*
        !           294:  * Put out one comment.
        !           295:  * Note that empty lines, form feeds and #include statements
        !           296:  * are treated as comments are regurgitated here.
        !           297:  */
        !           298: putone(cp)
        !           299:        register struct comment *cp;
        !           300: {
        !           301:        register struct commline *cml, *cmf;
        !           302: 
        !           303:        align(cp);
        !           304:        switch (cp->cmjust) {
        !           305:                case CINCLUD:
        !           306:                     /* ppflush() */
        !           307:                        if (noinclude == 0) {
        !           308:                                putchar('\f');
        !           309:                                return;
        !           310:                        }
        !           311:                        printf("#include %c%s%c", cp->cml, cp->cmdelim, cp->cml);
        !           312:                        return;
        !           313:        }
        !           314:        if (stripcomm)
        !           315:                return;
        !           316:        switch (cp->cmjust) {
        !           317:                case CFORM:
        !           318:                        ppop("\f");
        !           319:                        ppnl();
        !           320:                case CNL:
        !           321:                case CNLBL:
        !           322:                        return;
        !           323:        }
        !           324:        ppbra(cp->cmdelim == '{' ? "{" : "(*");
        !           325:        cmf = cp->cml->cml;
        !           326:        ppid(cmf->cmtext);
        !           327:        for (cml = cmf->cml; cml != cmf; cml = cml->cml) {
        !           328:                align(cp);
        !           329:                oneline(cmf->cmcol, cml);
        !           330:        }
        !           331:        ppket(cp->cmdelim == '{' ? "}" : "*)");
        !           332: }
        !           333: 
        !           334: /*
        !           335:  * Do the preliminary horizontal and vertical
        !           336:  * motions necessary before beginning a comment,
        !           337:  * or between lines of a mult-line comment.
        !           338:  */
        !           339: align(cp)
        !           340:        register struct comment *cp;
        !           341: {
        !           342: 
        !           343:        switch (cp->cmjust) {
        !           344:                case CNL:
        !           345:                        ppsnl();
        !           346:                        break;
        !           347:                case CNLBL:
        !           348:                        ppsnlb();
        !           349:                        break;
        !           350:                case CFORM:
        !           351:                case CINCLUD:
        !           352:                        ppnl();
        !           353:                        break;
        !           354:                case CLMARG:
        !           355:                        ppnl();
        !           356:                        if (profile)
        !           357:                                ppid("\t");
        !           358:                        break;
        !           359:                case CALIGN:
        !           360:                        ppnl();
        !           361:                        indent();
        !           362:                        break;
        !           363:                case CTRAIL:
        !           364:                        ppspac();
        !           365:                        break;
        !           366:                case CRMARG:
        !           367:                case CSRMARG:
        !           368:                        pptab();
        !           369:                        break;
        !           370:        }
        !           371: }
        !           372: 
        !           373: /*
        !           374:  * One line of a multi-line comment
        !           375:  * Deal with alignment and initial white space trimming.
        !           376:  * The "margin" indicates where the first line of the
        !           377:  * comment began... don't print stuff in this comment
        !           378:  * which came before this.
        !           379:  */
        !           380: oneline(margin, cml)
        !           381:        int margin;
        !           382:        struct commline *cml;
        !           383: {
        !           384:        register char *tp;
        !           385:        register int i;
        !           386: 
        !           387:        for (i = 8, tp = cml->cmtext; i < margin && *tp; tp++)
        !           388:                switch (*tp) {
        !           389:                        case ' ':
        !           390:                                i++;
        !           391:                                continue;
        !           392:                        case '\t':
        !           393:                                i =+ 8;
        !           394:                                i =& ~7;
        !           395:                                if (i < margin)
        !           396:                                        continue;
        !           397:                                ppop("\t");
        !           398:                        default:
        !           399:                                goto out;
        !           400:                }
        !           401: out:
        !           402:        ppid(tp);
        !           403: }
        !           404: 
        !           405: /*
        !           406:  * Flush all comments
        !           407:  */
        !           408: flushcm()
        !           409: {
        !           410: 
        !           411:        Seqid = 32767;
        !           412:        return(putcm());
        !           413: }
        !           414: 
        !           415: #define        BLANKS  ((1 << CNL) | (1 << CNLBL) | (1 << CFORM))
        !           416: noblank(i)
        !           417:        int i;
        !           418: {
        !           419: 
        !           420:        return ((i & BLANKS) == 0);
        !           421: }
        !           422: 
        !           423: int    needform, neednlbl, neednl, needseqid;
        !           424: 
        !           425: needtree()
        !           426: {
        !           427:        register struct comment *cp;
        !           428: 
        !           429:        needform = neednlbl = neednl = 0;
        !           430:        cp = cmhp;
        !           431:        if (cp == NIL)
        !           432:                return (0);
        !           433:        do {
        !           434:                switch (cp->cmjust) {
        !           435:                        case CNL:
        !           436:                                neednl++;
        !           437:                                goto seq;
        !           438:                        case CNLBL:
        !           439:                                neednlbl++;
        !           440:                                goto seq;
        !           441:                        case CFORM:
        !           442:                                needform++;
        !           443: seq:
        !           444:                                needseqid = cp->cmseqid;
        !           445:                                break;
        !           446:                        default:
        !           447:                                neednl = neednlbl = needform = 0;
        !           448:                                return (1);
        !           449:                }
        !           450:                cp = cp->cmnext;
        !           451:        } while (cp != cmhp);
        !           452:        cmhp = NIL;
        !           453:        return (0);
        !           454: }
        !           455: 
        !           456: packtree()
        !           457: {
        !           458:        int save;
        !           459: 
        !           460:        save = yyseqid;
        !           461:        yyseqid = needseqid;
        !           462:        for (; needform > 0; needform--)
        !           463:                commform();
        !           464:        for (; neednl > 0; neednl--)
        !           465:                commnl();
        !           466:        for (; neednlbl > 0; neednlbl--)
        !           467:                commnlbl();
        !           468:        yyseqid = save;
        !           469: }

unix.superglobalmegacorp.com

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