|
|
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
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.