X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=preprocessor.c;h=cc6308bbe7fde49bd560f6b468fbecd16ac14e0c;hb=127a634aa53da8c37ee50f365184cccad67df0d8;hp=e3e65fbaea9d718f306aa85e8f65e3b6f63980bf;hpb=6025937d4911b04456148671a111c364556dcd10;p=cparser diff --git a/preprocessor.c b/preprocessor.c index e3e65fb..cc6308b 100644 --- a/preprocessor.c +++ b/preprocessor.c @@ -195,8 +195,7 @@ static inline void next_real_char(void) { assert(input.bufpos <= input.bufend); if (input.bufpos >= input.bufend) { - size_t n = decode(input.input, input.buf + MAX_PUTBACK, - sizeof(input.buf)/sizeof(input.buf[0]) - MAX_PUTBACK); + size_t const n = decode(input.input, input.buf + MAX_PUTBACK, lengthof(input.buf) - MAX_PUTBACK); if (n == 0) { input.c = EOF; return; @@ -362,50 +361,41 @@ static int digit_value(int digit) * * @param first_digit the already read first digit */ -static int parse_octal_sequence(const int first_digit) +static utf32 parse_octal_sequence(const utf32 first_digit) { assert(is_octal_digit(first_digit)); - int value = digit_value(first_digit); + utf32 value = digit_value(first_digit); if (!is_octal_digit(input.c)) return value; value = 8 * value + digit_value(input.c); next_char(); if (!is_octal_digit(input.c)) return value; value = 8 * value + digit_value(input.c); next_char(); + return value; - if (char_is_signed) { - return (signed char) value; - } else { - return (unsigned char) value; - } } /** * Parses a hex character sequence. */ -static int parse_hex_sequence(void) +static utf32 parse_hex_sequence(void) { - int value = 0; + utf32 value = 0; while (isxdigit(input.c)) { value = 16 * value + digit_value(input.c); next_char(); } - - if (char_is_signed) { - return (signed char) value; - } else { - return (unsigned char) value; - } + return value; } /** * Parse an escape sequence. */ -static int parse_escape_sequence(void) +static utf32 parse_escape_sequence(void) { eat('\\'); - int ec = input.c; + utf32 const ec = input.c; next_char(); switch (ec) { @@ -434,10 +424,23 @@ static int parse_escape_sequence(void) case EOF: parse_error("reached end of file while parsing escape sequence"); return EOF; - default: - parse_error("unknown escape sequence"); + /* \E is not documented, but handled, by GCC. It is acceptable according + * to §6.11.4, whereas \e is not. */ + case 'E': + case 'e': + if (c_mode & _GNUC) + return 27; /* hopefully 27 is ALWAYS the code for ESCAPE */ + break; + case 'u': + case 'U': + parse_error("universal character parsing not implemented yet"); return EOF; + default: + break; } + /* §6.4.4.4:8 footnote 64 */ + parse_error("unknown escape sequence"); + return EOF; } static const char *identify_string(char *string)