aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgrischka <grischka>2016-10-01 21:57:40 +0200
committergrischka <grischka>2016-10-01 21:57:40 +0200
commit8afb8ccba241bbff56ef62e40adbb801ffd1c559 (patch)
treed5943ae90376f3b252d71d14f2c98ee6dc02e62c
parentc5b9ae4e3f5f4037fc3816bcbcec60982734196b (diff)
downloadtinycc-8afb8ccba241bbff56ef62e40adbb801ffd1c559.tar.gz
tinycc-8afb8ccba241bbff56ef62e40adbb801ffd1c559.tar.bz2
tccpp: token ## pasting: preserve parts if pasting fails
for example #define LBL(name) _ ## name ## : LBL(main) will give two tokens '_main' and ':' and the warning
-rw-r--r--tccpp.c22
1 files changed, 12 insertions, 10 deletions
diff --git a/tccpp.c b/tccpp.c
index a3622a7..5fc15ed 100644
--- a/tccpp.c
+++ b/tccpp.c
@@ -3219,7 +3219,7 @@ static int macro_subst_tok(
static int paste_tokens(int t1, CValue *v1, int t2, CValue *v2)
{
CString cstr;
- int n;
+ int n, ret = 1;
cstr_new(&cstr);
if (t1 != TOK_PLCHLDR)
@@ -3237,15 +3237,15 @@ static int paste_tokens(int t1, CValue *v1, int t2, CValue *v2)
break;
if (is_space(tok))
continue;
- tcc_warning("pasting <%.*s> and <%s> does not give a valid preprocessing token",
- n, cstr.data, (char*)cstr.data + n);
+ tcc_warning("pasting \"%.*s\" and \"%s\" does not give a valid"
+ " preprocessing token", n, cstr.data, (char*)cstr.data + n);
+ ret = 0;
break;
}
tcc_close();
-
//printf("paste <%s>\n", (char*)cstr.data);
cstr_free(&cstr);
- return 0;
+ return ret;
}
/* handle the '##' operator. Return NULL if no '##' seen. Otherwise
@@ -3284,13 +3284,15 @@ static inline int *macro_twosharps(const int *ptr0)
/* given 'a##b', remove nosubsts preceding 'b' */
while ((t1 = *++ptr) == TOK_NOSUBST)
;
- if (t1 && t1 != TOK_TWOSHARPS
- && t1 != ':') /* 'a##:' don't build a new token */
- {
+ if (t1 && t1 != TOK_TWOSHARPS) {
TOK_GET(&t1, &ptr, &cv1);
if (t != TOK_PLCHLDR || t1 != TOK_PLCHLDR) {
- paste_tokens(t, &cval, t1, &cv1);
- t = tok, cval = tokc;
+ if (paste_tokens(t, &cval, t1, &cv1)) {
+ t = tok, cval = tokc;
+ } else {
+ tok_str_add2(&macro_str1, t, &cval);
+ t = t1, cval = cv1;
+ }
}
}
}