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
This commit is contained in:
Dave Brolley 1999-06-07 11:12:38 +00:00 committed by Dave Brolley
parent cd28936cf0
commit 505e038544
2 changed files with 77 additions and 21 deletions

View File

@ -1,3 +1,13 @@
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.

View File

@ -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 ()
else else
{ {
if (char_len == -1) if (char_len == -1)
warning ("Ignoring invalid multibyte character"); {
if (wide_flag) warning ("Ignoring invalid multibyte character");
c = wc; /* Replace all but the first byte. */
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,20 +2137,24 @@ yylex ()
c = GETC (); c = GETC ();
} }
if (char_len == -1) if (char_len == -1)
warning ("Ignoring invalid multibyte character");
else
{ {
/* mbtowc sometimes needs an extra char before accepting */ warning ("Ignoring invalid multibyte character");
if (char_len <= i) /* Replace all except the first byte. */
UNGETC (c); UNGETC (c);
if (! wide_flag) for (--i; i > 0; --i)
{ UNGETC (p[i]);
p += (i + 1); char_len = 1;
c = GETC ();
continue;
}
c = wc;
} }
/* 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 */ #endif /* MULTIBYTE_CHARS */
} }