Commit ca2b3251 by Jason Merrill

update

From-SVN: r21352
parent a38fe535
...@@ -35,12 +35,12 @@ ...@@ -35,12 +35,12 @@
#include "system.h" #include "system.h"
#include <setjmp.h> #include <setjmp.h>
/* #define YYDEBUG 1 */ /* #define YYDEBUG 1 */
#include "gansidecl.h"
#ifdef MULTIBYTE_CHARS #ifdef MULTIBYTE_CHARS
#include "mbchar.h"
#include <locale.h> #include <locale.h>
#endif #endif /* MULTIBYTE_CHARS */
#include "gansidecl.h"
typedef unsigned char U_CHAR; typedef unsigned char U_CHAR;
...@@ -187,7 +187,7 @@ static void integer_overflow PROTO((void)); ...@@ -187,7 +187,7 @@ static void integer_overflow PROTO((void));
#define SIGNED (~0) #define SIGNED (~0)
#define UNSIGNED 0 #define UNSIGNED 0
#line 251 "cexp.y" #line 195 "cexp.y"
typedef union { typedef union {
struct constant {HOST_WIDE_INT value; int signedp;} integer; struct constant {HOST_WIDE_INT value; int signedp;} integer;
struct name {U_CHAR *address; int length;} name; struct name {U_CHAR *address; int length;} name;
...@@ -268,10 +268,10 @@ static const short yyrhs[] = { 35, ...@@ -268,10 +268,10 @@ static const short yyrhs[] = { 35,
#if YYDEBUG != 0 #if YYDEBUG != 0
static const short yyrline[] = { 0, static const short yyrline[] = { 0,
281, 291, 292, 299, 304, 307, 309, 312, 316, 318, 225, 235, 236, 243, 248, 251, 253, 256, 260, 262,
323, 328, 341, 358, 371, 377, 383, 389, 395, 398, 267, 272, 285, 302, 315, 321, 327, 333, 339, 342,
401, 408, 415, 422, 429, 432, 435, 438, 441, 444, 345, 352, 359, 366, 373, 376, 379, 382, 385, 388,
447, 450, 452, 455, 458, 460, 462, 470, 472, 485 391, 394, 396, 399, 402, 404, 406, 414, 416, 429
}; };
#endif #endif
...@@ -377,7 +377,7 @@ static const short yycheck[] = { 4, ...@@ -377,7 +377,7 @@ static const short yycheck[] = { 4,
26, 27, 23, 24, 25, 26, 27, 0, 9 26, 27, 23, 24, 25, 26, 27, 0, 9
}; };
/* -*-C-*- Note some compilers choke on comments on `#line' lines. */ /* -*-C-*- Note some compilers choke on comments on `#line' lines. */
#line 3 "/usr/cygnus/latest-940103/share/bison.simple" #line 3 "/usr/cygnus/gnupro-98r1/share/bison.simple"
/* Skeleton output parser for bison, /* Skeleton output parser for bison,
Copyright (C) 1984, 1989, 1990 Free Software Foundation, Inc. Copyright (C) 1984, 1989, 1990 Free Software Foundation, Inc.
...@@ -570,7 +570,7 @@ __yy_memcpy (char *to, char *from, int count) ...@@ -570,7 +570,7 @@ __yy_memcpy (char *to, char *from, int count)
#endif #endif
#endif #endif
#line 196 "/usr/cygnus/latest-940103/share/bison.simple" #line 196 "/usr/cygnus/gnupro-98r1/share/bison.simple"
/* The user can define YYPARSE_PARAM as the name of an argument to be passed /* The user can define YYPARSE_PARAM as the name of an argument to be passed
into yyparse. The argument should have type void *. into yyparse. The argument should have type void *.
...@@ -875,7 +875,7 @@ yyreduce: ...@@ -875,7 +875,7 @@ yyreduce:
switch (yyn) { switch (yyn) {
case 1: case 1:
#line 282 "cexp.y" #line 226 "cexp.y"
{ {
expression_value = yyvsp[0].integer.value; expression_value = yyvsp[0].integer.value;
#ifdef TEST_EXP_READER #ifdef TEST_EXP_READER
...@@ -884,55 +884,55 @@ case 1: ...@@ -884,55 +884,55 @@ case 1:
; ;
break;} break;}
case 3: case 3:
#line 293 "cexp.y" #line 237 "cexp.y"
{ if (pedantic) { if (pedantic)
pedwarn ("comma operator in operand of `#if'"); pedwarn ("comma operator in operand of `#if'");
yyval.integer = yyvsp[0].integer; ; yyval.integer = yyvsp[0].integer; ;
break;} break;}
case 4: case 4:
#line 300 "cexp.y" #line 244 "cexp.y"
{ yyval.integer.value = - yyvsp[0].integer.value; { yyval.integer.value = - yyvsp[0].integer.value;
yyval.integer.signedp = yyvsp[0].integer.signedp; yyval.integer.signedp = yyvsp[0].integer.signedp;
if ((yyval.integer.value & yyvsp[0].integer.value & yyval.integer.signedp) < 0) if ((yyval.integer.value & yyvsp[0].integer.value & yyval.integer.signedp) < 0)
integer_overflow (); ; integer_overflow (); ;
break;} break;}
case 5: case 5:
#line 305 "cexp.y" #line 249 "cexp.y"
{ yyval.integer.value = ! yyvsp[0].integer.value; { yyval.integer.value = ! yyvsp[0].integer.value;
yyval.integer.signedp = SIGNED; ; yyval.integer.signedp = SIGNED; ;
break;} break;}
case 6: case 6:
#line 308 "cexp.y" #line 252 "cexp.y"
{ yyval.integer = yyvsp[0].integer; ; { yyval.integer = yyvsp[0].integer; ;
break;} break;}
case 7: case 7:
#line 310 "cexp.y" #line 254 "cexp.y"
{ yyval.integer.value = ~ yyvsp[0].integer.value; { yyval.integer.value = ~ yyvsp[0].integer.value;
yyval.integer.signedp = yyvsp[0].integer.signedp; ; yyval.integer.signedp = yyvsp[0].integer.signedp; ;
break;} break;}
case 8: case 8:
#line 313 "cexp.y" #line 257 "cexp.y"
{ yyval.integer.value = check_assertion (yyvsp[0].name.address, yyvsp[0].name.length, { yyval.integer.value = check_assertion (yyvsp[0].name.address, yyvsp[0].name.length,
0, NULL_PTR); 0, NULL_PTR);
yyval.integer.signedp = SIGNED; ; yyval.integer.signedp = SIGNED; ;
break;} break;}
case 9: case 9:
#line 317 "cexp.y" #line 261 "cexp.y"
{ keyword_parsing = 1; ; { keyword_parsing = 1; ;
break;} break;}
case 10: case 10:
#line 319 "cexp.y" #line 263 "cexp.y"
{ yyval.integer.value = check_assertion (yyvsp[-4].name.address, yyvsp[-4].name.length, { yyval.integer.value = check_assertion (yyvsp[-4].name.address, yyvsp[-4].name.length,
1, yyvsp[-1].keywords); 1, yyvsp[-1].keywords);
keyword_parsing = 0; keyword_parsing = 0;
yyval.integer.signedp = SIGNED; ; yyval.integer.signedp = SIGNED; ;
break;} break;}
case 11: case 11:
#line 324 "cexp.y" #line 268 "cexp.y"
{ yyval.integer = yyvsp[-1].integer; ; { yyval.integer = yyvsp[-1].integer; ;
break;} break;}
case 12: case 12:
#line 329 "cexp.y" #line 273 "cexp.y"
{ yyval.integer.signedp = yyvsp[-2].integer.signedp & yyvsp[0].integer.signedp; { yyval.integer.signedp = yyvsp[-2].integer.signedp & yyvsp[0].integer.signedp;
if (yyval.integer.signedp) if (yyval.integer.signedp)
{ {
...@@ -947,7 +947,7 @@ case 12: ...@@ -947,7 +947,7 @@ case 12:
* yyvsp[0].integer.value); ; * yyvsp[0].integer.value); ;
break;} break;}
case 13: case 13:
#line 342 "cexp.y" #line 286 "cexp.y"
{ if (yyvsp[0].integer.value == 0) { if (yyvsp[0].integer.value == 0)
{ {
if (!skip_evaluation) if (!skip_evaluation)
...@@ -966,7 +966,7 @@ case 13: ...@@ -966,7 +966,7 @@ case 13:
/ yyvsp[0].integer.value); ; / yyvsp[0].integer.value); ;
break;} break;}
case 14: case 14:
#line 359 "cexp.y" #line 303 "cexp.y"
{ if (yyvsp[0].integer.value == 0) { if (yyvsp[0].integer.value == 0)
{ {
if (!skip_evaluation) if (!skip_evaluation)
...@@ -981,7 +981,7 @@ case 14: ...@@ -981,7 +981,7 @@ case 14:
% yyvsp[0].integer.value); ; % yyvsp[0].integer.value); ;
break;} break;}
case 15: case 15:
#line 372 "cexp.y" #line 316 "cexp.y"
{ yyval.integer.value = yyvsp[-2].integer.value + yyvsp[0].integer.value; { yyval.integer.value = yyvsp[-2].integer.value + yyvsp[0].integer.value;
yyval.integer.signedp = yyvsp[-2].integer.signedp & yyvsp[0].integer.signedp; yyval.integer.signedp = yyvsp[-2].integer.signedp & yyvsp[0].integer.signedp;
if (overflow_sum_sign (yyvsp[-2].integer.value, yyvsp[0].integer.value, if (overflow_sum_sign (yyvsp[-2].integer.value, yyvsp[0].integer.value,
...@@ -989,7 +989,7 @@ case 15: ...@@ -989,7 +989,7 @@ case 15:
integer_overflow (); ; integer_overflow (); ;
break;} break;}
case 16: case 16:
#line 378 "cexp.y" #line 322 "cexp.y"
{ yyval.integer.value = yyvsp[-2].integer.value - yyvsp[0].integer.value; { yyval.integer.value = yyvsp[-2].integer.value - yyvsp[0].integer.value;
yyval.integer.signedp = yyvsp[-2].integer.signedp & yyvsp[0].integer.signedp; yyval.integer.signedp = yyvsp[-2].integer.signedp & yyvsp[0].integer.signedp;
if (overflow_sum_sign (yyval.integer.value, yyvsp[0].integer.value, if (overflow_sum_sign (yyval.integer.value, yyvsp[0].integer.value,
...@@ -997,7 +997,7 @@ case 16: ...@@ -997,7 +997,7 @@ case 16:
integer_overflow (); ; integer_overflow (); ;
break;} break;}
case 17: case 17:
#line 384 "cexp.y" #line 328 "cexp.y"
{ yyval.integer.signedp = yyvsp[-2].integer.signedp; { yyval.integer.signedp = yyvsp[-2].integer.signedp;
if ((yyvsp[0].integer.value & yyvsp[0].integer.signedp) < 0) if ((yyvsp[0].integer.value & yyvsp[0].integer.signedp) < 0)
yyval.integer.value = right_shift (&yyvsp[-2].integer, -yyvsp[0].integer.value); yyval.integer.value = right_shift (&yyvsp[-2].integer, -yyvsp[0].integer.value);
...@@ -1005,7 +1005,7 @@ case 17: ...@@ -1005,7 +1005,7 @@ case 17:
yyval.integer.value = left_shift (&yyvsp[-2].integer, yyvsp[0].integer.value); ; yyval.integer.value = left_shift (&yyvsp[-2].integer, yyvsp[0].integer.value); ;
break;} break;}
case 18: case 18:
#line 390 "cexp.y" #line 334 "cexp.y"
{ yyval.integer.signedp = yyvsp[-2].integer.signedp; { yyval.integer.signedp = yyvsp[-2].integer.signedp;
if ((yyvsp[0].integer.value & yyvsp[0].integer.signedp) < 0) if ((yyvsp[0].integer.value & yyvsp[0].integer.signedp) < 0)
yyval.integer.value = left_shift (&yyvsp[-2].integer, -yyvsp[0].integer.value); yyval.integer.value = left_shift (&yyvsp[-2].integer, -yyvsp[0].integer.value);
...@@ -1013,17 +1013,17 @@ case 18: ...@@ -1013,17 +1013,17 @@ case 18:
yyval.integer.value = right_shift (&yyvsp[-2].integer, yyvsp[0].integer.value); ; yyval.integer.value = right_shift (&yyvsp[-2].integer, yyvsp[0].integer.value); ;
break;} break;}
case 19: case 19:
#line 396 "cexp.y" #line 340 "cexp.y"
{ yyval.integer.value = (yyvsp[-2].integer.value == yyvsp[0].integer.value); { yyval.integer.value = (yyvsp[-2].integer.value == yyvsp[0].integer.value);
yyval.integer.signedp = SIGNED; ; yyval.integer.signedp = SIGNED; ;
break;} break;}
case 20: case 20:
#line 399 "cexp.y" #line 343 "cexp.y"
{ yyval.integer.value = (yyvsp[-2].integer.value != yyvsp[0].integer.value); { yyval.integer.value = (yyvsp[-2].integer.value != yyvsp[0].integer.value);
yyval.integer.signedp = SIGNED; ; yyval.integer.signedp = SIGNED; ;
break;} break;}
case 21: case 21:
#line 402 "cexp.y" #line 346 "cexp.y"
{ yyval.integer.signedp = SIGNED; { yyval.integer.signedp = SIGNED;
if (yyvsp[-2].integer.signedp & yyvsp[0].integer.signedp) if (yyvsp[-2].integer.signedp & yyvsp[0].integer.signedp)
yyval.integer.value = yyvsp[-2].integer.value <= yyvsp[0].integer.value; yyval.integer.value = yyvsp[-2].integer.value <= yyvsp[0].integer.value;
...@@ -1032,7 +1032,7 @@ case 21: ...@@ -1032,7 +1032,7 @@ case 21:
<= yyvsp[0].integer.value); ; <= yyvsp[0].integer.value); ;
break;} break;}
case 22: case 22:
#line 409 "cexp.y" #line 353 "cexp.y"
{ yyval.integer.signedp = SIGNED; { yyval.integer.signedp = SIGNED;
if (yyvsp[-2].integer.signedp & yyvsp[0].integer.signedp) if (yyvsp[-2].integer.signedp & yyvsp[0].integer.signedp)
yyval.integer.value = yyvsp[-2].integer.value >= yyvsp[0].integer.value; yyval.integer.value = yyvsp[-2].integer.value >= yyvsp[0].integer.value;
...@@ -1041,7 +1041,7 @@ case 22: ...@@ -1041,7 +1041,7 @@ case 22:
>= yyvsp[0].integer.value); ; >= yyvsp[0].integer.value); ;
break;} break;}
case 23: case 23:
#line 416 "cexp.y" #line 360 "cexp.y"
{ yyval.integer.signedp = SIGNED; { yyval.integer.signedp = SIGNED;
if (yyvsp[-2].integer.signedp & yyvsp[0].integer.signedp) if (yyvsp[-2].integer.signedp & yyvsp[0].integer.signedp)
yyval.integer.value = yyvsp[-2].integer.value < yyvsp[0].integer.value; yyval.integer.value = yyvsp[-2].integer.value < yyvsp[0].integer.value;
...@@ -1050,7 +1050,7 @@ case 23: ...@@ -1050,7 +1050,7 @@ case 23:
< yyvsp[0].integer.value); ; < yyvsp[0].integer.value); ;
break;} break;}
case 24: case 24:
#line 423 "cexp.y" #line 367 "cexp.y"
{ yyval.integer.signedp = SIGNED; { yyval.integer.signedp = SIGNED;
if (yyvsp[-2].integer.signedp & yyvsp[0].integer.signedp) if (yyvsp[-2].integer.signedp & yyvsp[0].integer.signedp)
yyval.integer.value = yyvsp[-2].integer.value > yyvsp[0].integer.value; yyval.integer.value = yyvsp[-2].integer.value > yyvsp[0].integer.value;
...@@ -1059,64 +1059,64 @@ case 24: ...@@ -1059,64 +1059,64 @@ case 24:
> yyvsp[0].integer.value); ; > yyvsp[0].integer.value); ;
break;} break;}
case 25: case 25:
#line 430 "cexp.y" #line 374 "cexp.y"
{ yyval.integer.value = yyvsp[-2].integer.value & yyvsp[0].integer.value; { yyval.integer.value = yyvsp[-2].integer.value & yyvsp[0].integer.value;
yyval.integer.signedp = yyvsp[-2].integer.signedp & yyvsp[0].integer.signedp; ; yyval.integer.signedp = yyvsp[-2].integer.signedp & yyvsp[0].integer.signedp; ;
break;} break;}
case 26: case 26:
#line 433 "cexp.y" #line 377 "cexp.y"
{ yyval.integer.value = yyvsp[-2].integer.value ^ yyvsp[0].integer.value; { yyval.integer.value = yyvsp[-2].integer.value ^ yyvsp[0].integer.value;
yyval.integer.signedp = yyvsp[-2].integer.signedp & yyvsp[0].integer.signedp; ; yyval.integer.signedp = yyvsp[-2].integer.signedp & yyvsp[0].integer.signedp; ;
break;} break;}
case 27: case 27:
#line 436 "cexp.y" #line 380 "cexp.y"
{ yyval.integer.value = yyvsp[-2].integer.value | yyvsp[0].integer.value; { yyval.integer.value = yyvsp[-2].integer.value | yyvsp[0].integer.value;
yyval.integer.signedp = yyvsp[-2].integer.signedp & yyvsp[0].integer.signedp; ; yyval.integer.signedp = yyvsp[-2].integer.signedp & yyvsp[0].integer.signedp; ;
break;} break;}
case 28: case 28:
#line 439 "cexp.y" #line 383 "cexp.y"
{ skip_evaluation += !yyvsp[-1].integer.value; ; { skip_evaluation += !yyvsp[-1].integer.value; ;
break;} break;}
case 29: case 29:
#line 441 "cexp.y" #line 385 "cexp.y"
{ skip_evaluation -= !yyvsp[-3].integer.value; { skip_evaluation -= !yyvsp[-3].integer.value;
yyval.integer.value = (yyvsp[-3].integer.value && yyvsp[0].integer.value); yyval.integer.value = (yyvsp[-3].integer.value && yyvsp[0].integer.value);
yyval.integer.signedp = SIGNED; ; yyval.integer.signedp = SIGNED; ;
break;} break;}
case 30: case 30:
#line 445 "cexp.y" #line 389 "cexp.y"
{ skip_evaluation += !!yyvsp[-1].integer.value; ; { skip_evaluation += !!yyvsp[-1].integer.value; ;
break;} break;}
case 31: case 31:
#line 447 "cexp.y" #line 391 "cexp.y"
{ skip_evaluation -= !!yyvsp[-3].integer.value; { skip_evaluation -= !!yyvsp[-3].integer.value;
yyval.integer.value = (yyvsp[-3].integer.value || yyvsp[0].integer.value); yyval.integer.value = (yyvsp[-3].integer.value || yyvsp[0].integer.value);
yyval.integer.signedp = SIGNED; ; yyval.integer.signedp = SIGNED; ;
break;} break;}
case 32: case 32:
#line 451 "cexp.y" #line 395 "cexp.y"
{ skip_evaluation += !yyvsp[-1].integer.value; ; { skip_evaluation += !yyvsp[-1].integer.value; ;
break;} break;}
case 33: case 33:
#line 453 "cexp.y" #line 397 "cexp.y"
{ skip_evaluation += !!yyvsp[-4].integer.value - !yyvsp[-4].integer.value; ; { skip_evaluation += !!yyvsp[-4].integer.value - !yyvsp[-4].integer.value; ;
break;} break;}
case 34: case 34:
#line 455 "cexp.y" #line 399 "cexp.y"
{ skip_evaluation -= !!yyvsp[-6].integer.value; { skip_evaluation -= !!yyvsp[-6].integer.value;
yyval.integer.value = yyvsp[-6].integer.value ? yyvsp[-3].integer.value : yyvsp[0].integer.value; yyval.integer.value = yyvsp[-6].integer.value ? yyvsp[-3].integer.value : yyvsp[0].integer.value;
yyval.integer.signedp = yyvsp[-3].integer.signedp & yyvsp[0].integer.signedp; ; yyval.integer.signedp = yyvsp[-3].integer.signedp & yyvsp[0].integer.signedp; ;
break;} break;}
case 35: case 35:
#line 459 "cexp.y" #line 403 "cexp.y"
{ yyval.integer = yylval.integer; ; { yyval.integer = yylval.integer; ;
break;} break;}
case 36: case 36:
#line 461 "cexp.y" #line 405 "cexp.y"
{ yyval.integer = yylval.integer; ; { yyval.integer = yylval.integer; ;
break;} break;}
case 37: case 37:
#line 463 "cexp.y" #line 407 "cexp.y"
{ if (warn_undef && !skip_evaluation) { if (warn_undef && !skip_evaluation)
warning ("`%.*s' is not defined", warning ("`%.*s' is not defined",
yyvsp[0].name.length, yyvsp[0].name.address); yyvsp[0].name.length, yyvsp[0].name.address);
...@@ -1124,11 +1124,11 @@ case 37: ...@@ -1124,11 +1124,11 @@ case 37:
yyval.integer.signedp = SIGNED; ; yyval.integer.signedp = SIGNED; ;
break;} break;}
case 38: case 38:
#line 471 "cexp.y" #line 415 "cexp.y"
{ yyval.keywords = 0; ; { yyval.keywords = 0; ;
break;} break;}
case 39: case 39:
#line 473 "cexp.y" #line 417 "cexp.y"
{ struct arglist *temp; { struct arglist *temp;
yyval.keywords = (struct arglist *) xmalloc (sizeof (struct arglist)); yyval.keywords = (struct arglist *) xmalloc (sizeof (struct arglist));
yyval.keywords->next = yyvsp[-2].keywords; yyval.keywords->next = yyvsp[-2].keywords;
...@@ -1143,7 +1143,7 @@ case 39: ...@@ -1143,7 +1143,7 @@ case 39:
temp->next->length = 1; ; temp->next->length = 1; ;
break;} break;}
case 40: case 40:
#line 486 "cexp.y" #line 430 "cexp.y"
{ yyval.keywords = (struct arglist *) xmalloc (sizeof (struct arglist)); { yyval.keywords = (struct arglist *) xmalloc (sizeof (struct arglist));
yyval.keywords->name = yyvsp[-1].name.address; yyval.keywords->name = yyvsp[-1].name.address;
yyval.keywords->length = yyvsp[-1].name.length; yyval.keywords->length = yyvsp[-1].name.length;
...@@ -1151,7 +1151,7 @@ case 40: ...@@ -1151,7 +1151,7 @@ case 40:
break;} break;}
} }
/* the action file gets copied in in place of this dollarsign */ /* the action file gets copied in in place of this dollarsign */
#line 498 "/usr/cygnus/latest-940103/share/bison.simple" #line 498 "/usr/cygnus/gnupro-98r1/share/bison.simple"
yyvsp -= yylen; yyvsp -= yylen;
yyssp -= yylen; yyssp -= yylen;
...@@ -1347,7 +1347,7 @@ yyerrhandle: ...@@ -1347,7 +1347,7 @@ yyerrhandle:
yystate = yyn; yystate = yyn;
goto yynewstate; goto yynewstate;
} }
#line 491 "cexp.y" #line 435 "cexp.y"
/* During parsing of a C expression, the pointer to the next character /* During parsing of a C expression, the pointer to the next character
...@@ -1557,23 +1557,18 @@ yylex () ...@@ -1557,23 +1557,18 @@ yylex ()
{ {
register HOST_WIDE_INT result = 0; register HOST_WIDE_INT result = 0;
register int num_chars = 0; register int num_chars = 0;
int chars_seen = 0;
unsigned width = MAX_CHAR_TYPE_SIZE; unsigned width = MAX_CHAR_TYPE_SIZE;
int max_chars; int max_chars;
char *token_buffer;
if (wide_flag)
{
width = MAX_WCHAR_TYPE_SIZE;
#ifdef MULTIBYTE_CHARS #ifdef MULTIBYTE_CHARS
max_chars = MB_CUR_MAX; int longest_char = local_mb_cur_max ();
#else char *token_buffer = (char *) alloca (longest_char);
max_chars = 1; (void) local_mbtowc (NULL_PTR, NULL_PTR, 0);
#endif #endif
}
else
max_chars = MAX_LONG_TYPE_SIZE / width;
token_buffer = (char *) alloca (max_chars + 1); max_chars = MAX_LONG_TYPE_SIZE / width;
if (wide_flag)
width = MAX_WCHAR_TYPE_SIZE;
while (1) while (1)
{ {
...@@ -1582,44 +1577,96 @@ yylex () ...@@ -1582,44 +1577,96 @@ yylex ()
if (c == '\'' || c == EOF) if (c == '\'' || c == EOF)
break; break;
++chars_seen;
if (c == '\\') if (c == '\\')
{ {
c = parse_escape (&lexptr, mask); c = parse_escape (&lexptr, mask);
} }
else
{
#ifdef MULTIBYTE_CHARS
wchar_t wc;
int i;
int char_len = -1;
for (i = 1; i <= longest_char; ++i)
{
token_buffer[i - 1] = c;
char_len = local_mbtowc (& wc, token_buffer, i);
if (char_len != -1)
break;
c = *lexptr++;
}
if (char_len > 1)
{
/* mbtowc sometimes needs an extra char before accepting */
if (char_len < i)
lexptr--;
if (! wide_flag)
{
/* Merge character into result; ignore excess chars. */
for (i = 1; i <= char_len; ++i)
{
if (i > max_chars)
break;
if (width < HOST_BITS_PER_INT)
result = (result << width)
| (token_buffer[i - 1]
& ((1 << width) - 1));
else
result = token_buffer[i - 1];
}
num_chars += char_len;
continue;
}
}
else
{
if (char_len == -1)
warning ("Ignoring invalid multibyte character");
}
if (wide_flag)
c = wc;
#endif /* ! MULTIBYTE_CHARS */
}
num_chars++; if (wide_flag)
{
if (chars_seen == 1) /* only keep the first one */
result = c;
continue;
}
/* Merge character into result; ignore excess chars. */ /* Merge character into result; ignore excess chars. */
num_chars++;
if (num_chars <= max_chars) if (num_chars <= max_chars)
{ {
if (width < HOST_BITS_PER_WIDE_INT) if (width < HOST_BITS_PER_INT)
result = (result << width) | c; result = (result << width) | (c & ((1 << width) - 1));
else else
result = c; result = c;
token_buffer[num_chars - 1] = c;
} }
} }
token_buffer[num_chars] = 0;
if (c != '\'') if (c != '\'')
error ("malformatted character constant"); error ("malformatted character constant");
else if (num_chars == 0) else if (chars_seen == 0)
error ("empty character constant"); error ("empty character constant");
else if (num_chars > max_chars) else if (num_chars > max_chars)
{ {
num_chars = max_chars; num_chars = max_chars;
error ("character constant too long"); error ("character constant too long");
} }
else if (num_chars != 1 && ! traditional) else if (chars_seen != 1 && ! traditional)
warning ("multi-character character constant"); warning ("multi-character character constant");
/* If char type is signed, sign-extend the constant. */ /* If char type is signed, sign-extend the constant. */
if (! wide_flag) if (! wide_flag)
{ {
int num_bits = num_chars * width; int num_bits = num_chars * width;
if (num_bits == 0)
if (lookup ((U_CHAR *) "__CHAR_UNSIGNED__", /* We already got an error; avoid invalid shift. */
yylval.integer.value = 0;
else if (lookup ((U_CHAR *) "__CHAR_UNSIGNED__",
sizeof ("__CHAR_UNSIGNED__") - 1, -1) sizeof ("__CHAR_UNSIGNED__") - 1, -1)
|| ((result >> (num_bits - 1)) & 1) == 0) || ((result >> (num_bits - 1)) & 1) == 0)
yylval.integer.value yylval.integer.value
...@@ -1632,22 +1679,6 @@ yylex () ...@@ -1632,22 +1679,6 @@ yylex ()
} }
else else
{ {
#ifdef MULTIBYTE_CHARS
/* Set the initial shift state and convert the next sequence. */
result = 0;
/* In all locales L'\0' is zero and mbtowc will return zero,
so don't use it. */
if (num_chars > 1
|| (num_chars == 1 && token_buffer[0] != '\0'))
{
wchar_t wc;
(void) mbtowc (NULL_PTR, NULL_PTR, 0);
if (mbtowc (& wc, token_buffer, num_chars) == num_chars)
result = wc;
else
pedwarn ("Ignoring invalid multibyte character");
}
#endif
yylval.integer.value = result; yylval.integer.value = result;
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment