Annotation of researchv10no/cmd/cpp/yylex.c, revision 1.1.1.1

1.1       root        1: /*#ident       "@(#)cpp:common/yylex.c 1.11"*/
                      2: 
                      3: #include "y.tab.h"
                      4: #ifdef FLEXNAMES
                      5: #      define NCPS     128
                      6: #else
                      7: #      define NCPS     8
                      8: #endif
                      9: extern int ncps;       /* actual number of chars. */
                     10: #ifdef CXREF
                     11: extern int xline;
                     12: #endif
                     13: extern int yylval;
                     14: 
                     15: #define isid(a)  ((fastab+COFF)[a]&IB)
                     16: #define IB 1
                     17: /*     #if '\377' < 0          it would be nice if this worked properly!!!!! */
                     18: #if pdp11 | vax
                     19: #define COFF 128
                     20: #else
                     21: #define COFF 0
                     22: #endif
                     23: 
                     24: yylex()
                     25: {
                     26:        static int ifdef = 0;
                     27:        static char *op2[] = {"||",  "&&" , ">>", "<<", ">=", "<=", "!=", "=="};
                     28:        static int  val2[] = {OROR, ANDAND,  RS,   LS,   GE,   LE,   NE,   EQ};
                     29:        static char *opc = "b\bt\tn\nf\fr\r\\\\";
                     30:        extern char fastab[];
                     31:        extern char *outp, *inp, *newp;
                     32:        extern int flslvl;
                     33:        register char savc, *s;
                     34:        char *skipbl();
                     35:        int val;
                     36:        register char **p2;
                     37:        struct symtab
                     38:        {
                     39:                char *name;
                     40:                char *value;
                     41:        } *sp, *lookup();
                     42: 
                     43:        for ( ;; )
                     44:        {
                     45:                newp = skipbl( newp );
                     46:                if ( *inp == '\n' )             /* end of #if */
                     47:                        return( stop );
                     48:                savc = *newp;
                     49:                *newp = '\0';
                     50:                if ( *inp == '/' && inp[1] == '*' )
                     51:                {
                     52:                        /* found a comment with -C option, still toss here */
                     53:                        *newp = savc;
                     54:                        outp = inp = newp;
                     55:                        continue;
                     56:                }
                     57:                for ( p2 = op2 + 8; --p2 >= op2; )      /* check 2-char ops */
                     58:                        if ( strcmp( *p2, inp ) == 0 )
                     59:                        {
                     60:                                val = val2[ p2 - op2 ];
                     61:                                goto ret;
                     62:                        }
                     63:                s = "+-*/%<>&^|?:!~(),";                /* check 1-char ops */
                     64:                while ( *s )
                     65:                        if ( *s++ == *inp )
                     66:                        {
                     67:                                val= *--s;
                     68:                                goto ret;
                     69:                        }
                     70:                if ( *inp<='9' && *inp>='0' )           /* a number */
                     71:                {
                     72:                        if ( *inp == '0' )
                     73:                                yylval= ( inp[1] == 'x' || inp[1] == 'X' ) ?
                     74:                                        tobinary( inp + 2, 16 ) :
                     75:                                        tobinary( inp + 1, 8 );
                     76:                        else
                     77:                                yylval = tobinary( inp, 10 );
                     78:                        val = number;
                     79:                }
                     80:                else if ( isid( *inp ) )
                     81:                {
                     82:                        if ( strcmp( inp, "defined" ) == 0 )
                     83:                        {
                     84:                                ifdef = 1;
                     85:                                ++flslvl;
                     86:                                val = DEFINED;
                     87:                        }
                     88:                        else
                     89:                        {
                     90:                                if ( ifdef != 0 )
                     91:                                {
                     92:                                        register char *p;
                     93:                                        register int savech;
                     94: 
                     95:                                        /* make sure names <= ncps chars */
                     96:                                        if ( ( newp - inp ) > ncps )
                     97:                                                p = inp + ncps;
                     98:                                        else
                     99:                                                p = newp;
                    100:                                        savech = *p;
                    101:                                        *p = '\0';
                    102:                                        sp = lookup( inp, -1 );
                    103:                                        *p = savech;
                    104:                                        ifdef = 0;
                    105:                                        --flslvl;
                    106:                                }
                    107:                                else
                    108:                                        sp = lookup( inp, -1 );
                    109: #ifdef CXREF
                    110:                                ref(inp, xline);
                    111: #endif
                    112:                                yylval = ( sp->value == 0 ) ? 0 : 1;
                    113:                                val = number;
                    114:                        }
                    115:                }
                    116:                else if ( *inp == '\'' )        /* character constant */
                    117:                {
                    118:                        val = number;
                    119:                        if ( inp[1] == '\\' )   /* escaped */
                    120:                        {
                    121:                                char c;
                    122: 
                    123:                                if ( newp[-1] == '\'' )
                    124:                                        newp[-1] = '\0';
                    125:                                s = opc;
                    126:                                while ( *s )
                    127:                                        if ( *s++ != inp[2] )
                    128:                                                ++s;
                    129:                                        else
                    130:                                        {
                    131:                                                yylval = *s;
                    132:                                                goto ret;
                    133:                                        }
                    134:                                if ( inp[2] <= '9' && inp[2] >= '0' )
                    135:                                        yylval = c = tobinary( inp + 2, 8 );
                    136:                                else
                    137:                                        yylval = inp[2];
                    138:                        }
                    139:                        else
                    140:                                yylval = inp[1];
                    141:                }
                    142:                else if ( strcmp( "\\\n", inp ) == 0 )
                    143:                {
                    144:                        *newp = savc;
                    145:                        continue;
                    146:                }
                    147:                else
                    148:                {
                    149:                        *newp = savc;
                    150:                        pperror( "Illegal character %c in preprocessor if",
                    151:                                *inp );
                    152:                        continue;
                    153:                }
                    154:        ret:
                    155:                /* check for non-ident after defined (note need the paren!) */
                    156:                if ( ifdef && val != '(' && val != DEFINED )
                    157:                {
                    158:                        pperror( "\"defined\" modifying non-identifier \"%s\" in preprocessor if", inp );
                    159:                        ifdef = 0;
                    160:                        flslvl--;
                    161:                }
                    162:                *newp = savc;
                    163:                outp = inp = newp;
                    164:                return( val );
                    165:        }
                    166: }
                    167: 
                    168: tobinary( st, b )
                    169:        char *st;
                    170: {
                    171:        int n, c, t;
                    172:        char *s;
                    173:        int warned = 0;
                    174: 
                    175:        n = 0;
                    176:        s = st;
                    177:        while ( c = *s++ )
                    178:        {
                    179:                switch( c )
                    180:                {
                    181:                case '8': case '9':
                    182:                        if (b <= 8 && !warned) {
                    183:                                ppwarn("Illegal octal number %s", st);
                    184:                                warned = 1;
                    185:                        }
                    186:                case '0': case '1': case '2': case '3': case '4': 
                    187:                case '5': case '6': case '7':
                    188:                        t = c - '0';
                    189:                        break;
                    190:                case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': 
                    191:                        t = (c - 'a') + 10;
                    192:                        if ( b > 10 )
                    193:                                break;
                    194:                case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': 
                    195:                        t = (c - 'A') + 10;
                    196:                        if ( b > 10 )
                    197:                                break;
                    198:                default:
                    199:                        t = -1;
                    200:                        if ( c == 'l' || c == 'L' )
                    201:                                if ( *s == '\0' )
                    202:                                        break;
                    203:                        pperror( "Illegal number %s", st );
                    204:                }
                    205:                if ( t < 0 )
                    206:                        break;
                    207:                n = n * b + t;
                    208:        }
                    209:        return( n );
                    210: }

unix.superglobalmegacorp.com

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