Commit 505e0385 by Dave Brolley Committed by Dave Brolley

c-lex.c (GETC): Redefine to call getch.

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.

From-SVN: r27393
parent cd28936c
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.
Mon Jun 7 13:33:39 1999 Dave Brolley <brolley@cygnus.com> Mon Jun 7 13:33:39 1999 Dave Brolley <brolley@cygnus.com>
* cpplib.c (do_define): Cast `alloca' return value. * cpplib.c (do_define): Cast `alloca' return value.
......
...@@ -71,10 +71,47 @@ extern int yy_get_token (); ...@@ -71,10 +71,47 @@ extern int yy_get_token ();
#define GETC() (yy_cur < yy_lim ? *yy_cur++ : yy_get_token ()) #define GETC() (yy_cur < yy_lim ? *yy_cur++ : yy_get_token ())
#define UNGETC(c) ((c) == EOF ? 0 : yy_cur--) #define UNGETC(c) ((c) == EOF ? 0 : yy_cur--)
#else
#define GETC() getc (finput) #else /* ! USE_CPPLIB */
#define UNGETC(c) ungetc (c, finput)
#endif #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. /* the declaration found for the last IDENTIFIER token read in.
yylex must look this up to detect typedefs, which get token type TYPENAME, yylex must look this up to detect typedefs, which get token type TYPENAME,
...@@ -1972,12 +2009,17 @@ yylex () ...@@ -1972,12 +2009,17 @@ yylex ()
else else
{ {
if (char_len == -1) if (char_len == -1)
{
warning ("Ignoring invalid multibyte character"); warning ("Ignoring invalid multibyte character");
if (wide_flag) /* Replace all but the first byte. */
c = wc; for (--i; i > 1; --i)
UNGETC (token_buffer[i]);
wc = token_buffer[1];
}
#ifdef MAP_CHARACTER #ifdef MAP_CHARACTER
else c = MAP_CHARACTER (wc);
c = MAP_CHARACTER (c); #else
c = wc;
#endif #endif
} }
#else /* ! MULTIBYTE_CHARS */ #else /* ! MULTIBYTE_CHARS */
...@@ -2095,9 +2137,14 @@ yylex () ...@@ -2095,9 +2137,14 @@ yylex ()
c = GETC (); c = GETC ();
} }
if (char_len == -1) if (char_len == -1)
warning ("Ignoring invalid multibyte character");
else
{ {
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 */ /* mbtowc sometimes needs an extra char before accepting */
if (char_len <= i) if (char_len <= i)
UNGETC (c); UNGETC (c);
...@@ -2108,7 +2155,6 @@ yylex () ...@@ -2108,7 +2155,6 @@ yylex ()
continue; continue;
} }
c = wc; c = wc;
}
#endif /* MULTIBYTE_CHARS */ #endif /* MULTIBYTE_CHARS */
} }
......
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