Annotation of researchv10no/cmd/visi/lexio.c, revision 1.1

1.1     ! root        1: /*
        !             2:  *      lexio.c 1.4
        !             3:  *
        !             4:  *     Modified Lexical Analyzer I/O Package for Spreadsheet Program `vis'
        !             5:  *
        !             6:  *      A. F. Gettier
        !             7:  *      Bell Laboratories
        !             8:  *      Update made 11/1/82 11:12:16
        !             9:  *      Retrieved 11/15/82 13:22:30
        !            10:  */
        !            11: #include       <stdio.h>
        !            12: #include       "curses.h"
        !            13: #include       "vis.h"
        !            14: 
        !            15: extern struct qheader  Fixup, Depend;
        !            16: extern int     COLS, LINES;
        !            17: 
        !            18: enum states { FIRST, FFILE, FPEND, OTHER };
        !            19: 
        !            20: char   Inline[128];
        !            21: 
        !            22: static enum states     lstate;
        !            23: static char    *line=0, unbuf[128];
        !            24: static char    buffer[128];
        !            25: static int     uncnt=0, first=TRUE;
        !            26: static FILE    *fp;
        !            27: 
        !            28: /*
        !            29:  *     Start lex up for this input line
        !            30:  *       This includes passing the initial line to the
        !            31:  *       lexical analyzer
        !            32:  */
        !            33: void
        !            34: startlex( inbuf )
        !            35: char   *inbuf;
        !            36: {
        !            37:        lexinit();
        !            38:        (void)strcpy( buffer, inbuf );
        !            39:        lstate = FIRST;
        !            40: }
        !            41: 
        !            42: /*
        !            43:  *     Reset lex for next line
        !            44:  *       This routine allows lex to restart as though 
        !            45:  *       it had never been run
        !            46:  */
        !            47: void
        !            48: lexinit()
        !            49: {
        !            50:        /* set the current line as empty */
        !            51: 
        !            52:        Inline[0] = '\0';
        !            53:        line = 0;
        !            54: 
        !            55:        /* empty the unput buffer */
        !            56: 
        !            57:        uncnt = 0;
        !            58: 
        !            59:        /* flush any fixups */
        !            60: 
        !            61:        while ( qread( &Fixup ) != 0 );
        !            62: 
        !            63:        /* turn off the file */
        !            64: 
        !            65:        /* lstate = OTHER; */
        !            66: }
        !            67: 
        !            68: readfile( file )
        !            69: FILE   *file;
        !            70: {
        !            71:        fp = file;
        !            72:        lstate = FPEND;
        !            73: }
        !            74: 
        !            75: 
        !            76: /*
        !            77:  *     New input routine for the lexical analyzer
        !            78:  */
        !            79: char input()
        !            80: {
        !            81: int    i;
        !            82:        struct node     *t;
        !            83:        /*
        !            84:         *      return stored up characters if present
        !            85:         */
        !            86:        if ( uncnt > 0 ) {
        !            87:                return( unbuf[ --uncnt ] );
        !            88:        }
        !            89:        /*
        !            90:         *      Do we need a new buffer?
        !            91:         */
        !            92:        if ( line == 0 ) {
        !            93:                switch( lstate ) {
        !            94:                /*
        !            95:                 *      First time in, get the input buffer
        !            96:                 */
        !            97:                case FIRST:
        !            98:                        (void)strcpy( Inline, cannon( buffer ) );
        !            99:                        line = buffer;
        !           100:                        lstate = OTHER;
        !           101:                        break;
        !           102:                /*
        !           103:                 *      Get a line from the file
        !           104:                 */
        !           105:                case FFILE:
        !           106:                    tryfile:
        !           107:                        if ( fgets( buffer, 128, fp ) == NULL ) {
        !           108:                                lstate = OTHER;
        !           109:                                goto tryother;
        !           110:                        }
        !           111:                        for ( i=0; buffer[i]!='\0'; i++ )
        !           112:                                if ( buffer[i] == '\n' ) {
        !           113:                                        buffer[i] = '\0';
        !           114:                                        break;
        !           115:                                }
        !           116:                        (void)cannon( buffer );
        !           117:                        (void)strcpy( Inline, buffer );
        !           118:                        line = buffer;
        !           119:                        lstate = FPEND;
        !           120:                        break;
        !           121:                case FPEND:
        !           122:                        loop {
        !           123:                                if ( (t = qread( &Fixup )) == 0 ) {
        !           124:                                        lstate = FFILE;
        !           125:                                        goto tryfile;
        !           126:                                }
        !           127:                                if ( t->def == 0 ) continue;
        !           128:                                strcpy( buffer, t->def );
        !           129:                                (void)strcpy( Inline, buffer );
        !           130:                                line = buffer;
        !           131:                                break;
        !           132:                        }
        !           133:                        break;
        !           134:                case OTHER:
        !           135:                    tryother:
        !           136:                        loop {
        !           137:                                if ( (t = qread( &Fixup )) == 0 ) {
        !           138:                                        first = TRUE;
        !           139:                                        return( '\0' );
        !           140:                                }
        !           141:                                if ( t->def == 0 ) continue;
        !           142:                                strcpy( buffer, t->def );
        !           143:                                (void)strcpy( Inline, buffer );
        !           144:                                line = buffer;
        !           145:                                break;
        !           146:                        }
        !           147:                }
        !           148:        }
        !           149:        if ( *line == '#' || *line == ';' || *line == '\0' || *line == '\n' ) {
        !           150:                line = 0;
        !           151:                return( '\n' );
        !           152:        }
        !           153:        return( *line++ );
        !           154: }
        !           155: /*
        !           156:  *     Unput the character
        !           157:  */
        !           158: unput( chr )
        !           159: char   chr;
        !           160: {
        !           161:        unbuf[ uncnt++ ] = chr;
        !           162: }
        !           163: /*
        !           164:  *     Fold all lower case to upper case
        !           165:  */
        !           166: char *foldup( string )
        !           167: char   *string;
        !           168: {
        !           169:        char    *ts;
        !           170:        /*
        !           171:         *      Fold up
        !           172:         */
        !           173:        ts = string;
        !           174:        while ( *ts != '\0' ) {
        !           175:                if ( *ts >= 'a' && *ts <= 'z' )  *ts += 'A' - 'a';
        !           176:                ts++;
        !           177:        }
        !           178:        return( string );
        !           179: }
        !           180: /*
        !           181:  *     Remove all backspaces, general canonical processesing
        !           182:  */
        !           183: char *cannon( string )
        !           184: char   *string;
        !           185: {
        !           186:        char    *ts, *ts2;
        !           187:        /*
        !           188:         *      Take out all backspaces
        !           189:         */
        !           190:        ts2 = ts = string;
        !           191:        while ( *ts != '\0' ) {
        !           192:                if ( *ts == '\b' ) {
        !           193:                        if ( ts != string ) ts2--;
        !           194:                }
        !           195:                else {
        !           196:                        if ( ts != ts2 ) *ts2 = *ts;
        !           197:                        ts2++;
        !           198:                }
        !           199:                ts++;
        !           200:        }
        !           201:        if ( ts != ts2 ) *ts2 = '\0';
        !           202:        return( string );
        !           203: }
        !           204: /*
        !           205:  *     Get the next token and treat it as a value for the previous
        !           206:  *             token, such as the file name for a read
        !           207:  */
        !           208: char *
        !           209: collect()
        !           210: {
        !           211:        static char     buff[64];
        !           212:        char    c;
        !           213:        int     i;
        !           214:        while ( (c=input()) == ' ' || c == '\t' );
        !           215:        if ( c == '\n' ) {
        !           216:                unput( c );
        !           217:                return( 0 );
        !           218:        }
        !           219:        i = 1;
        !           220:        buff[0] = c;
        !           221:        while ( (c=input()) > ' ' )  buff[i++] = c;
        !           222:        buff[i] = '\0';
        !           223:        unput( c );
        !           224:        return( buff );
        !           225: }

unix.superglobalmegacorp.com

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