Annotation of 43BSDTahoe/ucb/pascal/src/yyput.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[] = "@(#)yyput.c    5.1 (Berkeley) 6/5/85";
        !             9: #endif not lint
        !            10: 
        !            11: #include "whoami.h"
        !            12: #include "0.h"
        !            13: #include "tree.h"
        !            14: #include "tree_ty.h"   /* must be included for yy.h */
        !            15: #include "yy.h"
        !            16: 
        !            17: /*
        !            18:  * Structure describing queued listing lines during the forward move
        !            19:  * of error recovery.  These lines will be stroed by yyoutline during
        !            20:  * the forward move and flushed by yyoutfl or yyflush when an
        !            21:  * error occurs or a program termination.
        !            22:  */
        !            23: struct B {
        !            24:        int     Bmagic;
        !            25:        int     Bline;
        !            26:        int     Bseekp;
        !            27:        char    *Bfile;
        !            28:        int     Bseqid;
        !            29:        struct  B *Bnext;
        !            30: } *bottled;
        !            31: 
        !            32: /*
        !            33:  * Filename gives the current input file, lastname is
        !            34:  * the last filename we printed, and lastid is the seqid of the last line
        !            35:  * we printed, to help us avoid printing
        !            36:  * multiple copies of lines.
        !            37:  */
        !            38: extern char *filename;
        !            39: char   *lastname;
        !            40: int    lastid;
        !            41: 
        !            42: char   hadsome;
        !            43: char   holdbl;
        !            44: 
        !            45: /*
        !            46:  * Print the current line in the input line
        !            47:  * buffer or, in a forward move of the recovery, queue it for printing.
        !            48:  */
        !            49: yyoutline()
        !            50: {
        !            51:        register struct B *bp;
        !            52: 
        !            53:        if (Recovery) {
        !            54:                bp = (struct B *) tree(6, T_BOTTLE, yyline, yylinpt, filename,
        !            55:                                yyseqid);
        !            56:                if (bottled != NIL)
        !            57:                        bp->Bnext = bottled->Bnext, bottled->Bnext = bp;
        !            58:                else
        !            59:                        bp->Bnext = bp;
        !            60:                bottled = bp;
        !            61:                return;
        !            62:        }
        !            63:        yyoutfl(yyseqid);
        !            64:        if (yyseqid != lastid)
        !            65:                yyprline(charbuf, yyline, filename, yyseqid);
        !            66: }
        !            67: 
        !            68: /*
        !            69:  * Flush all the bottled output.
        !            70:  */
        !            71: yyflush()
        !            72: {
        !            73: 
        !            74:        yyoutfl(32767);
        !            75: }
        !            76: 
        !            77: /*
        !            78:  * Flush the listing to the sequence id toseqid
        !            79:  */
        !            80: yyoutfl(toseqid)
        !            81:        int toseqid;
        !            82: {
        !            83:        register struct B *bp;
        !            84: 
        !            85:        bp = bottled;
        !            86:        if (bp == NIL)
        !            87:                return;
        !            88:        bp = bp->Bnext;
        !            89:        while (bp->Bseqid <= toseqid) {
        !            90:                yygetline(bp->Bfile, bp->Bseekp, bp->Bline, bp->Bseqid);
        !            91:                if (bp->Bnext == bp) {
        !            92:                        bottled = NIL;
        !            93:                        break;
        !            94:                }
        !            95:                bp = bp->Bnext;
        !            96:                bottled->Bnext = bp;
        !            97:        }
        !            98: }
        !            99: 
        !           100: FILE   *yygetunit = NULL;
        !           101: char   *yygetfile;
        !           102: 
        !           103: /*
        !           104:  * Yysync guarantees that the line associated
        !           105:  * with the current token was the last line
        !           106:  * printed for a syntactic error message.
        !           107:  */
        !           108: yysync()
        !           109: {
        !           110: 
        !           111:        yyoutfl(yyeseqid);
        !           112:        if (lastid != yyeseqid)
        !           113:                yygetline(yyefile, yyseekp, yyeline, yyeseqid);
        !           114: }
        !           115: 
        !           116: yySsync()
        !           117: {
        !           118: 
        !           119:        yyoutfl(OY.Yyeseqid);
        !           120: }
        !           121: 
        !           122: /*
        !           123:  * Yygetline gets a line from a file after we have
        !           124:  * lost it.  The pointer efile gives the name of the file,
        !           125:  * seekp its offset in the file, and eline its line number.
        !           126:  * If this routine has been called before the last file
        !           127:  * it worked on will be open in yygetunit, with the files
        !           128:  * name being given in yygetfile.  Note that this unit must
        !           129:  * be opened independently of the unit in use for normal i/o
        !           130:  * to this file; if it were a dup seeks would seek both files.
        !           131:  */
        !           132: yygetline(efile, seekp, eline, eseqid)
        !           133:        char *efile;
        !           134:        int seekp, eline, eseqid;
        !           135: {
        !           136:        register int cnt;
        !           137:        register char *bp;
        !           138:        char buf[CBSIZE + 1];
        !           139: 
        !           140:        if (lastid == eseqid)
        !           141:                return;
        !           142:        if (eseqid == yyseqid) {
        !           143:                bp = charbuf;
        !           144:                yyprtd++;
        !           145:        } else {
        !           146:                bp = buf;
        !           147:                if (efile != yygetfile) {
        !           148:                        if ( yygetunit != NULL )
        !           149:                            (void) fclose( yygetunit );
        !           150:                        yygetfile = efile;
        !           151:                        yygetunit = fopen( yygetfile , "r" );
        !           152:                        if (yygetunit < 0)
        !           153: oops:
        !           154:                                perror(yygetfile), pexit(DIED);
        !           155:                } 
        !           156:                if ( fseek( yygetunit , (long) seekp , 0 ) < 0)
        !           157:                        goto oops;
        !           158:                cnt = fread( bp , sizeof( * bp ) , CBSIZE , yygetunit );
        !           159:                if (cnt < 0)
        !           160:                        goto oops;
        !           161:                bp[cnt] = 0;
        !           162:        }
        !           163:        yyprline(bp, eline, efile, eseqid);
        !           164: }
        !           165: 
        !           166: yyretrieve()
        !           167: {
        !           168: 
        !           169:        yygetline(OY.Yyefile, OY.Yyseekp, OY.Yyeline, OY.Yyeseqid);
        !           170: }
        !           171: 
        !           172: /*
        !           173:  * Print the line in the character buffer which has
        !           174:  * line number line.  The buffer may be terminated by a new
        !           175:  * line character or a null character.  We process
        !           176:  * form feed directives, lines with only a form feed character, and
        !           177:  * suppress numbering lines which are empty here.
        !           178:  */
        !           179: yyprline(buf, line, file, id)
        !           180:        register char *buf;
        !           181:        int line;
        !           182:        char *file;
        !           183:        int id;
        !           184: {
        !           185: 
        !           186:        lastid = id;
        !           187:        if (buf[0] == '\f' && buf[1] == '\n') {
        !           188:                printf("\f\n");
        !           189:                hadsome = 0;
        !           190:                holdbl = 0;
        !           191:                return;
        !           192:        }
        !           193:        if (holdbl) {
        !           194:                pchr('\n');
        !           195:                holdbl = 0;
        !           196:        }
        !           197:        if (buf[0] == '\n')
        !           198:                holdbl = 1;
        !           199:        else {
        !           200:                yysetfile(file);
        !           201:                yyprintf(buf, line);
        !           202:        }
        !           203:        hadsome = 1;
        !           204: }
        !           205: 
        !           206: yyprintf(cp, line)
        !           207:        register char *cp;
        !           208:        int line;
        !           209: {
        !           210: 
        !           211:        printf("%6d  ", line);
        !           212:        while (*cp != 0 && *cp != '\n')
        !           213:                pchr(graphic(*cp++));
        !           214:        pchr('\n');
        !           215: }
        !           216: 
        !           217: graphic(ch)
        !           218:        register CHAR ch;
        !           219: {
        !           220: 
        !           221:        switch (ch) {
        !           222:                default:
        !           223:                        if (ch >= ' ')
        !           224:                                return (ch);
        !           225:                case 0177:
        !           226:                        return ('?');
        !           227:                case '\n':
        !           228:                case '\t':
        !           229:                        return (ch);
        !           230:        }
        !           231: }
        !           232: 
        !           233: extern int nopflg;
        !           234: 
        !           235: char   printed = 1;
        !           236: /*
        !           237:  * Set the current file name to be file,
        !           238:  * printing the name, or a header on a new
        !           239:  * page if required.
        !           240:  * there is another yysetfile in error.c
        !           241:  * this one is for PI and PXP that one is for PI1
        !           242:  */
        !           243: yysetfile(file)
        !           244:        register char *file;
        !           245: {
        !           246: 
        !           247: #ifdef PXP
        !           248:        if (nopflg == 1)
        !           249:                return;
        !           250: #endif
        !           251: 
        !           252:        if (lastname == file)
        !           253:                return;
        !           254:        if (file == filename && opt('n') && (printed & 02) == 0) {
        !           255:                printed |= 02;
        !           256:                header();
        !           257:        } else
        !           258:                yyputfn(file);
        !           259:        lastname = file;
        !           260: }
        !           261: 
        !           262: /*
        !           263:  * Put out an include file name
        !           264:  * if an error occurs but the name has
        !           265:  * not been printed (or if another name
        !           266:  * has been printed since it has).
        !           267:  */
        !           268: yyputfn(cp)
        !           269:        register char *cp;
        !           270: {
        !           271:        extern int outcol;
        !           272: 
        !           273:        if (cp == lastname && printed)
        !           274:                return;
        !           275:        lastname = cp;
        !           276:        printed = 1;
        !           277: #ifdef PXP
        !           278:        if (outcol)
        !           279:                pchr('\n');
        !           280: #endif
        !           281:        gettime( cp );
        !           282:        printf("%s  %s:\n" , myctime( (int *) (&tvec) ) , cp );
        !           283:        hadsome = 1;
        !           284: }

unix.superglobalmegacorp.com

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