Annotation of coherent/f/usr/spool/uucppublic/cpp.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * n0/cpp.c
        !             3:  * C preprocessor.
        !             4:  * This version of cpp runs as a module of cc0.
        !             5:  */
        !             6: 
        !             7: #ifdef   vax
        !             8: #include "INC$LIB:cc0.h"
        !             9: #else
        !            10: #include "cc0.h"
        !            11: #endif
        !            12: 
        !            13: /*
        !            14:  * Low-level functions and macros.
        !            15:  */
        !            16: 
        !            17: /*
        !            18:  * Stash characters into the 'dbuf'
        !            19:  * where most things are being accumulated.
        !            20:  */
        !            21: 
        !            22: dputc(c) int c;
        !            23: {
        !            24:        if (dputp < dpshp)
        !            25:                *dputp++ = c;
        !            26:        else
        !            27:                dfull("dput");
        !            28: }
        !            29: dpshc(c) int c;
        !            30: {
        !            31:        if (--dpshp > dputp)
        !            32:                *dpshp = c;
        !            33:        else
        !            34:                dfull("dpsh");
        !            35: }
        !            36: dspush(t, p) int t; char *p;
        !            37: {
        !            38:        if (--dstackp > dlistp) {
        !            39:                dstackp->ds_type = t;
        !            40:                dstackp->ds_char = 0;
        !            41:                dstackp->ds_ptr = p;
        !            42:        } else
        !            43:                dfull("dspush");
        !            44: }
        !            45: dspushc(t, c) int t, c;
        !            46: {
        !            47:        if (--dstackp > dlistp) {
        !            48:                dstackp->ds_type = t;
        !            49:                dstackp->ds_char = c;
        !            50:                dstackp->ds_ptr = 0;
        !            51:        } else
        !            52:                dfull("dspushc");
        !            53: }
        !            54: dslist(t, p) int t; char *p;
        !            55: {
        !            56:        if (dlistp < dstackp) {
        !            57:                dlistp->ds_type = t;
        !            58:                dlistp->ds_char = 0;
        !            59:                (dlistp++)->ds_ptr = p;
        !            60:        } else
        !            61:                dfull("dslist");
        !            62: }
        !            63: dslistc(t, c) int t, c;
        !            64: {
        !            65:        if (dlistp < dstackp) {
        !            66:                dlistp->ds_type = t;
        !            67:                dlistp->ds_char = c;
        !            68:                (dlistp++)->ds_ptr = 0;
        !            69:        } else
        !            70:                dfull("dslistc");
        !            71: }
        !            72: 
        !            73: dfull(where) char *where;
        !            74: {
        !            75:        cfatal("macro expansion buffer overflow in %s", where);
        !            76: }
        !            77: 
        !            78: dputs(p) register char *p;
        !            79: {
        !            80:        register int c;
        !            81: 
        !            82:        while (c = *p++) dputc(c);
        !            83: }
        !            84: 
        !            85: dpshs(p) register char *p;
        !            86: {
        !            87:        register int c;
        !            88: 
        !            89:        while (c = *p++) dpshc(c);
        !            90: }
        !            91: 
        !            92: dputstr(d) register int d;
        !            93: {
        !            94:        register int c;
        !            95:        instring = c = d;
        !            96:        for (;;) {
        !            97:                dputc(c);
        !            98:                if ((c = get()) < 0 || c == '\n' || c == d)
        !            99:                        break;
        !           100:                if (c == '\\') {
        !           101:                        dputc(c);
        !           102:                        if ((c = get()) < 0 || c == '\n') {
        !           103:                                dputc(' ');
        !           104:                                break;
        !           105:                        }
        !           106:                }
        !           107:        }
        !           108:        dputc(d);
        !           109:        instring = 0;
        !           110:        return c;
        !           111: }
        !           112: 
        !           113: dpshstr(d) register int d;
        !           114: {
        !           115:        register int c;
        !           116:        instring = c = d;
        !           117:        for (;;) {
        !           118:                dpshc(c);
        !           119:                if ((c = get()) < 0 || c == '\n' || c == d)
        !           120:                        break;
        !           121:                if (c == '\\') {
        !           122:                        dpshc(c);
        !           123:                        if ((c = get()) < 0 || c == '\n') {
        !           124:                                dpshc(' ');
        !           125:                                break;
        !           126:                        }
        !           127:                }
        !           128:        }
        !           129:        dpshc(d);
        !           130:        instring = 0;
        !           131:        return c;
        !           132: }
        !           133: 
        !           134: dputnum(c) register int c;
        !           135: {
        !           136:        ++incpp;
        !           137:        if (c == '.') {
        !           138:                unget(c = get());
        !           139:                if (c < 0 || ct[c] != CON) {
        !           140:                        dputc('.');
        !           141:                        --incpp;
        !           142:                        return;
        !           143:                }
        !           144:                getnum(get(), 1);
        !           145:        } else
        !           146:                getnum(c, 0);
        !           147:        dputs(id);
        !           148:        --incpp;
        !           149: }
        !           150: 
        !           151: dpshnum(c) register int c;
        !           152: {
        !           153:        ++incpp;
        !           154:        if (c == '.') {
        !           155:                unget(c = get());
        !           156:                if (c < 0 || ct[c] != CON) {
        !           157:                        dpshc('.');
        !           158:                        --incpp;
        !           159:                        return;
        !           160:                }
        !           161:                getnum(get(), 1);
        !           162:        } else
        !           163:                getnum(c, 0);
        !           164:        dpshs(id);
        !           165:        --incpp;
        !           166: }
        !           167: 
        !           168: /*
        !           169:  * Hide set handling.
        !           170:  */
        !           171: 
        !           172: #if    OVERLAID
        !           173: /* For the OVERLAID compiler, keep a list of malloc'ed HIDESETs to free. */
        !           174: typedef        struct  hidelist {
        !           175:        struct hidelist *h_hlp;
        !           176:        HIDESET         *h_hsp;
        !           177: } HIDELIST;
        !           178: static HIDELIST *hidelist;
        !           179: 
        !           180: /*
        !           181:  * Release hide sets.
        !           182:  * More bother than it's worth, but tidy.
        !           183:  */
        !           184: freehide()
        !           185: {
        !           186:        register HIDELIST *hp;
        !           187: 
        !           188:        while ((hp = hidelist) != NULL) {
        !           189:                hidelist = hp->h_hlp;
        !           190:                free(hp->h_hsp);
        !           191:                free(hp);
        !           192:        }
        !           193:        hidefree = hidesets = NULL;
        !           194: }
        !           195: 
        !           196: #endif
        !           197: 
        !           198: /* Allocate a new hide set element */
        !           199: HIDESET *newhide()
        !           200: {
        !           201:        register HIDESET *hp;
        !           202:        register HIDEMEM *mp;
        !           203:        register int n;
        !           204: #if    OVERLAID
        !           205:        register HIDELIST *hlp;
        !           206: #endif
        !           207: 
        !           208:        if ((hp = hidefree) == NULL) {
        !           209:                n = 8;
        !           210:                hidefree = hp = new(n*sizeof(HIDESET));
        !           211: #if    OVERLAID
        !           212:                hlp = (HIDELIST *)new(sizeof(HIDELIST));
        !           213:                hlp->h_hlp = hidelist;
        !           214:                hlp->h_hsp = hp;
        !           215:                hidelist = hlp;
        !           216: #endif
        !           217:                while (--n > 0) {
        !           218:                        hp->h_next_set = hp+1;
        !           219:                        hp->h_this_set = NULL;
        !           220:                        hp += 1;
        !           221:                }
        !           222:                hp->h_next_set = NULL;
        !           223:                hp->h_this_set = NULL;
        !           224:                hp = hidefree;
        !           225:        }
        !           226:        if ((mp = hp->h_this_set) == NULL) {
        !           227:                hidefree = hp->h_next_set;
        !           228:                hp->h_next_set = NULL;
        !           229:                return hp;
        !           230:        }
        !           231:        hp->h_this_set = mp->h_next_mem;
        !           232:        mp->h_this_mem = NULL;
        !           233:        mp->h_next_mem = NULL;
        !           234:        return mp;
        !           235: }
        !           236: 
        !           237: /* return the HIDESET corresponding to index x */
        !           238: HIDEMEM *hideget(x) register int x;
        !           239: {
        !           240:        register HIDESET *hp;
        !           241: 
        !           242:        if ((x -= SET0) == 0)
        !           243:                return NULL;
        !           244:        for (hp = hidesets; --x > 0; hp = hp->h_next_set)
        !           245:                if (hp == NULL)
        !           246:                        cbotch("impossible hide set");
        !           247:        return hp->h_this_set;
        !           248: }
        !           249: 
        !           250: /* Compare hidesets for equality */
        !           251: hideeq(mp1, mp2) register HIDEMEM *mp1, *mp2;
        !           252: {
        !           253:        for (;;) {
        !           254:                if (mp1 == NULL)
        !           255:                        if (mp2 == NULL)
        !           256:                                return 1;
        !           257:                        else
        !           258:                                return 0;
        !           259:                else if (mp2 == NULL)
        !           260:                        return 0;
        !           261:                else if (mp1->h_this_mem != mp2->h_this_mem)
        !           262:                        return 0;
        !           263:                mp1 = mp1->h_next_mem;
        !           264:                mp2 = mp2->h_next_mem;
        !           265:        }
        !           266: }
        !           267: 
        !           268: /* Enter a hideset into the universe and return its index */
        !           269: hideent(mp) HIDEMEM *mp;
        !           270: {
        !           271:        register HIDESET **hpp, *hp;
        !           272:        register int x;
        !           273:        HIDESET *tp;
        !           274: 
        !           275:        tp = hp = newhide();
        !           276:        hp->h_this_set = mp;
        !           277:        x = SET0;
        !           278:        hpp = &hidesets;
        !           279:        while ((hp = *hpp) != NULL) {
        !           280:                ++x;
        !           281:                if (hideeq(hp->h_this_set, mp)) {
        !           282:                        hp = tp;
        !           283:                        hp->h_next_set = hidefree;
        !           284:                        hidefree = hp;
        !           285:                        return x;
        !           286:                }
        !           287:                hpp = &hp->h_next_set;
        !           288:        }
        !           289:        ++x;
        !           290:        *hpp = tp;
        !           291:        return x;
        !           292: }
        !           293: 
        !           294: HIDEMEM *hideapp(mp1, tp) HIDEMEM *mp1; TOK *tp;
        !           295: {
        !           296:        register HIDEMEM **mp;
        !           297:        for (mp = &mp1; *mp != NULL; mp = &((*mp)->h_next_mem))
        !           298:                ;
        !           299:        *mp = newhide();
        !           300:        (*mp)->h_this_mem = tp;
        !           301:        return mp1;
        !           302: }
        !           303: 
        !           304: /* Return true if the current id[] is hidden */
        !           305: hidden()
        !           306: {
        !           307:        register HIDEMEM *mp;
        !           308: 
        !           309:        for (mp = hideget(idhide); mp != NULL; mp = mp->h_next_mem)
        !           310:                if (idp == mp->h_this_mem)
        !           311:                        return 1;
        !           312:        return 0;
        !           313: }
        !           314: 
        !           315: /* Return the intersection of s1 and s2 */
        !           316: hideint(s1, s2) int s1, s2;
        !           317: {
        !           318:        register HIDEMEM *mp1, *mp2, *mp3;
        !           319:        if (s1 == SET0)
        !           320:                return s1;
        !           321:        if (s2 == SET0)
        !           322:                return s2;
        !           323:        if (s1 == -1) {
        !           324:                return s2;
        !           325:        }
        !           326:        if (s2 == -1)
        !           327:                return s1;
        !           328:        if (s1 == s2)
        !           329:                return s1;
        !           330:        mp1 = hideget(s1);
        !           331:        mp2 = hideget(s2);
        !           332:        mp3 = NULL;
        !           333:        while (mp1 != NULL && mp2 != NULL) {
        !           334:                if (mp1->h_this_mem == mp2->h_this_mem) {
        !           335:                        mp3 = hideapp(mp3, mp1->h_this_mem);
        !           336:                        mp1 = mp1->h_next_mem;
        !           337:                        mp2 = mp2->h_next_mem;
        !           338:                        continue;
        !           339:                }
        !           340:                if (mp1->h_this_mem < mp2->h_this_mem) {
        !           341:                        mp1 = mp1->h_next_mem;
        !           342:                        continue;
        !           343:                }
        !           344:                if (mp2->h_this_mem < mp1->h_this_mem) {
        !           345:                        mp2 = mp2->h_next_mem;
        !           346:                        continue;
        !           347:                }
        !           348:        }
        !           349:        return hideent(mp3);
        !           350: }
        !           351: 
        !           352: /* Return the union of s1 and s2 */
        !           353: hideaug(s1, s2) int s1, s2;
        !           354: {
        !           355:        register HIDEMEM *mp1, *mp2, *mp3;
        !           356:        if (s1 == SET0)
        !           357:                return s2;
        !           358:        if (s2 == SET0)
        !           359:                return s1;
        !           360:        mp1 = hideget(s1);
        !           361:        mp2 = hideget(s2);
        !           362:        mp3 = NULL;
        !           363:        while (mp1 != NULL || mp2 != NULL) {
        !           364:                if (mp1 == NULL) {
        !           365:                        mp3 = hideapp(mp3, mp2->h_this_mem);
        !           366:                        mp2 = mp2->h_next_mem;
        !           367:                        continue;
        !           368:                }
        !           369:                if (mp2 == NULL) {
        !           370:                        mp3 = hideapp(mp3, mp1->h_this_mem);
        !           371:                        mp1 = mp1->h_next_mem;
        !           372:                        continue;
        !           373:                }
        !           374:                if (mp1->h_this_mem == mp2->h_this_mem) {
        !           375:                        mp3 = hideapp(mp3, mp1->h_this_mem);
        !           376:                        mp1 = mp1->h_next_mem;
        !           377:                        mp2 = mp2->h_next_mem;
        !           378:                        continue;
        !           379:                }
        !           380:                if (mp1->h_this_mem < mp2->h_this_mem) {
        !           381:                        mp3 = hideapp(mp3, mp1->h_this_mem);
        !           382:                        mp1 = mp1->h_next_mem;
        !           383:                        continue;
        !           384:                }
        !           385:                if (mp2->h_this_mem < mp1->h_this_mem) {
        !           386:                        mp3 = hideapp(mp3, mp2->h_this_mem);
        !           387:                        mp2 = mp2->h_next_mem;
        !           388:                        continue;
        !           389:                }
        !           390:        }
        !           391:        return hideent(mp3);
        !           392: }
        !           393: 
        !           394: /* Return the hide set for tp */
        !           395: hideset(tp) register TOK *tp;
        !           396: {
        !           397:        /* Determine if we are at source file level */
        !           398:        {
        !           399:                register DSTACK *dsp;
        !           400:                for (dsp = dstackp; dsp < dstack+NDLEV; dsp += 1)
        !           401:                        if (dsp->ds_type == DS_NAME)
        !           402:                                goto part2;
        !           403:        }
        !           404:        /* Release the previous hide set universe */
        !           405:        if (hidesets != NULL) {
        !           406:                register HIDESET **pp, *hp;
        !           407:                for (pp = &hidesets; (hp = *pp) != NULL; pp = &hp->h_next_set)
        !           408:                        ;
        !           409:                *pp = hidefree;
        !           410:                hidefree = hidesets;
        !           411:                hidesets = NULL;
        !           412:        }
        !           413:  part2:        return hideent(hideapp(NULL, tp));
        !           414: }
        !           415: 
        !           416: /*
        !           417:  * The following four functions are called from cc0 main().
        !           418:  */
        !           419: 
        !           420: /*
        !           421:  * Install a new symbol with given value.
        !           422:  *     -Dname=value
        !           423:  */
        !           424: cppd(name, value) char *name, *value;
        !           425: {
        !           426:        register CPPSYM *sp;
        !           427: 
        !           428:        setid(name);
        !           429:        sp = newcpp(-1, value, strlen(value)+1);
        !           430:        sp->s_sp = idp->t_sym;
        !           431:        idp->t_sym = sp;
        !           432: }
        !           433: 
        !           434: /*
        !           435:  * Undefine a cpp symbol.
        !           436:  *     -Uname
        !           437:  */
        !           438: cppu(name) char *name;
        !           439: {
        !           440:        setid(name);
        !           441:        undefine();
        !           442: }
        !           443: 
        !           444: /*
        !           445:  * Add a directory to the list to be searched for include files.
        !           446:  *     -Ipath
        !           447:  */
        !           448: cppi(path) char *path;
        !           449: {
        !           450:        if (ndirs >= NDIRS)
        !           451:                cfatal("too many directories in include list");
        !           452:        incdirs[ndirs++] = path;
        !           453: }
        !           454: 
        !           455: /*
        !           456:  * cpp loop for generating
        !           457:  * preprocessed text files.
        !           458:  *     isvariant(VCPP) != 0
        !           459:  */
        !           460: cppwork()
        !           461: {
        !           462:        register int c, d;
        !           463:        register char *p;
        !           464:        register int myline;
        !           465:        register char *myfile;
        !           466: 
        !           467:        myfile = file;
        !           468:        myline = line;
        !           469:        while ((c = get()) >= 0) {
        !           470:                switch (ct[c]) {
        !           471: 
        !           472:                case DIV:
        !           473:                        putc(c, ofp);
        !           474:                        if (notvariant(VCPPC))
        !           475:                                continue;
        !           476:                        /*
        !           477:                         * Watch out for comments in cpp -C mode,
        !           478:                         * single and double quotes otherwise cause problems.
        !           479:                         */
        !           480:                        if ((c = get()) >= 0
        !           481:                         && (c == '*' || isvariant(VCPLUS) && c == '/')) {
        !           482:                                putc(c, ofp);
        !           483:                                if (c == '*') {
        !           484:                                        /* Copy normal C-style comment. */
        !           485:                                        while ((c = getc(ifp)) >= 0) {
        !           486:                                                putc(c, ofp);
        !           487:                                                if (c != '*')
        !           488:                                                        continue;
        !           489:                                                if ((c = getc(ifp)) >= 0) {
        !           490:                                                        putc(c, ofp);
        !           491:                                                        if (c != '/')
        !           492:                                                                continue;
        !           493:                                                        break;
        !           494:                                                }
        !           495:                                        }
        !           496:                                } else {
        !           497:                                        /* Copy //-delimited C++ online comment. */
        !           498:                                        while ((c = getc(ifp)) >= 0 && c != '\n')
        !           499:                                                putc(c, ofp);
        !           500:                                        if (c == '\n')
        !           501:                                                ungetc(c, ifp);
        !           502:                                }
        !           503:                        } else
        !           504:                                ungetc(c, ifp);
        !           505:                        continue;
        !           506: 
        !           507:                case ID:
        !           508:                        if (expand(c))
        !           509:                                continue;
        !           510:                        for (p = id; c = *p++; putc(c, ofp));
        !           511:                        continue;
        !           512: 
        !           513:                case QUOTE:
        !           514:                case STRING:
        !           515:                        putc(c, ofp);
        !           516:                        instring = c;
        !           517:                        while ((d = get()) >= 0 && d != c) {
        !           518:                                putc(d, ofp);
        !           519:                                if (d == '\\')
        !           520:                                        putc(get(), ofp);
        !           521:                        }
        !           522:                        instring = 0;
        !           523:                        if (d < 0)
        !           524:                                cerror("EOF in string");
        !           525:                        else
        !           526:                                putc(d, ofp);
        !           527:                        continue;
        !           528: 
        !           529:                default:
        !           530:                        putc(c, ofp);
        !           531:                        if (c != '\n')
        !           532:                                continue;
        !           533:                        if (myfile != file) {
        !           534:                                myfile = file;
        !           535:                                myline = line;
        !           536:                                continue;
        !           537:                        }
        !           538:                        if (++myline == line)
        !           539:                                continue;
        !           540:                        myline = line;
        !           541:                        if (notvariant(VCPPE))
        !           542:                                fprintf(ofp, "#line %d\n", line);
        !           543:                        continue;
        !           544:                }
        !           545:        }
        !           546: }
        !           547: 
        !           548: /* end of n0/cpp.c */

unix.superglobalmegacorp.com

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