more work on local variable support
[cparser] / lexer.c
diff --git a/lexer.c b/lexer.c
index 9dbd2fa..1300b3d 100644 (file)
--- a/lexer.c
+++ b/lexer.c
@@ -17,6 +17,7 @@
 
 static int         c;
 token_t            lexer_token;
+symbol_t          *symbol_L;
 static FILE       *input;
 static char        buf[1024 + MAX_PUTBACK];
 static const char *bufend;
@@ -88,11 +89,7 @@ static inline void next_char(void);
                lexer_token.source_position.linenr++; \
                code;
 
-static inline void eat(char c_type)
-{
-       assert(c == c_type);
-       next_char();
-}
+#define eat(c_type)  do { assert(c == c_type); next_char(); } while(0)
 
 static void maybe_concat_lines(void)
 {
@@ -113,6 +110,7 @@ static inline void next_char(void)
 {
        next_real_char();
 
+#if 0
        /* filter trigraphs */
        if(UNLIKELY(c == '\\')) {
                maybe_concat_lines();
@@ -148,6 +146,8 @@ static inline void next_char(void)
        }
 
 end_of_next_char:
+#endif
+       (void) maybe_concat_lines;
 #ifdef DEBUG_CHARS
        printf("nchar '%c'\n", c);
 #else
@@ -805,7 +805,7 @@ static void parse_preprocessor_identifier(void)
        }
 }
 
-static void parse_preprocessor_directive()
+static void parse_preprocessor_directive(void)
 {
        next_pp_token();
 
@@ -863,6 +863,12 @@ void lexer_next_preprocessing_token(void)
 
                SYMBOL_CHARS
                        parse_symbol();
+                       /* might be a wide string ( L"string" ) */
+                       if(c == '"' && (lexer_token.type == T_IDENTIFIER &&
+                          lexer_token.v.symbol == symbol_L)) {
+                               parse_string_literal();
+                               return;
+                       }
                        return;
 
                DIGITS
@@ -1041,6 +1047,8 @@ void lexer_open_stream(FILE *stream, const char *input_name)
        lexer_token.source_position.linenr     = 0;
        lexer_token.source_position.input_name = input_name;
 
+       symbol_L = symbol_table_insert("L");
+
        /* place a virtual \n at the beginning so the lexer knows that we're
         * at the beginning of a line */
        c = '\n';