diff options
author | Dave Brolley <brolley@cygnus.com> | 1999-06-07 11:10:29 +0000 |
---|---|---|
committer | Dave Brolley <brolley@gcc.gnu.org> | 1999-06-07 07:10:29 -0400 |
commit | cd28936cf092e2d5cc361bb503b5bfb920fbcb5f (patch) | |
tree | 9b1e048e6c8b332ec15d9e1061c0e6ff0db21715 /gcc/cp/lex.c | |
parent | e7553be55ad4e48cfbd36b896947104d763b5696 (diff) | |
download | gcc-cd28936cf092e2d5cc361bb503b5bfb920fbcb5f.zip gcc-cd28936cf092e2d5cc361bb503b5bfb920fbcb5f.tar.gz gcc-cd28936cf092e2d5cc361bb503b5bfb920fbcb5f.tar.bz2 |
lex.c (real_yylex): Replace unused bytes from bad multibyte char.
1999-06-07 Dave Brolley <brolley@cygnus.com>
* lex.c (real_yylex): Replace unused bytes from bad multibyte char.
* input.c (putback_buffer): New structure type.
(putback): Replaces putback_char member.
(putback): Replaces putback_char static variable.
(feed_input): Use putback.
(end_input): Use putback.
(sub_getch): Use putback.
(put_back): Use putback.
From-SVN: r27392
Diffstat (limited to 'gcc/cp/lex.c')
-rw-r--r-- | gcc/cp/lex.c | 43 |
1 files changed, 26 insertions, 17 deletions
diff --git a/gcc/cp/lex.c b/gcc/cp/lex.c index 80f855e..1ab5df3 100644 --- a/gcc/cp/lex.c +++ b/gcc/cp/lex.c @@ -4074,12 +4074,17 @@ real_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) + put_back (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 */ @@ -4203,20 +4208,24 @@ real_yylex () c = getch (); } if (char_len == -1) - warning ("Ignoring invalid multibyte character"); - else { - /* mbtowc sometimes needs an extra char before accepting */ - if (char_len <= i) - put_back (c); - if (! wide_flag) - { - p += (i + 1); - c = getch (); - continue; - } - c = wc; + warning ("Ignoring invalid multibyte character"); + /* Replace all except the first byte. */ + put_back (c); + for (--i; i > 0; --i) + put_back (p[i]); + char_len = 1; + } + /* mbtowc sometimes needs an extra char before accepting */ + if (char_len <= i) + put_back (c); + if (! wide_flag) + { + p += (i + 1); + c = getch (); + continue; } + c = wc; #endif /* MULTIBYTE_CHARS */ } |