aboutsummaryrefslogtreecommitdiff
path: root/tccpp.c
diff options
context:
space:
mode:
authorEdmund Grimley Evans <Edmund.Grimley.Evans@gmail.com>2016-05-04 21:37:11 +0100
committerEdmund Grimley Evans <Edmund.Grimley.Evans@gmail.com>2016-05-09 19:27:31 +0100
commitf5f82abc99424c4ece836000934fcf57a867c635 (patch)
tree2e70deb54bcac302987e7a20f124041c34c00f51 /tccpp.c
parent75243f744c60e588ee68c1a47f1ce691a36c07a7 (diff)
downloadtinycc-f5f82abc99424c4ece836000934fcf57a867c635.tar.gz
tinycc-f5f82abc99424c4ece836000934fcf57a867c635.tar.bz2
Insert spaces between certain tokens when tcc is invoked with -E.
Insert a space when it is required to prevent mistokenisation of the output, and also in a few cases where it is not strictly required, imitating GCC's behaviour.
Diffstat (limited to 'tccpp.c')
-rw-r--r--tccpp.c54
1 files changed, 53 insertions, 1 deletions
diff --git a/tccpp.c b/tccpp.c
index c5b0192..718401d 100644
--- a/tccpp.c
+++ b/tccpp.c
@@ -3644,12 +3644,61 @@ static void pp_debug_builtins(TCCState *s1)
define_print(s1, v);
}
+static int need_space(int prev_tok, int tok, const char *tokstr)
+{
+ const char *sp_chars = "";
+ if ((prev_tok >= TOK_IDENT || prev_tok == TOK_PPNUM) &&
+ (tok >= TOK_IDENT || tok == TOK_PPNUM))
+ return 1;
+ switch (prev_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;
+ }
+ return !!strchr(sp_chars, tokstr[0]);
+}
+
/* Preprocess the current file */
ST_FUNC int tcc_preprocess(TCCState *s1)
{
BufferedFile **iptr;
int token_seen, spcs, level;
Sym *define_start;
+ const char *tokstr;
preprocess_init(s1);
ch = file->buf_ptr[0];
@@ -3707,9 +3756,12 @@ ST_FUNC int tcc_preprocess(TCCState *s1)
++file->line_ref;
}
+ tokstr = get_tok_str(tok, &tokc);
+ if (!spcs && need_space(token_seen, tok, tokstr))
+ ++spcs;
while (spcs)
fputs(" ", s1->ppfp), --spcs;
- fputs(get_tok_str(tok, &tokc), s1->ppfp);
+ fputs(tokstr, s1->ppfp);
token_seen = tok;
}