diff --git a/TODO b/TODO index bc7fb8b..e6e5b07 100644 --- a/TODO +++ b/TODO @@ -31,7 +31,6 @@ Bugs: - make libtcc fully reentrant (except for the compilation stage itself). - struct/union/enum definitions in nested scopes (see also Debian bug #770657) - __STDC_IEC_559__: float f(void) { static float x = 0.0 / 0.0; return x; } -- preprocessor: #define Y(x) Z(x) {newline} #define X Y {newline} X(X(1)) Portability: @@ -94,7 +93,6 @@ Not critical: - handle void (__attribute__() *ptr)() - VLAs are implemented in a way that is not compatible with signals: http://lists.gnu.org/archive/html/tinycc-devel/2015-11/msg00018.html -- output with -E should include spaces: #define n 0xe {newline} n+1 Fixed (probably): diff --git a/tccpp.c b/tccpp.c index 94f0b5f..ad35687 100644 --- a/tccpp.c +++ b/tccpp.c @@ -3670,6 +3670,8 @@ ST_FUNC int tcc_preprocess(TCCState *s1) { BufferedFile **iptr; int token_seen, spcs, level; + const char *sp_chars = ""; /* insert space before any of these */ + int prev_tok = 0; preprocess_init(s1); ch = file->buf_ptr[0]; @@ -3719,8 +3721,57 @@ ST_FUNC int tcc_preprocess(TCCState *s1) ++file->line_ref; token_seen = 0; } - if (s1->ppfp) - fputs(get_tok_str(tok, &tokc), s1->ppfp); + if (s1->ppfp) { + const char *t = get_tok_str(tok, &tokc); + if (strchr(sp_chars, t[0]) || + ((tok >= TOK_IDENT || tok == TOK_PPNUM) && + (prev_tok >= TOK_IDENT || prev_tok == TOK_PPNUM))) + fputs(" ", s1->ppfp); + fputs(t, s1->ppfp); + prev_tok = tok; + switch (tok) { + case '+': + sp_chars = "+="; + break; + case '-': + sp_chars = "-=>"; + break; + case '*': + case '/': + case '%': + case '^': + case '=': + case '!': + case TOK_A_SHL: + case TOK_A_SAR: + sp_chars = "="; + break; + case '&': + sp_chars = "&="; + break; + case '|': + sp_chars = "|="; + break; + case '<': + sp_chars = "<="; + break; + case '>': + sp_chars = ">="; + break; + case '.': + sp_chars = "."; + break; + case '#': + sp_chars = "#"; + break; + case TOK_PPNUM: + sp_chars = "+-"; + break; + default: + sp_chars = ""; + break; + } + } } return 0; diff --git a/tests/pp/15.c b/tests/pp/15.c index 28a12bd..dc2b8d1 100644 --- a/tests/pp/15.c +++ b/tests/pp/15.c @@ -19,3 +19,8 @@ return A + B; #define B1 C1+2 #define C1 A1+3 return A1 + B1; + +#define i() x +#define n() 1 +i()i()n()n()i() +i()+i()-n()+n()- diff --git a/tests/pp/15.expect b/tests/pp/15.expect index 7ccee4a..d3d3dd5 100644 --- a/tests/pp/15.expect +++ b/tests/pp/15.expect @@ -1,6 +1,26 @@ + + Z(1) Z(Z(1)) Z(Z(Z(Z(Z(1))))) + + + return A + B; + + + + + + return A+1 + B+1; + + + + return A1+3 +2 +1 + B1+1 +3 +2; + + + +x x 1 1 x +x+x-1 +1 -