Annotation of 42BSD/bin/as/asscanl.h, revision 1.1

1.1     ! root        1: /*
        !             2:  *     Copyright (c) 1982 Regents of the University of California
        !             3:  *     @(#)asscanl.h 4.5 6/30/83
        !             4:  */
        !             5: /*
        !             6:  *     This file contains definitions local to the files implementing
        !             7:  *     the character scanner and the token buffer managers.
        !             8:  *     It is not intended to be shared with any other parts of the
        !             9:  *     assembler.
        !            10:  *     The file ``asscan.h'' is shared with other parts of the assembler
        !            11:  */
        !            12: #include <stdio.h>
        !            13: #include "as.h"
        !            14: #include "asscan.h"
        !            15: 
        !            16: #define EOFCHAR        (-1)
        !            17: /*
        !            18:  *     The table of possible uses for each character to test set inclusion.
        !            19:  */
        !            20: #define        HEXFLAG         01              /* 'x' or 'X' */
        !            21: #define        HEXLDIGIT       02              /* 'a' .. 'f' */
        !            22: #define        HEXUDIGIT       04              /* 'A' .. 'F' */
        !            23: #define        ALPHA           010             /* 'A' .. 'Z', 'a' .. 'z', '_'*/
        !            24: #define        DIGIT           020             /* '0' .. '9' */
        !            25: #define        FLOATEXP        040             /* 'd' 'e' 'D' 'E' 'g' 'h' 'G' 'H' */
        !            26: #define        SIGN            0100            /* '+' .. '-'*/
        !            27: #define        REGDIGIT        0200            /* '0' .. '5' */
        !            28: #define        SZSPECBEGIN     0400            /* 'b', 'B', 'l', 'L', 'w', 'W' */
        !            29: #define        POINT           01000           /* '.' */
        !            30: #define        SPACE           02000           /* '\t' or ' ' */
        !            31: #define        BSESCAPE        04000           /* bnrtf */
        !            32: #define        STRESCAPE       010000          /* '"', '\\', '\n' */
        !            33: #define        OCTDIGIT        020000          /* '0' .. '7' */
        !            34: #define        FLOATFLAG       040000          /* 'd', 'D', 'f', 'F' */
        !            35: 
        !            36: #define        INCHARSET(val, kind) (charsets[val] & (kind) )
        !            37: /*
        !            38:  *     We use our own version of getchar/ungetc to get
        !            39:  *     some speed improvement
        !            40:  */
        !            41: extern char    *Ginbufptr;
        !            42: extern int     Ginbufcnt;
        !            43: #define        REGTOMEMBUF     Ginbufptr = inbufptr, Ginbufcnt = inbufcnt
        !            44: #define        MEMTOREGBUF     inbufptr = Ginbufptr, inbufcnt = Ginbufcnt
        !            45: #undef getchar
        !            46: #define        getchar() \
        !            47:        (inbufcnt-- > 0 ? (*inbufptr++) : \
        !            48:                (fillinbuffer(), \
        !            49:                MEMTOREGBUF, \
        !            50:                inbufptr[-1]))
        !            51: #undef ungetc
        !            52: #define ungetc(ch) \
        !            53:        (++inbufcnt, *--inbufptr = ch)
        !            54: 
        !            55: /*
        !            56:  *     Variables and definitions to manage the token buffering.
        !            57:  *     We scan (lexically analyze) a large number of tokens, and
        !            58:  *     then parse all of the tokens in the scan buffer.
        !            59:  *     This reduces procedure call overhead when the parser
        !            60:  *     demands a token, allows for an efficient reread during
        !            61:  *     the second pass, and confuses the line number reporting
        !            62:  *     for errors encountered in the scanner and in the parser.
        !            63:  */
        !            64: #define TOKDALLOP      8
        !            65: struct tokbufdesc *bufstart;   /*where the buffer list begins*/
        !            66: struct tokbufdesc *buftail;    /*last one on the list*/
        !            67: struct tokbufdesc *emptybuf;   /*the one being filled*/
        !            68: /*
        !            69:  *     If we are using VM, during the second pass we reclaim the used
        !            70:  *     token buffers for saving the relocation information
        !            71:  */
        !            72: struct tokbufdesc *tok_free;   /* free pool */
        !            73: struct tokbufdesc *tok_temp;   /* temporary for doing list manipulation */
        !            74: /*
        !            75:  *     Other token buffer managers
        !            76:  */
        !            77: int    bufno;                  /*which buffer number: 0,1 for tmp file*/
        !            78: struct         tokbufdesc tokbuf[2];   /*our initial increment of buffers*/
        !            79: ptrall tokptr;                 /*where the current token comes from*/
        !            80: ptrall tokub;                  /*the last token in the current token buffer*/
        !            81: /*
        !            82:  *     as does not use fread and fwrite for the token buffering.
        !            83:  *     The token buffers are integrals of BUFSIZ
        !            84:  *     at all times, so we use direct read and write.
        !            85:  *     fread and fwrite in stdio are HORRENDOUSLY inefficient,
        !            86:  *     as they use putchar for each character, nested two deep in loops.
        !            87:  */
        !            88: #define writeTEST(pointer, size, nelements, ioptr) \
        !            89:        write(ioptr->_file, pointer, nelements * size) != nelements * size
        !            90: 
        !            91: #define readTEST(pointer, size, nelements, ioptr) \
        !            92:        read(ioptr->_file, pointer, nelements * size) != nelements * size
        !            93: 
        !            94: #define bskiplg(from, length) \
        !            95:        *(lgtype *)from = length; \
        !            96:        (bytetoktype *)from += sizeof(lgtype) + length
        !            97: 
        !            98: #define bskipfromto(from, to) \
        !            99:        *(lgtype *)from = (bytetoktype *)to - (bytetoktype *)from - sizeof(lgtype); \
        !           100:        (bytetoktype *)from += sizeof (lgtype) + (bytetoktype *)to - (bytetoktype *)from
        !           101: 
        !           102: #define eatskiplg(from) \
        !           103:        (bytetoktype *)from += sizeof(lgtype) + *(lgtype *)from
        !           104: 
        !           105: #ifdef DEBUG
        !           106:        ptrall  firsttoken;
        !           107: #endif DEBUG
        !           108: 
        !           109: /*
        !           110:  *     The following three variables are the slots for global
        !           111:  *     communication with the parser.
        !           112:  *     They are the semantic values associated with a particular token.
        !           113:  *     The token itself is the return value from yylex()
        !           114:  */
        !           115: int    yylval;                 /* normal semantic value */
        !           116: Bignum yybignum;               /* a big number */
        !           117: struct Opcode  yyopcode;       /* a structure opcode */
        !           118: 
        !           119: int    newfflag;
        !           120: char   *newfname;
        !           121: int    scanlineno;             /*the scanner's linenumber*/
        !           122: 
        !           123: /*
        !           124:  *     Definitions for sets of characters
        !           125:  */
        !           126: readonly short charsets[];
        !           127: readonly short type[];

unix.superglobalmegacorp.com

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