From 460c49ee26bc4a8498629f2144a33fc11db63ec2 Mon Sep 17 00:00:00 2001 From: brolley Date: Mon, 7 Jun 1999 11:12:38 +0000 Subject: [PATCH] Mon Jun 7 14:07:39 1999 Dave Brolley * c-lex.c (GETC): Redefine to call getch. (UNGETC): Redefine to call put_back. (putback_buffer): New structure type. (putback): New static structure. (getch): New function. (put_back): New function. (yylex): Replace unused bytes from bad multibyte character. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@27393 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 10 +++++++ gcc/c-lex.c | 88 +++++++++++++++++++++++++++++++++++++++++++++-------------- 2 files changed, 77 insertions(+), 21 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index cba11f2..431ad8d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +Mon Jun 7 14:07:39 1999 Dave Brolley + + * c-lex.c (GETC): Redefine to call getch. + (UNGETC): Redefine to call put_back. + (putback_buffer): New structure type. + (putback): New static structure. + (getch): New function. + (put_back): New function. + (yylex): Replace unused bytes from bad multibyte character. + Mon Jun 7 13:33:39 1999 Dave Brolley * cpplib.c (do_define): Cast `alloca' return value. diff --git a/gcc/c-lex.c b/gcc/c-lex.c index 27c65f3..96ca224 100644 --- a/gcc/c-lex.c +++ b/gcc/c-lex.c @@ -71,10 +71,47 @@ extern int yy_get_token (); #define GETC() (yy_cur < yy_lim ? *yy_cur++ : yy_get_token ()) #define UNGETC(c) ((c) == EOF ? 0 : yy_cur--) -#else -#define GETC() getc (finput) -#define UNGETC(c) ungetc (c, finput) -#endif + +#else /* ! USE_CPPLIB */ + +#define GETC() getch () +#define UNGETC(c) put_back (c) + +struct putback_buffer { + char *buffer; + int buffer_size; + int index; +}; + +static struct putback_buffer putback = {NULL, 0, -1}; + +static inline int +getch () +{ + if (putback.index != -1) + { + int ch = putback.buffer[putback.index]; + --putback.index; + return ch; + } + return getc (finput); +} + +static inline void +put_back (ch) + int ch; +{ + if (ch != EOF) + { + if (putback.index == putback.buffer_size - 1) + { + putback.buffer_size += 16; + putback.buffer = xrealloc (putback.buffer, putback.buffer_size); + } + putback.buffer[++putback.index] = ch; + } +} +#endif /* ! USE_CPPLIB */ /* the declaration found for the last IDENTIFIER token read in. yylex must look this up to detect typedefs, which get token type TYPENAME, @@ -1972,12 +2009,17 @@ yylex () else { if (char_len == -1) - warning ("Ignoring invalid multibyte character"); - if (wide_flag) - c = wc; + { + warning ("Ignoring invalid multibyte character"); + /* Replace all but the first byte. */ + for (--i; i > 1; --i) + UNGETC (token_buffer[i]); + wc = token_buffer[1]; + } #ifdef MAP_CHARACTER - else - c = MAP_CHARACTER (c); + c = MAP_CHARACTER (wc); +#else + c = wc; #endif } #else /* ! MULTIBYTE_CHARS */ @@ -2095,20 +2137,24 @@ yylex () c = GETC (); } if (char_len == -1) - warning ("Ignoring invalid multibyte character"); - else { - /* mbtowc sometimes needs an extra char before accepting */ - if (char_len <= i) - UNGETC (c); - if (! wide_flag) - { - p += (i + 1); - c = GETC (); - continue; - } - c = wc; + warning ("Ignoring invalid multibyte character"); + /* Replace all except the first byte. */ + UNGETC (c); + for (--i; i > 0; --i) + UNGETC (p[i]); + char_len = 1; + } + /* mbtowc sometimes needs an extra char before accepting */ + if (char_len <= i) + UNGETC (c); + if (! wide_flag) + { + p += (i + 1); + c = GETC (); + continue; } + c = wc; #endif /* MULTIBYTE_CHARS */ } -- 2.7.4