mirror of
https://github.com/frida/tinycc
synced 2025-01-03 02:24:24 +03:00
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.
This commit is contained in:
parent
75243f744c
commit
f5f82abc99
2
TODO
2
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):
|
||||
|
||||
|
54
tccpp.c
54
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;
|
||||
}
|
||||
|
@ -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()-
|
||||
|
@ -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 -
|
||||
|
Loading…
Reference in New Issue
Block a user