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

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

unix.superglobalmegacorp.com

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