summaryrefslogtreecommitdiff
path: root/gcc/c-lex.c
diff options
context:
space:
mode:
authorbrolley <brolley@138bc75d-0d04-0410-961f-82ee72b054a4>1999-06-07 11:12:38 +0000
committerbrolley <brolley@138bc75d-0d04-0410-961f-82ee72b054a4>1999-06-07 11:12:38 +0000
commit460c49ee26bc4a8498629f2144a33fc11db63ec2 (patch)
treeaa345c251614d282169a1d808bb8f24771524aa7 /gcc/c-lex.c
parent7e93db1f4ab634c6234bced3fa7ec665bffb436d (diff)
downloadgcc-460c49ee26bc4a8498629f2144a33fc11db63ec2.tar.gz
Mon Jun 7 14:07:39 1999 Dave Brolley <brolley@cygnus.com>
* 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
Diffstat (limited to 'gcc/c-lex.c')
-rw-r--r--gcc/c-lex.c88
1 files changed, 67 insertions, 21 deletions
diff --git a/gcc/c-lex.c b/gcc/c-lex.c
index 27c65f3fa27..96ca224bf7c 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 */
}