From 540cd6fde7425071415250aea2c51e371dd3734f Mon Sep 17 00:00:00 2001 From: bellard Date: Fri, 26 Jul 2002 22:59:19 +0000 Subject: [PATCH] fixed preprocessor expression parsing --- tcc.c | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/tcc.c b/tcc.c index f37b687..63a2971 100644 --- a/tcc.c +++ b/tcc.c @@ -224,6 +224,7 @@ typedef struct TokenString { struct BufferedFile *file; int ch, ch1, tok, tok1; CValue tokc, tok1c; +int return_linefeed; /* if true, line feed is returned as a token */ /* sections */ Section **sections; @@ -426,7 +427,8 @@ struct TCCState { #define TOK_A_SHL 0x81 #define TOK_A_SAR 0x82 -#define TOK_EOF (-1) /* end of file */ +#define TOK_EOF (-1) /* end of file */ +#define TOK_LINEFEED 10 /* line feed */ /* all identificators and strings have token above that */ #define TOK_IDENT 256 @@ -1409,10 +1411,7 @@ int expr_preprocess(void) TokenString str; tok_str_new(&str); - while (1) { - skip_spaces(); - if (ch == '\n') - break; + while (tok != TOK_LINEFEED && tok != TOK_EOF) { next(); /* do macro subst */ if (tok == TOK_DEFINED) { next_nomacro(); @@ -1507,7 +1506,7 @@ void parse_define(void) tok_str_add(&str, 0); #ifdef PP_DEBUG printf("define %s %d: ", get_tok_str(v, NULL), t); - tok_print(str); + tok_print(str.str); #endif s = sym_push1(&define_stack, v, t, (int)str.str); s->next = first; @@ -1521,6 +1520,7 @@ void preprocess(void) BufferedFile *f; Sym *s; + return_linefeed = 1; /* linefeed will be returned as a token */ cinp(); next_nomacro(); redo: @@ -1598,6 +1598,8 @@ void preprocess(void) if (do_debug) { put_stabs(file->filename, N_BINCL, 0, 0, 0); } + ch = '\n'; + goto the_end; } else if (tok == TOK_IFNDEF) { c = 1; goto do_ifdef; @@ -1659,8 +1661,10 @@ void preprocess(void) error("#error"); } /* ignore other preprocess commands or #! for C scripts */ - while (ch != '\n' && ch != -1) - cinp(); + while (tok != TOK_LINEFEED && tok != TOK_EOF) + next_nomacro(); + the_end: + return_linefeed = 0; } /* read a number in base b */ @@ -2043,6 +2047,11 @@ void next_nomacro1(void) /* skip spaces */ while(1) { while (ch == '\n') { + /* during preprocessor parsing, '\n' is a token */ + if (return_linefeed) { + tok = TOK_LINEFEED; + return; + } cinp(); while (ch == ' ' || ch == '\t') cinp(); @@ -2459,7 +2468,7 @@ void next(void) } } #if defined(DEBUG) - printf("token = %s\n", get_tok_str(tok, tokc)); + printf("token = %s\n", get_tok_str(tok, &tokc)); #endif }