diff options
-rw-r--r-- | pp.c | 13 | ||||
-rw-r--r-- | test/preprocess-macro-stringize-2.c | 5 | ||||
-rw-r--r-- | test/preprocess-macro-stringize-2.pp | 3 |
3 files changed, 19 insertions, 2 deletions
@@ -386,9 +386,18 @@ stringize(struct array *buf, struct token *t) { const char *lit; + if ((t->space || t->kind == TNEWLINE) && ((char *)buf->val)[buf->len - 1] != ' ') + arrayaddbuf(buf, " ", 1); lit = t->lit ? t->lit : tokstr[t->kind]; - /* XXX: double escape string literal */ - arrayaddbuf(buf, lit, strlen(lit)); + if (t->kind == TSTRINGLIT || t->kind == TCHARCONST) { + for (; *lit; ++lit) { + if (*lit == '\\' || *lit == '"') + arrayaddbuf(buf, "\\", 1); + arrayaddbuf(buf, lit, 1); + } + } else if (lit) { + arrayaddbuf(buf, lit, strlen(lit)); + } } static bool diff --git a/test/preprocess-macro-stringize-2.c b/test/preprocess-macro-stringize-2.c new file mode 100644 index 0000000..81862b6 --- /dev/null +++ b/test/preprocess-macro-stringize-2.c @@ -0,0 +1,5 @@ +#define str(x) # x +str(@) +str(12 x- 3 + abc) +str('"' "\\") diff --git a/test/preprocess-macro-stringize-2.pp b/test/preprocess-macro-stringize-2.pp new file mode 100644 index 0000000..1dad46c --- /dev/null +++ b/test/preprocess-macro-stringize-2.pp @@ -0,0 +1,3 @@ +"@" +"12 x- 3 abc" +"'\"' \"\\\\\"" |