aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--pp.c13
-rw-r--r--test/preprocess-macro-stringize-2.c5
-rw-r--r--test/preprocess-macro-stringize-2.pp3
3 files changed, 19 insertions, 2 deletions
diff --git a/pp.c b/pp.c
index c861852..c03e4b1 100644
--- a/pp.c
+++ b/pp.c
@@ -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"
+"'\"' \"\\\\\""