blob: c43b3add18ee29c14eafa6e3e9de0a2cac7a76b0 [file] [log] [blame]
// { dg-additional-options "-Wno-return-type" }
typedef unsigned int source_location;
typedef source_location location_t;
extern void error_at (location_t, const char *, ...)
__attribute__ ((__format__ (__gcc_tdiag__, 2, 3)))
__attribute__ ((__nonnull__ (2)));
class Lex
{
static int fetch_char (const char *str, unsigned int *value);
location_t location () const;
const char *advance_one_utf8_char (const char *, unsigned int *, bool *);
const char *advance_one_char (const char *, bool, unsigned int *, bool *);
int lineoff_;
int lineno_;
};
int
Lex::fetch_char (const char *p, unsigned int *value)
{
unsigned char c = *p;
if (c <= 0x7f)
{
return 1;
}
else if ((c & 0xe0) == 0xc0 && (p[1] & 0xc0) == 0x80)
{
*value = (((c & 0x1f) << 6) + (p[1] & 0x3f));
}
{
*value = (((c & 0xf) << 12) + (p[2] & 0x3f));
}
}
const char *
Lex::advance_one_utf8_char (const char *p, unsigned int *value,
bool * issued_error)
{
*issued_error = false;
if (*p == '\0')
{
*issued_error = true;
return p + 1;
}
int adv = Lex::fetch_char (p, value);
if (*value == 0xfeff && (this->lineno_ != 1 || this->lineoff_ != 0))
{
*issued_error = true;
}
return p + adv;
}
const char *
Lex::advance_one_char (const char *p, bool is_single_quote,
unsigned int *value, bool * is_character)
{
{
bool issued_error;
const char *ret = this->advance_one_utf8_char (p, value, &issued_error);
if (is_single_quote
&& (*value == '\'' || *value == '\n') && !issued_error)
error_at (this->location (), "invalid character literal");
}
return 0;
}