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:
parent
cd28936cf0
commit
505e038544
@ -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.
|
||||||
|
88
gcc/c-lex.c
88
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 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 */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user