Annotation of GNUtools/cc/cexp.c, revision 1.1

1.1     ! root        1: 
        !             2: /*  A Bison parser, made from cexp.y  */
        !             3: 
        !             4: #define YYBISON 1  /* Identify Bison output.  */
        !             5: 
        !             6: #define        INT     258
        !             7: #define        CHAR    259
        !             8: #define        NAME    260
        !             9: #define        ERROR   261
        !            10: #define        OR      262
        !            11: #define        AND     263
        !            12: #define        EQUAL   264
        !            13: #define        NOTEQUAL        265
        !            14: #define        LEQ     266
        !            15: #define        GEQ     267
        !            16: #define        LSH     268
        !            17: #define        RSH     269
        !            18: #define        UNARY   270
        !            19: 
        !            20: #line 26 "cexp.y"
        !            21: 
        !            22: #include "config.h"
        !            23: #include <setjmp.h>
        !            24: /* #define YYDEBUG 1 */
        !            25: 
        !            26: #ifdef MULTIBYTE_CHARS
        !            27: #include <stdlib.h>
        !            28: #include <locale.h>
        !            29: #endif
        !            30: 
        !            31: #include <stdio.h>
        !            32: 
        !            33: typedef unsigned char U_CHAR;
        !            34: 
        !            35: /* This is used for communicating lists of keywords with cccp.c.  */
        !            36: struct arglist {
        !            37:   struct arglist *next;
        !            38:   U_CHAR *name;
        !            39:   int length;
        !            40:   int argno;
        !            41: };
        !            42: 
        !            43: /* Define a generic NULL if one hasn't already been defined.  */
        !            44: 
        !            45: #ifndef NULL
        !            46: #define NULL 0
        !            47: #endif
        !            48: 
        !            49: #ifndef GENERIC_PTR
        !            50: #if defined (USE_PROTOTYPES) ? USE_PROTOTYPES : defined (__STDC__)
        !            51: #define GENERIC_PTR void *
        !            52: #else
        !            53: #define GENERIC_PTR char *
        !            54: #endif
        !            55: #endif
        !            56: 
        !            57: #ifndef NULL_PTR
        !            58: #define NULL_PTR ((GENERIC_PTR)0)
        !            59: #endif
        !            60: 
        !            61: int yylex ();
        !            62: void yyerror ();
        !            63: int expression_value;
        !            64: 
        !            65: static jmp_buf parse_return_error;
        !            66: 
        !            67: /* Nonzero means count most punctuation as part of a name.  */
        !            68: static int keyword_parsing = 0;
        !            69: 
        !            70: /* some external tables of character types */
        !            71: extern unsigned char is_idstart[], is_idchar[], is_hor_space[];
        !            72: 
        !            73: extern char *xmalloc ();
        !            74: 
        !            75: /* Flag for -pedantic.  */
        !            76: extern int pedantic;
        !            77: 
        !            78: /* Flag for -traditional.  */
        !            79: extern int traditional;
        !            80: 
        !            81: #ifndef CHAR_TYPE_SIZE
        !            82: #define CHAR_TYPE_SIZE BITS_PER_UNIT
        !            83: #endif
        !            84: 
        !            85: #ifndef INT_TYPE_SIZE
        !            86: #define INT_TYPE_SIZE BITS_PER_WORD
        !            87: #endif
        !            88: 
        !            89: #ifndef LONG_TYPE_SIZE
        !            90: #define LONG_TYPE_SIZE BITS_PER_WORD
        !            91: #endif
        !            92: 
        !            93: #ifndef WCHAR_TYPE_SIZE
        !            94: #define WCHAR_TYPE_SIZE INT_TYPE_SIZE
        !            95: #endif
        !            96: 
        !            97: #ifndef MAX_CHAR_TYPE_SIZE
        !            98: #define MAX_CHAR_TYPE_SIZE CHAR_TYPE_SIZE
        !            99: #endif
        !           100: 
        !           101: #ifndef MAX_INT_TYPE_SIZE
        !           102: #define MAX_INT_TYPE_SIZE INT_TYPE_SIZE
        !           103: #endif
        !           104: 
        !           105: #ifndef MAX_LONG_TYPE_SIZE
        !           106: #define MAX_LONG_TYPE_SIZE LONG_TYPE_SIZE
        !           107: #endif
        !           108: 
        !           109: #ifndef MAX_WCHAR_TYPE_SIZE
        !           110: #define MAX_WCHAR_TYPE_SIZE WCHAR_TYPE_SIZE
        !           111: #endif
        !           112: 
        !           113: /* Yield nonzero if adding two numbers with A's and B's signs can yield a
        !           114:    number with SUM's sign, where A, B, and SUM are all C integers.  */
        !           115: #define possible_sum_sign(a, b, sum) ((((a) ^ (b)) | ~ ((a) ^ (sum))) < 0)
        !           116: 
        !           117: static void integer_overflow ();
        !           118: static long left_shift ();
        !           119: static long right_shift ();
        !           120: 
        !           121: #line 127 "cexp.y"
        !           122: typedef union {
        !           123:   struct constant {long value; int unsignedp;} integer;
        !           124:   struct name {U_CHAR *address; int length;} name;
        !           125:   struct arglist *keywords;
        !           126:   int voidval;
        !           127:   char *sval;
        !           128: } YYSTYPE;
        !           129: 
        !           130: #ifndef YYLTYPE
        !           131: typedef
        !           132:   struct yyltype
        !           133:     {
        !           134:       int timestamp;
        !           135:       int first_line;
        !           136:       int first_column;
        !           137:       int last_line;
        !           138:       int last_column;
        !           139:       char *text;
        !           140:    }
        !           141:   yyltype;
        !           142: 
        !           143: #define YYLTYPE yyltype
        !           144: #endif
        !           145: 
        !           146: #include <stdio.h>
        !           147: 
        !           148: #ifndef __STDC__
        !           149: #define const
        !           150: #endif
        !           151: 
        !           152: 
        !           153: 
        !           154: #define        YYFINAL         73
        !           155: #define        YYFLAG          -32768
        !           156: #define        YYNTBASE        34
        !           157: 
        !           158: #define YYTRANSLATE(x) ((unsigned)(x) <= 270 ? yytranslate[x] : 39)
        !           159: 
        !           160: static const char yytranslate[] = {     0,
        !           161:      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        !           162:      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        !           163:      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        !           164:      2,     2,    29,     2,    31,     2,    27,    14,     2,    32,
        !           165:     33,    25,    23,     9,    24,     2,    26,     2,     2,     2,
        !           166:      2,     2,     2,     2,     2,     2,     2,     8,     2,    17,
        !           167:      2,    18,     7,     2,     2,     2,     2,     2,     2,     2,
        !           168:      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        !           169:      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        !           170:      2,     2,     2,    13,     2,     2,     2,     2,     2,     2,
        !           171:      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        !           172:      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        !           173:      2,     2,     2,    12,     2,    30,     2,     2,     2,     2,
        !           174:      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        !           175:      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        !           176:      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        !           177:      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        !           178:      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        !           179:      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        !           180:      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        !           181:      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        !           182:      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        !           183:      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        !           184:      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        !           185:      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        !           186:      2,     2,     2,     2,     2,     1,     2,     3,     4,     5,
        !           187:      6,    10,    11,    15,    16,    19,    20,    21,    22,    28
        !           188: };
        !           189: 
        !           190: static const short yyprhs[] = {     0,
        !           191:      0,     2,     4,     8,    11,    14,    17,    20,    23,    24,
        !           192:     31,    35,    39,    43,    47,    51,    55,    59,    63,    67,
        !           193:     71,    75,    79,    83,    87,    91,    95,    99,   103,   107,
        !           194:    113,   115,   117,   119,   120,   125
        !           195: };
        !           196: 
        !           197: static const short yyrhs[] = {    35,
        !           198:      0,    36,     0,    35,     9,    36,     0,    24,    36,     0,
        !           199:     29,    36,     0,    23,    36,     0,    30,    36,     0,    31,
        !           200:      5,     0,     0,    31,     5,    37,    32,    38,    33,     0,
        !           201:     32,    35,    33,     0,    36,    25,    36,     0,    36,    26,
        !           202:     36,     0,    36,    27,    36,     0,    36,    23,    36,     0,
        !           203:     36,    24,    36,     0,    36,    21,    36,     0,    36,    22,
        !           204:     36,     0,    36,    15,    36,     0,    36,    16,    36,     0,
        !           205:     36,    19,    36,     0,    36,    20,    36,     0,    36,    17,
        !           206:     36,     0,    36,    18,    36,     0,    36,    14,    36,     0,
        !           207:     36,    13,    36,     0,    36,    12,    36,     0,    36,    11,
        !           208:     36,     0,    36,    10,    36,     0,    36,     7,    36,     8,
        !           209:     36,     0,     3,     0,     4,     0,     5,     0,     0,    32,
        !           210:     38,    33,    38,     0,     5,    38,     0
        !           211: };
        !           212: 
        !           213: #if YYDEBUG != 0
        !           214: static const short yyrline[] = { 0,
        !           215:    159,   164,   165,   172,   177,   180,   182,   185,   189,   191,
        !           216:    196,   201,   213,   228,   239,   246,   253,   259,   265,   268,
        !           217:    271,   277,   283,   289,   295,   298,   301,   304,   307,   310,
        !           218:    313,   315,   317,   322,   324,   337
        !           219: };
        !           220: 
        !           221: static const char * const yytname[] = {   "$","error","$illegal.","INT","CHAR",
        !           222: "NAME","ERROR","'?'","':'","','","OR","AND","'|'","'^'","'&'","EQUAL","NOTEQUAL",
        !           223: "'<'","'>'","LEQ","GEQ","LSH","RSH","'+'","'-'","'*'","'/'","'%'","UNARY","'!'",
        !           224: "'~'","'#'","'('","')'","start","exp1","exp","@1","keywords",""
        !           225: };
        !           226: #endif
        !           227: 
        !           228: static const short yyr1[] = {     0,
        !           229:     34,    35,    35,    36,    36,    36,    36,    36,    37,    36,
        !           230:     36,    36,    36,    36,    36,    36,    36,    36,    36,    36,
        !           231:     36,    36,    36,    36,    36,    36,    36,    36,    36,    36,
        !           232:     36,    36,    36,    38,    38,    38
        !           233: };
        !           234: 
        !           235: static const short yyr2[] = {     0,
        !           236:      1,     1,     3,     2,     2,     2,     2,     2,     0,     6,
        !           237:      3,     3,     3,     3,     3,     3,     3,     3,     3,     3,
        !           238:      3,     3,     3,     3,     3,     3,     3,     3,     3,     5,
        !           239:      1,     1,     1,     0,     4,     2
        !           240: };
        !           241: 
        !           242: static const short yydefact[] = {     0,
        !           243:     31,    32,    33,     0,     0,     0,     0,     0,     0,     1,
        !           244:      2,     6,     4,     5,     7,     8,     0,     0,     0,     0,
        !           245:      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        !           246:      0,     0,     0,     0,     0,     0,     0,     0,    11,     3,
        !           247:      0,    29,    28,    27,    26,    25,    19,    20,    23,    24,
        !           248:     21,    22,    17,    18,    15,    16,    12,    13,    14,    34,
        !           249:      0,    34,    34,     0,    30,    36,     0,    10,    34,    35,
        !           250:      0,     0,     0
        !           251: };
        !           252: 
        !           253: static const short yydefgoto[] = {    71,
        !           254:     10,    11,    38,    64
        !           255: };
        !           256: 
        !           257: static const short yypact[] = {    31,
        !           258: -32768,-32768,-32768,    31,    31,    31,    31,     4,    31,     3,
        !           259:     80,-32768,-32768,-32768,-32768,     6,    32,    31,    31,    31,
        !           260:     31,    31,    31,    31,    31,    31,    31,    31,    31,    31,
        !           261:     31,    31,    31,    31,    31,    31,    31,     7,-32768,    80,
        !           262:     59,    97,   113,   128,   142,   155,    25,    25,   162,   162,
        !           263:    162,   162,   167,   167,   -19,   -19,-32768,-32768,-32768,     5,
        !           264:     31,     5,     5,   -20,    80,-32768,    20,-32768,     5,-32768,
        !           265:     40,    56,-32768
        !           266: };
        !           267: 
        !           268: static const short yypgoto[] = {-32768,
        !           269:     49,    -4,-32768,   -58
        !           270: };
        !           271: 
        !           272: 
        !           273: #define        YYLAST          194
        !           274: 
        !           275: 
        !           276: static const short yytable[] = {    12,
        !           277:     13,    14,    15,    66,    67,    35,    36,    37,    16,    62,
        !           278:     70,    18,    68,    40,    41,    42,    43,    44,    45,    46,
        !           279:     47,    48,    49,    50,    51,    52,    53,    54,    55,    56,
        !           280:     57,    58,    59,     1,     2,     3,    63,    -9,    60,    72,
        !           281:     18,    27,    28,    29,    30,    31,    32,    33,    34,    35,
        !           282:     36,    37,    69,     4,     5,    73,    65,    17,     0,     6,
        !           283:      7,     8,     9,     0,    39,    19,    61,     0,    20,    21,
        !           284:     22,    23,    24,    25,    26,    27,    28,    29,    30,    31,
        !           285:     32,    33,    34,    35,    36,    37,    19,     0,     0,    20,
        !           286:     21,    22,    23,    24,    25,    26,    27,    28,    29,    30,
        !           287:     31,    32,    33,    34,    35,    36,    37,    21,    22,    23,
        !           288:     24,    25,    26,    27,    28,    29,    30,    31,    32,    33,
        !           289:     34,    35,    36,    37,    22,    23,    24,    25,    26,    27,
        !           290:     28,    29,    30,    31,    32,    33,    34,    35,    36,    37,
        !           291:     23,    24,    25,    26,    27,    28,    29,    30,    31,    32,
        !           292:     33,    34,    35,    36,    37,    24,    25,    26,    27,    28,
        !           293:     29,    30,    31,    32,    33,    34,    35,    36,    37,    25,
        !           294:     26,    27,    28,    29,    30,    31,    32,    33,    34,    35,
        !           295:     36,    37,    31,    32,    33,    34,    35,    36,    37,    33,
        !           296:     34,    35,    36,    37
        !           297: };
        !           298: 
        !           299: static const short yycheck[] = {     4,
        !           300:      5,     6,     7,    62,    63,    25,    26,    27,     5,     5,
        !           301:     69,     9,    33,    18,    19,    20,    21,    22,    23,    24,
        !           302:     25,    26,    27,    28,    29,    30,    31,    32,    33,    34,
        !           303:     35,    36,    37,     3,     4,     5,    32,    32,    32,     0,
        !           304:      9,    17,    18,    19,    20,    21,    22,    23,    24,    25,
        !           305:     26,    27,    33,    23,    24,     0,    61,     9,    -1,    29,
        !           306:     30,    31,    32,    -1,    33,     7,     8,    -1,    10,    11,
        !           307:     12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
        !           308:     22,    23,    24,    25,    26,    27,     7,    -1,    -1,    10,
        !           309:     11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
        !           310:     21,    22,    23,    24,    25,    26,    27,    11,    12,    13,
        !           311:     14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
        !           312:     24,    25,    26,    27,    12,    13,    14,    15,    16,    17,
        !           313:     18,    19,    20,    21,    22,    23,    24,    25,    26,    27,
        !           314:     13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
        !           315:     23,    24,    25,    26,    27,    14,    15,    16,    17,    18,
        !           316:     19,    20,    21,    22,    23,    24,    25,    26,    27,    15,
        !           317:     16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
        !           318:     26,    27,    21,    22,    23,    24,    25,    26,    27,    23,
        !           319:     24,    25,    26,    27
        !           320: };
        !           321: /* -*-C-*-  Note some compilers choke on comments on `#line' lines.  */
        !           322: #line 3 "bison.simple"
        !           323: 
        !           324: /* Skeleton output parser for bison,
        !           325:    Copyright (C) 1984, 1989, 1990 Bob Corbett and Richard Stallman
        !           326: 
        !           327:    This program is free software; you can redistribute it and/or modify
        !           328:    it under the terms of the GNU General Public License as published by
        !           329:    the Free Software Foundation; either version 1, or (at your option)
        !           330:    any later version.
        !           331: 
        !           332:    This program is distributed in the hope that it will be useful,
        !           333:    but WITHOUT ANY WARRANTY; without even the implied warranty of
        !           334:    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
        !           335:    GNU General Public License for more details.
        !           336: 
        !           337:    You should have received a copy of the GNU General Public License
        !           338:    along with this program; if not, write to the Free Software
        !           339:    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
        !           340: 
        !           341: 
        !           342: #ifndef alloca
        !           343: #ifdef __GNUC__
        !           344: #define alloca __builtin_alloca
        !           345: #else /* not GNU C.  */
        !           346: #if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__)
        !           347: #include <alloca.h>
        !           348: #else /* not sparc */
        !           349: #if defined (MSDOS) && !defined (__TURBOC__)
        !           350: #include <malloc.h>
        !           351: #else /* not MSDOS, or __TURBOC__ */
        !           352: #if defined(_AIX)
        !           353: #include <malloc.h>
        !           354:  #pragma alloca
        !           355: #endif /* not _AIX */
        !           356: #endif /* not MSDOS, or __TURBOC__ */
        !           357: #endif /* not sparc.  */
        !           358: #endif /* not GNU C.  */
        !           359: #endif /* alloca not defined.  */
        !           360: 
        !           361: /* This is the parser code that is written into each bison parser
        !           362:   when the %semantic_parser declaration is not specified in the grammar.
        !           363:   It was written by Richard Stallman by simplifying the hairy parser
        !           364:   used when %semantic_parser is specified.  */
        !           365: 
        !           366: /* Note: there must be only one dollar sign in this file.
        !           367:    It is replaced by the list of actions, each action
        !           368:    as one case of the switch.  */
        !           369: 
        !           370: #define yyerrok                (yyerrstatus = 0)
        !           371: #define yyclearin      (yychar = YYEMPTY)
        !           372: #define YYEMPTY                -2
        !           373: #define YYEOF          0
        !           374: #define YYACCEPT       return(0)
        !           375: #define YYABORT        return(1)
        !           376: #define YYERROR                goto yyerrlab1
        !           377: /* Like YYERROR except do call yyerror.
        !           378:    This remains here temporarily to ease the
        !           379:    transition to the new meaning of YYERROR, for GCC.
        !           380:    Once GCC version 2 has supplanted version 1, this can go.  */
        !           381: #define YYFAIL         goto yyerrlab
        !           382: #define YYRECOVERING()  (!!yyerrstatus)
        !           383: #define YYBACKUP(token, value) \
        !           384: do                                                             \
        !           385:   if (yychar == YYEMPTY && yylen == 1)                         \
        !           386:     { yychar = (token), yylval = (value);                      \
        !           387:       yychar1 = YYTRANSLATE (yychar);                          \
        !           388:       YYPOPSTACK;                                              \
        !           389:       goto yybackup;                                           \
        !           390:     }                                                          \
        !           391:   else                                                         \
        !           392:     { yyerror ("syntax error: cannot back up"); YYERROR; }     \
        !           393: while (0)
        !           394: 
        !           395: #define YYTERROR       1
        !           396: #define YYERRCODE      256
        !           397: 
        !           398: #ifndef YYPURE
        !           399: #define YYLEX          yylex()
        !           400: #endif
        !           401: 
        !           402: #ifdef YYPURE
        !           403: #ifdef YYLSP_NEEDED
        !           404: #define YYLEX          yylex(&yylval, &yylloc)
        !           405: #else
        !           406: #define YYLEX          yylex(&yylval)
        !           407: #endif
        !           408: #endif
        !           409: 
        !           410: /* If nonreentrant, generate the variables here */
        !           411: 
        !           412: #ifndef YYPURE
        !           413: 
        !           414: int    yychar;                 /*  the lookahead symbol                */
        !           415: YYSTYPE        yylval;                 /*  the semantic value of the           */
        !           416:                                /*  lookahead symbol                    */
        !           417: 
        !           418: #ifdef YYLSP_NEEDED
        !           419: YYLTYPE yylloc;                        /*  location data for the lookahead     */
        !           420:                                /*  symbol                              */
        !           421: #endif
        !           422: 
        !           423: int yynerrs;                   /*  number of parse errors so far       */
        !           424: #endif  /* not YYPURE */
        !           425: 
        !           426: #if YYDEBUG != 0
        !           427: int yydebug;                   /*  nonzero means print parse trace     */
        !           428: /* Since this is uninitialized, it does not stop multiple parsers
        !           429:    from coexisting.  */
        !           430: #endif
        !           431: 
        !           432: /*  YYINITDEPTH indicates the initial size of the parser's stacks      */
        !           433: 
        !           434: #ifndef        YYINITDEPTH
        !           435: #define YYINITDEPTH 200
        !           436: #endif
        !           437: 
        !           438: /*  YYMAXDEPTH is the maximum size the stacks can grow to
        !           439:     (effective only if the built-in stack extension method is used).  */
        !           440: 
        !           441: #if YYMAXDEPTH == 0
        !           442: #undef YYMAXDEPTH
        !           443: #endif
        !           444: 
        !           445: #ifndef YYMAXDEPTH
        !           446: #define YYMAXDEPTH 10000
        !           447: #endif
        !           448: 
        !           449: #if __GNUC__ > 1               /* GNU C and GNU C++ define this.  */
        !           450: #define __yy_bcopy(FROM,TO,COUNT)      __builtin_memcpy(TO,FROM,COUNT)
        !           451: #else                          /* not GNU C or C++ */
        !           452: #ifndef __cplusplus
        !           453: 
        !           454: /* This is the most reliable way to avoid incompatibilities
        !           455:    in available built-in functions on various systems.  */
        !           456: static void
        !           457: __yy_bcopy (from, to, count)
        !           458:      char *from;
        !           459:      char *to;
        !           460:      int count;
        !           461: {
        !           462:   register char *f = from;
        !           463:   register char *t = to;
        !           464:   register int i = count;
        !           465: 
        !           466:   while (i-- > 0)
        !           467:     *t++ = *f++;
        !           468: }
        !           469: 
        !           470: #else /* __cplusplus */
        !           471: 
        !           472: /* This is the most reliable way to avoid incompatibilities
        !           473:    in available built-in functions on various systems.  */
        !           474: static void
        !           475: __yy_bcopy (char *from, char *to, int count)
        !           476: {
        !           477:   register char *f = from;
        !           478:   register char *t = to;
        !           479:   register int i = count;
        !           480: 
        !           481:   while (i-- > 0)
        !           482:     *t++ = *f++;
        !           483: }
        !           484: 
        !           485: #endif
        !           486: #endif
        !           487: 
        !           488: #line 169 "bison.simple"
        !           489: int
        !           490: yyparse()
        !           491: {
        !           492:   register int yystate;
        !           493:   register int yyn;
        !           494:   register short *yyssp;
        !           495:   register YYSTYPE *yyvsp;
        !           496:   int yyerrstatus;     /*  number of tokens to shift before error messages enabled */
        !           497:   int yychar1;         /*  lookahead token as an internal (translated) token number */
        !           498: 
        !           499:   short        yyssa[YYINITDEPTH];     /*  the state stack                     */
        !           500:   YYSTYPE yyvsa[YYINITDEPTH];  /*  the semantic value stack            */
        !           501: 
        !           502:   short *yyss = yyssa;         /*  refer to the stacks thru separate pointers */
        !           503:   YYSTYPE *yyvs = yyvsa;       /*  to allow yyoverflow to reallocate them elsewhere */
        !           504: 
        !           505: #ifdef YYLSP_NEEDED
        !           506:   YYLTYPE yylsa[YYINITDEPTH];  /*  the location stack                  */
        !           507:   YYLTYPE *yyls = yylsa;
        !           508:   YYLTYPE *yylsp;
        !           509: 
        !           510: #define YYPOPSTACK   (yyvsp--, yyssp--, yylsp--)
        !           511: #else
        !           512: #define YYPOPSTACK   (yyvsp--, yyssp--)
        !           513: #endif
        !           514: 
        !           515:   int yystacksize = YYINITDEPTH;
        !           516: 
        !           517: #ifdef YYPURE
        !           518:   int yychar;
        !           519:   YYSTYPE yylval;
        !           520:   int yynerrs;
        !           521: #ifdef YYLSP_NEEDED
        !           522:   YYLTYPE yylloc;
        !           523: #endif
        !           524: #endif
        !           525: 
        !           526:   YYSTYPE yyval;               /*  the variable used to return         */
        !           527:                                /*  semantic values from the action     */
        !           528:                                /*  routines                            */
        !           529: 
        !           530:   int yylen;
        !           531: 
        !           532: #if YYDEBUG != 0
        !           533:   if (yydebug)
        !           534:     fprintf(stderr, "Starting parse\n");
        !           535: #endif
        !           536: 
        !           537:   yystate = 0;
        !           538:   yyerrstatus = 0;
        !           539:   yynerrs = 0;
        !           540:   yychar = YYEMPTY;            /* Cause a token to be read.  */
        !           541: 
        !           542:   /* Initialize stack pointers.
        !           543:      Waste one element of value and location stack
        !           544:      so that they stay on the same level as the state stack.  */
        !           545: 
        !           546:   yyssp = yyss - 1;
        !           547:   yyvsp = yyvs;
        !           548: #ifdef YYLSP_NEEDED
        !           549:   yylsp = yyls;
        !           550: #endif
        !           551: 
        !           552: /* Push a new state, which is found in  yystate  .  */
        !           553: /* In all cases, when you get here, the value and location stacks
        !           554:    have just been pushed. so pushing a state here evens the stacks.  */
        !           555: yynewstate:
        !           556: 
        !           557:   *++yyssp = yystate;
        !           558: 
        !           559:   if (yyssp >= yyss + yystacksize - 1)
        !           560:     {
        !           561:       /* Give user a chance to reallocate the stack */
        !           562:       /* Use copies of these so that the &'s don't force the real ones into memory. */
        !           563:       YYSTYPE *yyvs1 = yyvs;
        !           564:       short *yyss1 = yyss;
        !           565: #ifdef YYLSP_NEEDED
        !           566:       YYLTYPE *yyls1 = yyls;
        !           567: #endif
        !           568: 
        !           569:       /* Get the current used size of the three stacks, in elements.  */
        !           570:       int size = yyssp - yyss + 1;
        !           571: 
        !           572: #ifdef yyoverflow
        !           573:       /* Each stack pointer address is followed by the size of
        !           574:         the data in use in that stack, in bytes.  */
        !           575:       yyoverflow("parser stack overflow",
        !           576:                 &yyss1, size * sizeof (*yyssp),
        !           577:                 &yyvs1, size * sizeof (*yyvsp),
        !           578: #ifdef YYLSP_NEEDED
        !           579:                 &yyls1, size * sizeof (*yylsp),
        !           580: #endif
        !           581:                 &yystacksize);
        !           582: 
        !           583:       yyss = yyss1; yyvs = yyvs1;
        !           584: #ifdef YYLSP_NEEDED
        !           585:       yyls = yyls1;
        !           586: #endif
        !           587: #else /* no yyoverflow */
        !           588:       /* Extend the stack our own way.  */
        !           589:       if (yystacksize >= YYMAXDEPTH)
        !           590:        {
        !           591:          yyerror("parser stack overflow");
        !           592:          return 2;
        !           593:        }
        !           594:       yystacksize *= 2;
        !           595:       if (yystacksize > YYMAXDEPTH)
        !           596:        yystacksize = YYMAXDEPTH;
        !           597:       yyss = (short *) alloca (yystacksize * sizeof (*yyssp));
        !           598:       __yy_bcopy ((char *)yyss1, (char *)yyss, size * sizeof (*yyssp));
        !           599:       yyvs = (YYSTYPE *) alloca (yystacksize * sizeof (*yyvsp));
        !           600:       __yy_bcopy ((char *)yyvs1, (char *)yyvs, size * sizeof (*yyvsp));
        !           601: #ifdef YYLSP_NEEDED
        !           602:       yyls = (YYLTYPE *) alloca (yystacksize * sizeof (*yylsp));
        !           603:       __yy_bcopy ((char *)yyls1, (char *)yyls, size * sizeof (*yylsp));
        !           604: #endif
        !           605: #endif /* no yyoverflow */
        !           606: 
        !           607:       yyssp = yyss + size - 1;
        !           608:       yyvsp = yyvs + size - 1;
        !           609: #ifdef YYLSP_NEEDED
        !           610:       yylsp = yyls + size - 1;
        !           611: #endif
        !           612: 
        !           613: #if YYDEBUG != 0
        !           614:       if (yydebug)
        !           615:        fprintf(stderr, "Stack size increased to %d\n", yystacksize);
        !           616: #endif
        !           617: 
        !           618:       if (yyssp >= yyss + yystacksize - 1)
        !           619:        YYABORT;
        !           620:     }
        !           621: 
        !           622: #if YYDEBUG != 0
        !           623:   if (yydebug)
        !           624:     fprintf(stderr, "Entering state %d\n", yystate);
        !           625: #endif
        !           626: 
        !           627:  yybackup:
        !           628: 
        !           629: /* Do appropriate processing given the current state.  */
        !           630: /* Read a lookahead token if we need one and don't already have one.  */
        !           631: /* yyresume: */
        !           632: 
        !           633:   /* First try to decide what to do without reference to lookahead token.  */
        !           634: 
        !           635:   yyn = yypact[yystate];
        !           636:   if (yyn == YYFLAG)
        !           637:     goto yydefault;
        !           638: 
        !           639:   /* Not known => get a lookahead token if don't already have one.  */
        !           640: 
        !           641:   /* yychar is either YYEMPTY or YYEOF
        !           642:      or a valid token in external form.  */
        !           643: 
        !           644:   if (yychar == YYEMPTY)
        !           645:     {
        !           646: #if YYDEBUG != 0
        !           647:       if (yydebug)
        !           648:        fprintf(stderr, "Reading a token: ");
        !           649: #endif
        !           650:       yychar = YYLEX;
        !           651:     }
        !           652: 
        !           653:   /* Convert token to internal form (in yychar1) for indexing tables with */
        !           654: 
        !           655:   if (yychar <= 0)             /* This means end of input. */
        !           656:     {
        !           657:       yychar1 = 0;
        !           658:       yychar = YYEOF;          /* Don't call YYLEX any more */
        !           659: 
        !           660: #if YYDEBUG != 0
        !           661:       if (yydebug)
        !           662:        fprintf(stderr, "Now at end of input.\n");
        !           663: #endif
        !           664:     }
        !           665:   else
        !           666:     {
        !           667:       yychar1 = YYTRANSLATE(yychar);
        !           668: 
        !           669: #if YYDEBUG != 0
        !           670:       if (yydebug)
        !           671:        {
        !           672:          fprintf (stderr, "Next token is %d (%s", yychar, yytname[yychar1]);
        !           673:          /* Give the individual parser a way to print the precise meaning
        !           674:             of a token, for further debugging info.  */
        !           675: #ifdef YYPRINT
        !           676:          YYPRINT (stderr, yychar, yylval);
        !           677: #endif
        !           678:          fprintf (stderr, ")\n");
        !           679:        }
        !           680: #endif
        !           681:     }
        !           682: 
        !           683:   yyn += yychar1;
        !           684:   if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1)
        !           685:     goto yydefault;
        !           686: 
        !           687:   yyn = yytable[yyn];
        !           688: 
        !           689:   /* yyn is what to do for this token type in this state.
        !           690:      Negative => reduce, -yyn is rule number.
        !           691:      Positive => shift, yyn is new state.
        !           692:        New state is final state => don't bother to shift,
        !           693:        just return success.
        !           694:      0, or most negative number => error.  */
        !           695: 
        !           696:   if (yyn < 0)
        !           697:     {
        !           698:       if (yyn == YYFLAG)
        !           699:        goto yyerrlab;
        !           700:       yyn = -yyn;
        !           701:       goto yyreduce;
        !           702:     }
        !           703:   else if (yyn == 0)
        !           704:     goto yyerrlab;
        !           705: 
        !           706:   if (yyn == YYFINAL)
        !           707:     YYACCEPT;
        !           708: 
        !           709:   /* Shift the lookahead token.  */
        !           710: 
        !           711: #if YYDEBUG != 0
        !           712:   if (yydebug)
        !           713:     fprintf(stderr, "Shifting token %d (%s), ", yychar, yytname[yychar1]);
        !           714: #endif
        !           715: 
        !           716:   /* Discard the token being shifted unless it is eof.  */
        !           717:   if (yychar != YYEOF)
        !           718:     yychar = YYEMPTY;
        !           719: 
        !           720:   *++yyvsp = yylval;
        !           721: #ifdef YYLSP_NEEDED
        !           722:   *++yylsp = yylloc;
        !           723: #endif
        !           724: 
        !           725:   /* count tokens shifted since error; after three, turn off error status.  */
        !           726:   if (yyerrstatus) yyerrstatus--;
        !           727: 
        !           728:   yystate = yyn;
        !           729:   goto yynewstate;
        !           730: 
        !           731: /* Do the default action for the current state.  */
        !           732: yydefault:
        !           733: 
        !           734:   yyn = yydefact[yystate];
        !           735:   if (yyn == 0)
        !           736:     goto yyerrlab;
        !           737: 
        !           738: /* Do a reduction.  yyn is the number of a rule to reduce with.  */
        !           739: yyreduce:
        !           740:   yylen = yyr2[yyn];
        !           741:   yyval = yyvsp[1-yylen]; /* implement default value of the action */
        !           742: 
        !           743: #if YYDEBUG != 0
        !           744:   if (yydebug)
        !           745:     {
        !           746:       int i;
        !           747: 
        !           748:       fprintf (stderr, "Reducing via rule %d (line %d), ",
        !           749:               yyn, yyrline[yyn]);
        !           750: 
        !           751:       /* Print the symboles being reduced, and their result.  */
        !           752:       for (i = yyprhs[yyn]; yyrhs[i] > 0; i++)
        !           753:        fprintf (stderr, "%s ", yytname[yyrhs[i]]);
        !           754:       fprintf (stderr, " -> %s\n", yytname[yyr1[yyn]]);
        !           755:     }
        !           756: #endif
        !           757: 
        !           758: 
        !           759:   switch (yyn) {
        !           760: 
        !           761: case 1:
        !           762: #line 160 "cexp.y"
        !           763: { expression_value = yyvsp[0].integer.value; ;
        !           764:     break;}
        !           765: case 3:
        !           766: #line 166 "cexp.y"
        !           767: { if (pedantic)
        !           768:                            pedwarn ("comma operator in operand of `#if'");
        !           769:                          yyval.integer = yyvsp[0].integer; ;
        !           770:     break;}
        !           771: case 4:
        !           772: #line 173 "cexp.y"
        !           773: { yyval.integer.value = - yyvsp[0].integer.value;
        !           774:                          if ((yyval.integer.value & yyvsp[0].integer.value) < 0 && ! yyvsp[0].integer.unsignedp)
        !           775:                            integer_overflow ();
        !           776:                          yyval.integer.unsignedp = yyvsp[0].integer.unsignedp; ;
        !           777:     break;}
        !           778: case 5:
        !           779: #line 178 "cexp.y"
        !           780: { yyval.integer.value = ! yyvsp[0].integer.value;
        !           781:                          yyval.integer.unsignedp = 0; ;
        !           782:     break;}
        !           783: case 6:
        !           784: #line 181 "cexp.y"
        !           785: { yyval.integer = yyvsp[0].integer; ;
        !           786:     break;}
        !           787: case 7:
        !           788: #line 183 "cexp.y"
        !           789: { yyval.integer.value = ~ yyvsp[0].integer.value;
        !           790:                          yyval.integer.unsignedp = yyvsp[0].integer.unsignedp; ;
        !           791:     break;}
        !           792: case 8:
        !           793: #line 186 "cexp.y"
        !           794: { yyval.integer.value = check_assertion (yyvsp[0].name.address, yyvsp[0].name.length,
        !           795:                                                      0, NULL_PTR);
        !           796:                          yyval.integer.unsignedp = 0; ;
        !           797:     break;}
        !           798: case 9:
        !           799: #line 190 "cexp.y"
        !           800: { keyword_parsing = 1; ;
        !           801:     break;}
        !           802: case 10:
        !           803: #line 192 "cexp.y"
        !           804: { yyval.integer.value = check_assertion (yyvsp[-4].name.address, yyvsp[-4].name.length,
        !           805:                                                      1, yyvsp[-1].keywords);
        !           806:                          keyword_parsing = 0;
        !           807:                          yyval.integer.unsignedp = 0; ;
        !           808:     break;}
        !           809: case 11:
        !           810: #line 197 "cexp.y"
        !           811: { yyval.integer = yyvsp[-1].integer; ;
        !           812:     break;}
        !           813: case 12:
        !           814: #line 202 "cexp.y"
        !           815: { yyval.integer.unsignedp = yyvsp[-2].integer.unsignedp || yyvsp[0].integer.unsignedp;
        !           816:                          if (yyval.integer.unsignedp)
        !           817:                            yyval.integer.value = (unsigned long) yyvsp[-2].integer.value * yyvsp[0].integer.value;
        !           818:                          else
        !           819:                            {
        !           820:                              yyval.integer.value = yyvsp[-2].integer.value * yyvsp[0].integer.value;
        !           821:                              if (yyvsp[-2].integer.value
        !           822:                                  && (yyval.integer.value / yyvsp[-2].integer.value != yyvsp[0].integer.value
        !           823:                                      || (yyval.integer.value & yyvsp[-2].integer.value & yyvsp[0].integer.value) < 0))
        !           824:                                integer_overflow ();
        !           825:                            } ;
        !           826:     break;}
        !           827: case 13:
        !           828: #line 214 "cexp.y"
        !           829: { if (yyvsp[0].integer.value == 0)
        !           830:                            {
        !           831:                              error ("division by zero in #if");
        !           832:                              yyvsp[0].integer.value = 1;
        !           833:                            }
        !           834:                          yyval.integer.unsignedp = yyvsp[-2].integer.unsignedp || yyvsp[0].integer.unsignedp;
        !           835:                          if (yyval.integer.unsignedp)
        !           836:                            yyval.integer.value = (unsigned long) yyvsp[-2].integer.value / yyvsp[0].integer.value;
        !           837:                          else
        !           838:                            {
        !           839:                              yyval.integer.value = yyvsp[-2].integer.value / yyvsp[0].integer.value;
        !           840:                              if ((yyval.integer.value & yyvsp[-2].integer.value & yyvsp[0].integer.value) < 0)
        !           841:                                integer_overflow ();
        !           842:                            } ;
        !           843:     break;}
        !           844: case 14:
        !           845: #line 229 "cexp.y"
        !           846: { if (yyvsp[0].integer.value == 0)
        !           847:                            {
        !           848:                              error ("division by zero in #if");
        !           849:                              yyvsp[0].integer.value = 1;
        !           850:                            }
        !           851:                          yyval.integer.unsignedp = yyvsp[-2].integer.unsignedp || yyvsp[0].integer.unsignedp;
        !           852:                          if (yyval.integer.unsignedp)
        !           853:                            yyval.integer.value = (unsigned long) yyvsp[-2].integer.value % yyvsp[0].integer.value;
        !           854:                          else
        !           855:                            yyval.integer.value = yyvsp[-2].integer.value % yyvsp[0].integer.value; ;
        !           856:     break;}
        !           857: case 15:
        !           858: #line 240 "cexp.y"
        !           859: { yyval.integer.value = yyvsp[-2].integer.value + yyvsp[0].integer.value;
        !           860:                          yyval.integer.unsignedp = yyvsp[-2].integer.unsignedp || yyvsp[0].integer.unsignedp;
        !           861:                          if (! yyval.integer.unsignedp
        !           862:                              && ! possible_sum_sign (yyvsp[-2].integer.value, yyvsp[0].integer.value,
        !           863:                                                      yyval.integer.value))
        !           864:                            integer_overflow (); ;
        !           865:     break;}
        !           866: case 16:
        !           867: #line 247 "cexp.y"
        !           868: { yyval.integer.value = yyvsp[-2].integer.value - yyvsp[0].integer.value;
        !           869:                          yyval.integer.unsignedp = yyvsp[-2].integer.unsignedp || yyvsp[0].integer.unsignedp;
        !           870:                          if (! yyval.integer.unsignedp
        !           871:                              && ! possible_sum_sign (yyval.integer.value, yyvsp[0].integer.value,
        !           872:                                                      yyvsp[-2].integer.value))
        !           873:                            integer_overflow (); ;
        !           874:     break;}
        !           875: case 17:
        !           876: #line 254 "cexp.y"
        !           877: { yyval.integer.unsignedp = yyvsp[-2].integer.unsignedp;
        !           878:                          if (yyvsp[0].integer.value < 0 && ! yyvsp[0].integer.unsignedp)
        !           879:                            yyval.integer.value = right_shift (&yyvsp[-2].integer, -yyvsp[0].integer.value);
        !           880:                          else
        !           881:                            yyval.integer.value = left_shift (&yyvsp[-2].integer, yyvsp[0].integer.value); ;
        !           882:     break;}
        !           883: case 18:
        !           884: #line 260 "cexp.y"
        !           885: { yyval.integer.unsignedp = yyvsp[-2].integer.unsignedp;
        !           886:                          if (yyvsp[0].integer.value < 0 && ! yyvsp[0].integer.unsignedp)
        !           887:                            yyval.integer.value = left_shift (&yyvsp[-2].integer, -yyvsp[0].integer.value);
        !           888:                          else
        !           889:                            yyval.integer.value = right_shift (&yyvsp[-2].integer, yyvsp[0].integer.value); ;
        !           890:     break;}
        !           891: case 19:
        !           892: #line 266 "cexp.y"
        !           893: { yyval.integer.value = (yyvsp[-2].integer.value == yyvsp[0].integer.value);
        !           894:                          yyval.integer.unsignedp = 0; ;
        !           895:     break;}
        !           896: case 20:
        !           897: #line 269 "cexp.y"
        !           898: { yyval.integer.value = (yyvsp[-2].integer.value != yyvsp[0].integer.value);
        !           899:                          yyval.integer.unsignedp = 0; ;
        !           900:     break;}
        !           901: case 21:
        !           902: #line 272 "cexp.y"
        !           903: { yyval.integer.unsignedp = 0;
        !           904:                          if (yyvsp[-2].integer.unsignedp || yyvsp[0].integer.unsignedp)
        !           905:                            yyval.integer.value = (unsigned long) yyvsp[-2].integer.value <= yyvsp[0].integer.value;
        !           906:                          else
        !           907:                            yyval.integer.value = yyvsp[-2].integer.value <= yyvsp[0].integer.value; ;
        !           908:     break;}
        !           909: case 22:
        !           910: #line 278 "cexp.y"
        !           911: { yyval.integer.unsignedp = 0;
        !           912:                          if (yyvsp[-2].integer.unsignedp || yyvsp[0].integer.unsignedp)
        !           913:                            yyval.integer.value = (unsigned long) yyvsp[-2].integer.value >= yyvsp[0].integer.value;
        !           914:                          else
        !           915:                            yyval.integer.value = yyvsp[-2].integer.value >= yyvsp[0].integer.value; ;
        !           916:     break;}
        !           917: case 23:
        !           918: #line 284 "cexp.y"
        !           919: { yyval.integer.unsignedp = 0;
        !           920:                          if (yyvsp[-2].integer.unsignedp || yyvsp[0].integer.unsignedp)
        !           921:                            yyval.integer.value = (unsigned long) yyvsp[-2].integer.value < yyvsp[0].integer.value;
        !           922:                          else
        !           923:                            yyval.integer.value = yyvsp[-2].integer.value < yyvsp[0].integer.value; ;
        !           924:     break;}
        !           925: case 24:
        !           926: #line 290 "cexp.y"
        !           927: { yyval.integer.unsignedp = 0;
        !           928:                          if (yyvsp[-2].integer.unsignedp || yyvsp[0].integer.unsignedp)
        !           929:                            yyval.integer.value = (unsigned long) yyvsp[-2].integer.value > yyvsp[0].integer.value;
        !           930:                          else
        !           931:                            yyval.integer.value = yyvsp[-2].integer.value > yyvsp[0].integer.value; ;
        !           932:     break;}
        !           933: case 25:
        !           934: #line 296 "cexp.y"
        !           935: { yyval.integer.value = yyvsp[-2].integer.value & yyvsp[0].integer.value;
        !           936:                          yyval.integer.unsignedp = yyvsp[-2].integer.unsignedp || yyvsp[0].integer.unsignedp; ;
        !           937:     break;}
        !           938: case 26:
        !           939: #line 299 "cexp.y"
        !           940: { yyval.integer.value = yyvsp[-2].integer.value ^ yyvsp[0].integer.value;
        !           941:                          yyval.integer.unsignedp = yyvsp[-2].integer.unsignedp || yyvsp[0].integer.unsignedp; ;
        !           942:     break;}
        !           943: case 27:
        !           944: #line 302 "cexp.y"
        !           945: { yyval.integer.value = yyvsp[-2].integer.value | yyvsp[0].integer.value;
        !           946:                          yyval.integer.unsignedp = yyvsp[-2].integer.unsignedp || yyvsp[0].integer.unsignedp; ;
        !           947:     break;}
        !           948: case 28:
        !           949: #line 305 "cexp.y"
        !           950: { yyval.integer.value = (yyvsp[-2].integer.value && yyvsp[0].integer.value);
        !           951:                          yyval.integer.unsignedp = 0; ;
        !           952:     break;}
        !           953: case 29:
        !           954: #line 308 "cexp.y"
        !           955: { yyval.integer.value = (yyvsp[-2].integer.value || yyvsp[0].integer.value);
        !           956:                          yyval.integer.unsignedp = 0; ;
        !           957:     break;}
        !           958: case 30:
        !           959: #line 311 "cexp.y"
        !           960: { yyval.integer.value = yyvsp[-4].integer.value ? yyvsp[-2].integer.value : yyvsp[0].integer.value;
        !           961:                          yyval.integer.unsignedp = yyvsp[-2].integer.unsignedp || yyvsp[0].integer.unsignedp; ;
        !           962:     break;}
        !           963: case 31:
        !           964: #line 314 "cexp.y"
        !           965: { yyval.integer = yylval.integer; ;
        !           966:     break;}
        !           967: case 32:
        !           968: #line 316 "cexp.y"
        !           969: { yyval.integer = yylval.integer; ;
        !           970:     break;}
        !           971: case 33:
        !           972: #line 318 "cexp.y"
        !           973: { yyval.integer.value = 0;
        !           974:                          yyval.integer.unsignedp = 0; ;
        !           975:     break;}
        !           976: case 34:
        !           977: #line 323 "cexp.y"
        !           978: { yyval.keywords = 0; ;
        !           979:     break;}
        !           980: case 35:
        !           981: #line 325 "cexp.y"
        !           982: { struct arglist *temp;
        !           983:                          yyval.keywords = (struct arglist *) xmalloc (sizeof (struct arglist));
        !           984:                          yyval.keywords->next = yyvsp[-2].keywords;
        !           985:                          yyval.keywords->name = (U_CHAR *) "(";
        !           986:                          yyval.keywords->length = 1;
        !           987:                          temp = yyval.keywords;
        !           988:                          while (temp != 0 && temp->next != 0)
        !           989:                            temp = temp->next;
        !           990:                          temp->next = (struct arglist *) xmalloc (sizeof (struct arglist));
        !           991:                          temp->next->next = yyvsp[0].keywords;
        !           992:                          temp->next->name = (U_CHAR *) ")";
        !           993:                          temp->next->length = 1; ;
        !           994:     break;}
        !           995: case 36:
        !           996: #line 338 "cexp.y"
        !           997: { yyval.keywords = (struct arglist *) xmalloc (sizeof (struct arglist));
        !           998:                          yyval.keywords->name = yyvsp[-1].name.address;
        !           999:                          yyval.keywords->length = yyvsp[-1].name.length;
        !          1000:                          yyval.keywords->next = yyvsp[0].keywords; ;
        !          1001:     break;}
        !          1002: }
        !          1003:    /* the action file gets copied in in place of this dollarsign */
        !          1004: #line 440 "bison.simple"
        !          1005: 
        !          1006:   yyvsp -= yylen;
        !          1007:   yyssp -= yylen;
        !          1008: #ifdef YYLSP_NEEDED
        !          1009:   yylsp -= yylen;
        !          1010: #endif
        !          1011: 
        !          1012: #if YYDEBUG != 0
        !          1013:   if (yydebug)
        !          1014:     {
        !          1015:       short *ssp1 = yyss - 1;
        !          1016:       fprintf (stderr, "state stack now");
        !          1017:       while (ssp1 != yyssp)
        !          1018:        fprintf (stderr, " %d", *++ssp1);
        !          1019:       fprintf (stderr, "\n");
        !          1020:     }
        !          1021: #endif
        !          1022: 
        !          1023:   *++yyvsp = yyval;
        !          1024: 
        !          1025: #ifdef YYLSP_NEEDED
        !          1026:   yylsp++;
        !          1027:   if (yylen == 0)
        !          1028:     {
        !          1029:       yylsp->first_line = yylloc.first_line;
        !          1030:       yylsp->first_column = yylloc.first_column;
        !          1031:       yylsp->last_line = (yylsp-1)->last_line;
        !          1032:       yylsp->last_column = (yylsp-1)->last_column;
        !          1033:       yylsp->text = 0;
        !          1034:     }
        !          1035:   else
        !          1036:     {
        !          1037:       yylsp->last_line = (yylsp+yylen-1)->last_line;
        !          1038:       yylsp->last_column = (yylsp+yylen-1)->last_column;
        !          1039:     }
        !          1040: #endif
        !          1041: 
        !          1042:   /* Now "shift" the result of the reduction.
        !          1043:      Determine what state that goes to,
        !          1044:      based on the state we popped back to
        !          1045:      and the rule number reduced by.  */
        !          1046: 
        !          1047:   yyn = yyr1[yyn];
        !          1048: 
        !          1049:   yystate = yypgoto[yyn - YYNTBASE] + *yyssp;
        !          1050:   if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp)
        !          1051:     yystate = yytable[yystate];
        !          1052:   else
        !          1053:     yystate = yydefgoto[yyn - YYNTBASE];
        !          1054: 
        !          1055:   goto yynewstate;
        !          1056: 
        !          1057: yyerrlab:   /* here on detecting error */
        !          1058: 
        !          1059:   if (! yyerrstatus)
        !          1060:     /* If not already recovering from an error, report this error.  */
        !          1061:     {
        !          1062:       ++yynerrs;
        !          1063: 
        !          1064: #ifdef YYERROR_VERBOSE
        !          1065:       yyn = yypact[yystate];
        !          1066: 
        !          1067:       if (yyn > YYFLAG && yyn < YYLAST)
        !          1068:        {
        !          1069:          int size = 0;
        !          1070:          char *msg;
        !          1071:          int x, count;
        !          1072: 
        !          1073:          count = 0;
        !          1074:          for (x = 0; x < (sizeof(yytname) / sizeof(char *)); x++)
        !          1075:            if (yycheck[x + yyn] == x)
        !          1076:              size += strlen(yytname[x]) + 15, count++;
        !          1077:          msg = (char *) malloc(size + 15);
        !          1078:          if (msg != 0)
        !          1079:            {
        !          1080:              strcpy(msg, "parse error");
        !          1081: 
        !          1082:              if (count < 5)
        !          1083:                {
        !          1084:                  count = 0;
        !          1085:                  for (x = 0; x < (sizeof(yytname) / sizeof(char *)); x++)
        !          1086:                    if (yycheck[x + yyn] == x)
        !          1087:                      {
        !          1088:                        strcat(msg, count == 0 ? ", expecting `" : " or `");
        !          1089:                        strcat(msg, yytname[x]);
        !          1090:                        strcat(msg, "'");
        !          1091:                        count++;
        !          1092:                      }
        !          1093:                }
        !          1094:              yyerror(msg);
        !          1095:              free(msg);
        !          1096:            }
        !          1097:          else
        !          1098:            yyerror ("parse error; also virtual memory exceeded");
        !          1099:        }
        !          1100:       else
        !          1101: #endif /* YYERROR_VERBOSE */
        !          1102:        yyerror("parse error");
        !          1103:     }
        !          1104: 
        !          1105: yyerrlab1:   /* here on error raised explicitly by an action */
        !          1106: 
        !          1107:   if (yyerrstatus == 3)
        !          1108:     {
        !          1109:       /* if just tried and failed to reuse lookahead token after an error, discard it.  */
        !          1110: 
        !          1111:       /* return failure if at end of input */
        !          1112:       if (yychar == YYEOF)
        !          1113:        YYABORT;
        !          1114: 
        !          1115: #if YYDEBUG != 0
        !          1116:       if (yydebug)
        !          1117:        fprintf(stderr, "Discarding token %d (%s).\n", yychar, yytname[yychar1]);
        !          1118: #endif
        !          1119: 
        !          1120:       yychar = YYEMPTY;
        !          1121:     }
        !          1122: 
        !          1123:   /* Else will try to reuse lookahead token
        !          1124:      after shifting the error token.  */
        !          1125: 
        !          1126:   yyerrstatus = 3;             /* Each real token shifted decrements this */
        !          1127: 
        !          1128:   goto yyerrhandle;
        !          1129: 
        !          1130: yyerrdefault:  /* current state does not do anything special for the error token. */
        !          1131: 
        !          1132: #if 0
        !          1133:   /* This is wrong; only states that explicitly want error tokens
        !          1134:      should shift them.  */
        !          1135:   yyn = yydefact[yystate];  /* If its default is to accept any token, ok.  Otherwise pop it.*/
        !          1136:   if (yyn) goto yydefault;
        !          1137: #endif
        !          1138: 
        !          1139: yyerrpop:   /* pop the current state because it cannot handle the error token */
        !          1140: 
        !          1141:   if (yyssp == yyss) YYABORT;
        !          1142:   yyvsp--;
        !          1143:   yystate = *--yyssp;
        !          1144: #ifdef YYLSP_NEEDED
        !          1145:   yylsp--;
        !          1146: #endif
        !          1147: 
        !          1148: #if YYDEBUG != 0
        !          1149:   if (yydebug)
        !          1150:     {
        !          1151:       short *ssp1 = yyss - 1;
        !          1152:       fprintf (stderr, "Error: state stack now");
        !          1153:       while (ssp1 != yyssp)
        !          1154:        fprintf (stderr, " %d", *++ssp1);
        !          1155:       fprintf (stderr, "\n");
        !          1156:     }
        !          1157: #endif
        !          1158: 
        !          1159: yyerrhandle:
        !          1160: 
        !          1161:   yyn = yypact[yystate];
        !          1162:   if (yyn == YYFLAG)
        !          1163:     goto yyerrdefault;
        !          1164: 
        !          1165:   yyn += YYTERROR;
        !          1166:   if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR)
        !          1167:     goto yyerrdefault;
        !          1168: 
        !          1169:   yyn = yytable[yyn];
        !          1170:   if (yyn < 0)
        !          1171:     {
        !          1172:       if (yyn == YYFLAG)
        !          1173:        goto yyerrpop;
        !          1174:       yyn = -yyn;
        !          1175:       goto yyreduce;
        !          1176:     }
        !          1177:   else if (yyn == 0)
        !          1178:     goto yyerrpop;
        !          1179: 
        !          1180:   if (yyn == YYFINAL)
        !          1181:     YYACCEPT;
        !          1182: 
        !          1183: #if YYDEBUG != 0
        !          1184:   if (yydebug)
        !          1185:     fprintf(stderr, "Shifting error token, ");
        !          1186: #endif
        !          1187: 
        !          1188:   *++yyvsp = yylval;
        !          1189: #ifdef YYLSP_NEEDED
        !          1190:   *++yylsp = yylloc;
        !          1191: #endif
        !          1192: 
        !          1193:   yystate = yyn;
        !          1194:   goto yynewstate;
        !          1195: }
        !          1196: #line 343 "cexp.y"
        !          1197: 
        !          1198: 
        !          1199: /* During parsing of a C expression, the pointer to the next character
        !          1200:    is in this variable.  */
        !          1201: 
        !          1202: static char *lexptr;
        !          1203: 
        !          1204: /* Take care of parsing a number (anything that starts with a digit).
        !          1205:    Set yylval and return the token type; update lexptr.
        !          1206:    LEN is the number of characters in it.  */
        !          1207: 
        !          1208: /* maybe needs to actually deal with floating point numbers */
        !          1209: 
        !          1210: int
        !          1211: parse_number (olen)
        !          1212:      int olen;
        !          1213: {
        !          1214:   register char *p = lexptr;
        !          1215:   register int c;
        !          1216:   register unsigned long n = 0, nd, ULONG_MAX_over_base;
        !          1217:   register int base = 10;
        !          1218:   register int len = olen;
        !          1219:   register int overflow = 0;
        !          1220:   register int digit, largest_digit = 0;
        !          1221:   int spec_long = 0;
        !          1222: 
        !          1223:   for (c = 0; c < len; c++)
        !          1224:     if (p[c] == '.') {
        !          1225:       /* It's a float since it contains a point.  */
        !          1226:       yyerror ("floating point numbers not allowed in #if expressions");
        !          1227:       return ERROR;
        !          1228:     }
        !          1229: 
        !          1230:   yylval.integer.unsignedp = 0;
        !          1231: 
        !          1232:   if (len >= 3 && (!strncmp (p, "0x", 2) || !strncmp (p, "0X", 2))) {
        !          1233:     p += 2;
        !          1234:     base = 16;
        !          1235:     len -= 2;
        !          1236:   }
        !          1237:   else if (*p == '0')
        !          1238:     base = 8;
        !          1239: 
        !          1240:   ULONG_MAX_over_base = (unsigned long) -1 / base;
        !          1241: 
        !          1242:   for (; len > 0; len--) {
        !          1243:     c = *p++;
        !          1244: 
        !          1245:     if (c >= '0' && c <= '9')
        !          1246:       digit = c - '0';
        !          1247:     else if (base == 16 && c >= 'a' && c <= 'f')
        !          1248:       digit = c - 'a' + 10;
        !          1249:     else if (base == 16 && c >= 'A' && c <= 'F')
        !          1250:       digit = c - 'A' + 10;
        !          1251:     else {
        !          1252:       /* `l' means long, and `u' means unsigned.  */
        !          1253:       while (1) {
        !          1254:        if (c == 'l' || c == 'L')
        !          1255:          {
        !          1256:            if (spec_long)
        !          1257:              yyerror ("two `l's in integer constant");
        !          1258:            spec_long = 1;
        !          1259:          }
        !          1260:        else if (c == 'u' || c == 'U')
        !          1261:          {
        !          1262:            if (yylval.integer.unsignedp)
        !          1263:              yyerror ("two `u's in integer constant");
        !          1264:            yylval.integer.unsignedp = 1;
        !          1265:          }
        !          1266:        else
        !          1267:          break;
        !          1268: 
        !          1269:        if (--len == 0)
        !          1270:          break;
        !          1271:        c = *p++;
        !          1272:       }
        !          1273:       /* Don't look for any more digits after the suffixes.  */
        !          1274:       break;
        !          1275:     }
        !          1276:     if (largest_digit < digit)
        !          1277:       largest_digit = digit;
        !          1278:     nd = n * base + digit;
        !          1279:     overflow |= ULONG_MAX_over_base < n | nd < n;
        !          1280:     n = nd;
        !          1281:   }
        !          1282: 
        !          1283:   if (len != 0) {
        !          1284:     yyerror ("Invalid number in #if expression");
        !          1285:     return ERROR;
        !          1286:   }
        !          1287: 
        !          1288:   if (base <= largest_digit)
        !          1289:     warning ("integer constant contains digits beyond the radix");
        !          1290: 
        !          1291:   if (overflow)
        !          1292:     warning ("integer constant out of range");
        !          1293: 
        !          1294:   /* If too big to be signed, consider it unsigned.  */
        !          1295:   if ((long) n < 0 && ! yylval.integer.unsignedp)
        !          1296:     {
        !          1297:       if (base == 10)
        !          1298:        warning ("integer constant is so large that it is unsigned");
        !          1299:       yylval.integer.unsignedp = 1;
        !          1300:     }
        !          1301: 
        !          1302:   lexptr = p;
        !          1303:   yylval.integer.value = n;
        !          1304:   return INT;
        !          1305: }
        !          1306: 
        !          1307: struct token {
        !          1308:   char *operator;
        !          1309:   int token;
        !          1310: };
        !          1311: 
        !          1312: static struct token tokentab2[] = {
        !          1313:   {"&&", AND},
        !          1314:   {"||", OR},
        !          1315:   {"<<", LSH},
        !          1316:   {">>", RSH},
        !          1317:   {"==", EQUAL},
        !          1318:   {"!=", NOTEQUAL},
        !          1319:   {"<=", LEQ},
        !          1320:   {">=", GEQ},
        !          1321:   {"++", ERROR},
        !          1322:   {"--", ERROR},
        !          1323:   {NULL, ERROR}
        !          1324: };
        !          1325: 
        !          1326: /* Read one token, getting characters through lexptr.  */
        !          1327: 
        !          1328: int
        !          1329: yylex ()
        !          1330: {
        !          1331:   register int c;
        !          1332:   register int namelen;
        !          1333:   register unsigned char *tokstart;
        !          1334:   register struct token *toktab;
        !          1335:   int wide_flag;
        !          1336: 
        !          1337:  retry:
        !          1338: 
        !          1339:   tokstart = (unsigned char *) lexptr;
        !          1340:   c = *tokstart;
        !          1341:   /* See if it is a special token of length 2.  */
        !          1342:   if (! keyword_parsing)
        !          1343:     for (toktab = tokentab2; toktab->operator != NULL; toktab++)
        !          1344:       if (c == *toktab->operator && tokstart[1] == toktab->operator[1]) {
        !          1345:        lexptr += 2;
        !          1346:        if (toktab->token == ERROR)
        !          1347:          {
        !          1348:            char *buf = (char *) alloca (40);
        !          1349:            sprintf (buf, "`%s' not allowed in operand of `#if'", toktab->operator);
        !          1350:            yyerror (buf);
        !          1351:          }
        !          1352:        return toktab->token;
        !          1353:       }
        !          1354: 
        !          1355:   switch (c) {
        !          1356:   case 0:
        !          1357:     return 0;
        !          1358:     
        !          1359:   case ' ':
        !          1360:   case '\t':
        !          1361:   case '\r':
        !          1362:   case '\n':
        !          1363:     lexptr++;
        !          1364:     goto retry;
        !          1365:     
        !          1366:   case 'L':
        !          1367:     /* Capital L may start a wide-string or wide-character constant.  */
        !          1368:     if (lexptr[1] == '\'')
        !          1369:       {
        !          1370:        lexptr++;
        !          1371:        wide_flag = 1;
        !          1372:        goto char_constant;
        !          1373:       }
        !          1374:     if (lexptr[1] == '"')
        !          1375:       {
        !          1376:        lexptr++;
        !          1377:        wide_flag = 1;
        !          1378:        goto string_constant;
        !          1379:       }
        !          1380:     break;
        !          1381: 
        !          1382:   case '\'':
        !          1383:     wide_flag = 0;
        !          1384:   char_constant:
        !          1385:     lexptr++;
        !          1386:     if (keyword_parsing) {
        !          1387:       char *start_ptr = lexptr - 1;
        !          1388:       while (1) {
        !          1389:        c = *lexptr++;
        !          1390:        if (c == '\\')
        !          1391:          c = parse_escape (&lexptr);
        !          1392:        else if (c == '\'')
        !          1393:          break;
        !          1394:       }
        !          1395:       yylval.name.address = tokstart;
        !          1396:       yylval.name.length = lexptr - start_ptr;
        !          1397:       return NAME;
        !          1398:     }
        !          1399: 
        !          1400:     /* This code for reading a character constant
        !          1401:        handles multicharacter constants and wide characters.
        !          1402:        It is mostly copied from c-lex.c.  */
        !          1403:     {
        !          1404:       register int result = 0;
        !          1405:       register num_chars = 0;
        !          1406:       unsigned width = MAX_CHAR_TYPE_SIZE;
        !          1407:       int max_chars;
        !          1408:       char *token_buffer;
        !          1409: 
        !          1410:       if (wide_flag)
        !          1411:        {
        !          1412:          width = MAX_WCHAR_TYPE_SIZE;
        !          1413: #ifdef MULTIBYTE_CHARS
        !          1414:          max_chars = MB_CUR_MAX;
        !          1415: #else
        !          1416:          max_chars = 1;
        !          1417: #endif
        !          1418:        }
        !          1419:       else
        !          1420:        max_chars = MAX_LONG_TYPE_SIZE / width;
        !          1421: 
        !          1422:       token_buffer = (char *) alloca (max_chars + 1);
        !          1423: 
        !          1424:       while (1)
        !          1425:        {
        !          1426:          c = *lexptr++;
        !          1427: 
        !          1428:          if (c == '\'' || c == EOF)
        !          1429:            break;
        !          1430: 
        !          1431:          if (c == '\\')
        !          1432:            {
        !          1433:              c = parse_escape (&lexptr);
        !          1434:              if (width < HOST_BITS_PER_INT
        !          1435:                  && (unsigned) c >= (1 << width))
        !          1436:                pedwarn ("escape sequence out of range for character");
        !          1437:            }
        !          1438: 
        !          1439:          num_chars++;
        !          1440: 
        !          1441:          /* Merge character into result; ignore excess chars.  */
        !          1442:          if (num_chars < max_chars + 1)
        !          1443:            {
        !          1444:              if (width < HOST_BITS_PER_INT)
        !          1445:                result = (result << width) | (c & ((1 << width) - 1));
        !          1446:              else
        !          1447:                result = c;
        !          1448:              token_buffer[num_chars - 1] = c;
        !          1449:            }
        !          1450:        }
        !          1451: 
        !          1452:       token_buffer[num_chars] = 0;
        !          1453: 
        !          1454:       if (c != '\'')
        !          1455:        error ("malformatted character constant");
        !          1456:       else if (num_chars == 0)
        !          1457:        error ("empty character constant");
        !          1458:       else if (num_chars > max_chars)
        !          1459:        {
        !          1460:          num_chars = max_chars;
        !          1461:          error ("character constant too long");
        !          1462:        }
        !          1463:       else if (num_chars != 1 && ! traditional)
        !          1464:        warning ("multi-character character constant");
        !          1465: 
        !          1466:       /* If char type is signed, sign-extend the constant.  */
        !          1467:       if (! wide_flag)
        !          1468:        {
        !          1469:          int num_bits = num_chars * width;
        !          1470: 
        !          1471:          if (lookup ("__CHAR_UNSIGNED__", sizeof ("__CHAR_UNSIGNED__")-1, -1)
        !          1472:              || ((result >> (num_bits - 1)) & 1) == 0)
        !          1473:            yylval.integer.value
        !          1474:              = result & ((unsigned long) ~0 >> (HOST_BITS_PER_LONG - num_bits));
        !          1475:          else
        !          1476:            yylval.integer.value
        !          1477:              = result | ~((unsigned long) ~0 >> (HOST_BITS_PER_LONG - num_bits));
        !          1478:        }
        !          1479:       else
        !          1480:        {
        !          1481: #ifdef MULTIBYTE_CHARS
        !          1482:          /* Set the initial shift state and convert the next sequence.  */
        !          1483:          result = 0;
        !          1484:          /* In all locales L'\0' is zero and mbtowc will return zero,
        !          1485:             so don't use it.  */
        !          1486:          if (num_chars > 1
        !          1487:              || (num_chars == 1 && token_buffer[0] != '\0'))
        !          1488:            {
        !          1489:              wchar_t wc;
        !          1490:              (void) mbtowc (NULL_PTR, NULL_PTR, 0);
        !          1491:              if (mbtowc (& wc, token_buffer, num_chars) == num_chars)
        !          1492:                result = wc;
        !          1493:              else
        !          1494:                warning ("Ignoring invalid multibyte character");
        !          1495:            }
        !          1496: #endif
        !          1497:          yylval.integer.value = result;
        !          1498:        }
        !          1499:     }
        !          1500: 
        !          1501:     /* This is always a signed type.  */
        !          1502:     yylval.integer.unsignedp = 0;
        !          1503:     
        !          1504:     return CHAR;
        !          1505: 
        !          1506:     /* some of these chars are invalid in constant expressions;
        !          1507:        maybe do something about them later */
        !          1508:   case '/':
        !          1509:   case '+':
        !          1510:   case '-':
        !          1511:   case '*':
        !          1512:   case '%':
        !          1513:   case '|':
        !          1514:   case '&':
        !          1515:   case '^':
        !          1516:   case '~':
        !          1517:   case '!':
        !          1518:   case '@':
        !          1519:   case '<':
        !          1520:   case '>':
        !          1521:   case '[':
        !          1522:   case ']':
        !          1523:   case '.':
        !          1524:   case '?':
        !          1525:   case ':':
        !          1526:   case '=':
        !          1527:   case '{':
        !          1528:   case '}':
        !          1529:   case ',':
        !          1530:   case '#':
        !          1531:     if (keyword_parsing)
        !          1532:       break;
        !          1533:   case '(':
        !          1534:   case ')':
        !          1535:     lexptr++;
        !          1536:     return c;
        !          1537: 
        !          1538:   case '"':
        !          1539:   string_constant:
        !          1540:     if (keyword_parsing) {
        !          1541:       char *start_ptr = lexptr;
        !          1542:       lexptr++;
        !          1543:       while (1) {
        !          1544:        c = *lexptr++;
        !          1545:        if (c == '\\')
        !          1546:          c = parse_escape (&lexptr);
        !          1547:        else if (c == '"')
        !          1548:          break;
        !          1549:       }
        !          1550:       yylval.name.address = tokstart;
        !          1551:       yylval.name.length = lexptr - start_ptr;
        !          1552:       return NAME;
        !          1553:     }
        !          1554:     yyerror ("string constants not allowed in #if expressions");
        !          1555:     return ERROR;
        !          1556:   }
        !          1557: 
        !          1558:   if (c >= '0' && c <= '9' && !keyword_parsing) {
        !          1559:     /* It's a number */
        !          1560:     for (namelen = 0;
        !          1561:         c = tokstart[namelen], is_idchar[c] || c == '.'; 
        !          1562:         namelen++)
        !          1563:       ;
        !          1564:     return parse_number (namelen);
        !          1565:   }
        !          1566: 
        !          1567:   /* It is a name.  See how long it is.  */
        !          1568: 
        !          1569:   if (keyword_parsing) {
        !          1570:     for (namelen = 0;; namelen++) {
        !          1571:       if (is_hor_space[tokstart[namelen]])
        !          1572:        break;
        !          1573:       if (tokstart[namelen] == '(' || tokstart[namelen] == ')')
        !          1574:        break;
        !          1575:       if (tokstart[namelen] == '"' || tokstart[namelen] == '\'')
        !          1576:        break;
        !          1577:     }
        !          1578:   } else {
        !          1579:     if (!is_idstart[c]) {
        !          1580:       yyerror ("Invalid token in expression");
        !          1581:       return ERROR;
        !          1582:     }
        !          1583: 
        !          1584:     for (namelen = 0; is_idchar[tokstart[namelen]]; namelen++)
        !          1585:       ;
        !          1586:   }
        !          1587:   
        !          1588:   lexptr += namelen;
        !          1589:   yylval.name.address = tokstart;
        !          1590:   yylval.name.length = namelen;
        !          1591:   return NAME;
        !          1592: }
        !          1593: 
        !          1594: 
        !          1595: /* Parse a C escape sequence.  STRING_PTR points to a variable
        !          1596:    containing a pointer to the string to parse.  That pointer
        !          1597:    is updated past the characters we use.  The value of the
        !          1598:    escape sequence is returned.
        !          1599: 
        !          1600:    A negative value means the sequence \ newline was seen,
        !          1601:    which is supposed to be equivalent to nothing at all.
        !          1602: 
        !          1603:    If \ is followed by a null character, we return a negative
        !          1604:    value and leave the string pointer pointing at the null character.
        !          1605: 
        !          1606:    If \ is followed by 000, we return 0 and leave the string pointer
        !          1607:    after the zeros.  A value of 0 does not mean end of string.  */
        !          1608: 
        !          1609: int
        !          1610: parse_escape (string_ptr)
        !          1611:      char **string_ptr;
        !          1612: {
        !          1613:   register int c = *(*string_ptr)++;
        !          1614:   switch (c)
        !          1615:     {
        !          1616:     case 'a':
        !          1617:       return TARGET_BELL;
        !          1618:     case 'b':
        !          1619:       return TARGET_BS;
        !          1620:     case 'e':
        !          1621:     case 'E':
        !          1622:       if (pedantic)
        !          1623:        pedwarn ("non-ANSI-standard escape sequence, `\\%c'", c);
        !          1624:       return 033;
        !          1625:     case 'f':
        !          1626:       return TARGET_FF;
        !          1627:     case 'n':
        !          1628:       return TARGET_NEWLINE;
        !          1629:     case 'r':
        !          1630:       return TARGET_CR;
        !          1631:     case 't':
        !          1632:       return TARGET_TAB;
        !          1633:     case 'v':
        !          1634:       return TARGET_VT;
        !          1635:     case '\n':
        !          1636:       return -2;
        !          1637:     case 0:
        !          1638:       (*string_ptr)--;
        !          1639:       return 0;
        !          1640:       
        !          1641:     case '0':
        !          1642:     case '1':
        !          1643:     case '2':
        !          1644:     case '3':
        !          1645:     case '4':
        !          1646:     case '5':
        !          1647:     case '6':
        !          1648:     case '7':
        !          1649:       {
        !          1650:        register int i = c - '0';
        !          1651:        register int count = 0;
        !          1652:        while (++count < 3)
        !          1653:          {
        !          1654:            c = *(*string_ptr)++;
        !          1655:            if (c >= '0' && c <= '7')
        !          1656:              i = (i << 3) + c - '0';
        !          1657:            else
        !          1658:              {
        !          1659:                (*string_ptr)--;
        !          1660:                break;
        !          1661:              }
        !          1662:          }
        !          1663:        if ((i & ~((1 << MAX_CHAR_TYPE_SIZE) - 1)) != 0)
        !          1664:          {
        !          1665:            i &= (1 << MAX_CHAR_TYPE_SIZE) - 1;
        !          1666:            warning ("octal character constant does not fit in a byte");
        !          1667:          }
        !          1668:        return i;
        !          1669:       }
        !          1670:     case 'x':
        !          1671:       {
        !          1672:        register unsigned i = 0, overflow = 0, digits_found = 0, digit;
        !          1673:        for (;;)
        !          1674:          {
        !          1675:            c = *(*string_ptr)++;
        !          1676:            if (c >= '0' && c <= '9')
        !          1677:              digit = c - '0';
        !          1678:            else if (c >= 'a' && c <= 'f')
        !          1679:              digit = c - 'a' + 10;
        !          1680:            else if (c >= 'A' && c <= 'F')
        !          1681:              digit = c - 'A' + 10;
        !          1682:            else
        !          1683:              {
        !          1684:                (*string_ptr)--;
        !          1685:                break;
        !          1686:              }
        !          1687:            overflow |= i ^ (i << 4 >> 4);
        !          1688:            i = (i << 4) + digit;
        !          1689:            digits_found = 1;
        !          1690:          }
        !          1691:        if (!digits_found)
        !          1692:          yyerror ("\\x used with no following hex digits");
        !          1693:        if (overflow | (i & ~((1 << BITS_PER_UNIT) - 1)))
        !          1694:          {
        !          1695:            i &= (1 << BITS_PER_UNIT) - 1;
        !          1696:            warning ("hex character constant does not fit in a byte");
        !          1697:          }
        !          1698:        return i;
        !          1699:       }
        !          1700:     default:
        !          1701:       return c;
        !          1702:     }
        !          1703: }
        !          1704: 
        !          1705: void
        !          1706: yyerror (s)
        !          1707:      char *s;
        !          1708: {
        !          1709:   error (s);
        !          1710:   longjmp (parse_return_error, 1);
        !          1711: }
        !          1712: 
        !          1713: static void
        !          1714: integer_overflow ()
        !          1715: {
        !          1716:   if (pedantic)
        !          1717:     pedwarn ("integer overflow in preprocessor expression");
        !          1718: }
        !          1719: 
        !          1720: static long
        !          1721: left_shift (a, b)
        !          1722:      struct constant *a;
        !          1723:      unsigned long b;
        !          1724: {
        !          1725:   if (b >= HOST_BITS_PER_LONG)
        !          1726:     {
        !          1727:       if (! a->unsignedp && a->value != 0)
        !          1728:        integer_overflow ();
        !          1729:       return 0;
        !          1730:     }
        !          1731:   else if (a->unsignedp)
        !          1732:     return (unsigned long) a->value << b;
        !          1733:   else
        !          1734:     {
        !          1735:       long l = a->value << b;
        !          1736:       if (l >> b != a->value)
        !          1737:        integer_overflow ();
        !          1738:       return l;
        !          1739:     }
        !          1740: }
        !          1741: 
        !          1742: static long
        !          1743: right_shift (a, b)
        !          1744:      struct constant *a;
        !          1745:      unsigned long b;
        !          1746: {
        !          1747:   if (b >= HOST_BITS_PER_LONG)
        !          1748:     return a->unsignedp ? 0 : a->value >> (HOST_BITS_PER_LONG - 1);
        !          1749:   else if (a->unsignedp)
        !          1750:     return (unsigned long) a->value >> b;
        !          1751:   else
        !          1752:     return a->value >> b;
        !          1753: }
        !          1754: 
        !          1755: /* This page contains the entry point to this file.  */
        !          1756: 
        !          1757: /* Parse STRING as an expression, and complain if this fails
        !          1758:    to use up all of the contents of STRING.  */
        !          1759: /* We do not support C comments.  They should be removed before
        !          1760:    this function is called.  */
        !          1761: 
        !          1762: int
        !          1763: parse_c_expression (string)
        !          1764:      char *string;
        !          1765: {
        !          1766:   lexptr = string;
        !          1767:   
        !          1768:   if (lexptr == 0 || *lexptr == 0) {
        !          1769:     error ("empty #if expression");
        !          1770:     return 0;                  /* don't include the #if group */
        !          1771:   }
        !          1772: 
        !          1773:   /* if there is some sort of scanning error, just return 0 and assume
        !          1774:      the parsing routine has printed an error message somewhere.
        !          1775:      there is surely a better thing to do than this.     */
        !          1776:   if (setjmp (parse_return_error))
        !          1777:     return 0;
        !          1778: 
        !          1779:   if (yyparse ())
        !          1780:     return 0;                  /* actually this is never reached
        !          1781:                                   the way things stand. */
        !          1782:   if (*lexptr)
        !          1783:     error ("Junk after end of expression.");
        !          1784: 
        !          1785:   return expression_value;     /* set by yyparse () */
        !          1786: }
        !          1787: 
        !          1788: #ifdef TEST_EXP_READER
        !          1789: extern int yydebug;
        !          1790: 
        !          1791: /* Main program for testing purposes.  */
        !          1792: int
        !          1793: main ()
        !          1794: {
        !          1795:   int n, c;
        !          1796:   char buf[1024];
        !          1797: 
        !          1798: /*
        !          1799:   yydebug = 1;
        !          1800: */
        !          1801:   initialize_random_junk ();
        !          1802: 
        !          1803:   for (;;) {
        !          1804:     printf ("enter expression: ");
        !          1805:     n = 0;
        !          1806:     while ((buf[n] = getchar ()) != '\n' && buf[n] != EOF)
        !          1807:       n++;
        !          1808:     if (buf[n] == EOF)
        !          1809:       break;
        !          1810:     buf[n] = '\0';
        !          1811:     printf ("parser returned %d\n", parse_c_expression (buf));
        !          1812:   }
        !          1813: 
        !          1814:   return 0;
        !          1815: }
        !          1816: 
        !          1817: /* table to tell if char can be part of a C identifier. */
        !          1818: unsigned char is_idchar[256];
        !          1819: /* table to tell if char can be first char of a c identifier. */
        !          1820: unsigned char is_idstart[256];
        !          1821: /* table to tell if c is horizontal space.  isspace () thinks that
        !          1822:    newline is space; this is not a good idea for this program. */
        !          1823: char is_hor_space[256];
        !          1824: 
        !          1825: /*
        !          1826:  * initialize random junk in the hash table and maybe other places
        !          1827:  */
        !          1828: initialize_random_junk ()
        !          1829: {
        !          1830:   register int i;
        !          1831: 
        !          1832:   /*
        !          1833:    * Set up is_idchar and is_idstart tables.  These should be
        !          1834:    * faster than saying (is_alpha (c) || c == '_'), etc.
        !          1835:    * Must do set up these things before calling any routines tthat
        !          1836:    * refer to them.
        !          1837:    */
        !          1838:   for (i = 'a'; i <= 'z'; i++) {
        !          1839:     ++is_idchar[i - 'a' + 'A'];
        !          1840:     ++is_idchar[i];
        !          1841:     ++is_idstart[i - 'a' + 'A'];
        !          1842:     ++is_idstart[i];
        !          1843:   }
        !          1844:   for (i = '0'; i <= '9'; i++)
        !          1845:     ++is_idchar[i];
        !          1846:   ++is_idchar['_'];
        !          1847:   ++is_idstart['_'];
        !          1848: #if DOLLARS_IN_IDENTIFIERS
        !          1849:   ++is_idchar['$'];
        !          1850:   ++is_idstart['$'];
        !          1851: #endif
        !          1852: 
        !          1853:   /* horizontal space table */
        !          1854:   ++is_hor_space[' '];
        !          1855:   ++is_hor_space['\t'];
        !          1856: }
        !          1857: 
        !          1858: error (msg)
        !          1859: {
        !          1860:   printf ("error: %s\n", msg);
        !          1861: }
        !          1862: 
        !          1863: warning (msg)
        !          1864: {
        !          1865:   printf ("warning: %s\n", msg);
        !          1866: }
        !          1867: 
        !          1868: struct hashnode *
        !          1869: lookup (name, len, hash)
        !          1870:      char *name;
        !          1871:      int len;
        !          1872:      int hash;
        !          1873: {
        !          1874:   return (DEFAULT_SIGNED_CHAR) ? 0 : ((struct hashnode *) -1);
        !          1875: }
        !          1876: #endif

unix.superglobalmegacorp.com

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