- add support for \e escape
[cparser] / lexer.c
diff --git a/lexer.c b/lexer.c
index 635c3ca..f1b00e3 100644 (file)
--- a/lexer.c
+++ b/lexer.c
@@ -56,6 +56,7 @@ static char        buf[1024 + MAX_PUTBACK];
 static const char *bufend;
 static const char *bufpos;
 static strset_t    stringset;
+bool               allow_dollar_in_symbol = true;
 
 /**
  * Prints a parse error message at the current token.
@@ -194,6 +195,7 @@ end_of_next_char:;
 }
 
 #define SYMBOL_CHARS  \
+       case '$': if (!allow_dollar_in_symbol) goto dollar_sign; \
        case 'a':         \
        case 'b':         \
        case 'c':         \
@@ -281,6 +283,7 @@ static void parse_symbol(void)
                        break;
 
                default:
+dollar_sign:
                        goto end_symbol;
                }
        }
@@ -749,7 +752,7 @@ static int parse_escape_sequence(void)
        int ec = c;
        next_char();
 
-       switch(ec) {
+       switch (ec) {
        case '"':  return '"';
        case '\'': return '\'';
        case '\\': return '\\';
@@ -775,6 +778,10 @@ static int parse_escape_sequence(void)
        case EOF:
                parse_error("reached end of file while parsing escape sequence");
                return EOF;
+       case 'e':
+               if (c_mode & _GNUC)
+                       return 27;   /* hopefully 27 is ALWAYS the code for ESACAPE */
+               /*fallthrough*/
        default:
                parse_error("unknown escape sequence");
                return EOF;
@@ -1564,6 +1571,7 @@ void lexer_next_preprocessing_token(void)
                        return;
 
                default:
+dollar_sign:
                        errorf(&lexer_token.source_position, "unknown character '%c' found", c);
                        next_char();
                        lexer_token.type = T_ERROR;