about summary refs log tree commit diff stats
path: root/tangle
diff options
context:
space:
mode:
Diffstat (limited to 'tangle')
-rw-r--r--tangle/003tangle.cc9
-rw-r--r--tangle/003tangle.test.cc14
2 files changed, 20 insertions, 3 deletions
diff --git a/tangle/003tangle.cc b/tangle/003tangle.cc
index 3573c11f..7eb62f27 100644
--- a/tangle/003tangle.cc
+++ b/tangle/003tangle.cc
@@ -251,10 +251,13 @@ void slurp_tangle_string(istream& in, ostream& out) {
   in.get();
   char c;
   while (in >> c) {
-    if (c == '\\')  // only works for double-quotes
+    if (c == '\\') {
+      // skip backslash and save next character unconditionally
+      in >> c;
+      out << c;
       continue;
-    if (c == '"')
-      break;
+    }
+    if (c == '"') break;
     out << c;
   }
 }
diff --git a/tangle/003tangle.test.cc b/tangle/003tangle.test.cc
index 88901ef7..6d6b88a7 100644
--- a/tangle/003tangle.test.cc
+++ b/tangle/003tangle.test.cc
@@ -76,6 +76,20 @@ void test_tangle_with_tanglecomments_inside_directive() {
   CHECK_TRACE_DOESNT_CONTAIN("tangle", "//: 1");
 }
 
+void test_tangle_with_multiword_directives() {
+  istringstream in("a b\nc\n:(after \"a b\")\nd\n");
+  list<Line> dummy;
+  tangle(in, dummy);
+  CHECK_TRACE_CONTENTS("tangle", "a bdc");
+}
+
+void test_tangle_with_quoted_multiword_directives() {
+  istringstream in("a \"b\"\nc\n:(after \"a \\\"b\\\"\")\nd\n");
+  list<Line> dummy;
+  tangle(in, dummy);
+  CHECK_TRACE_CONTENTS("tangle", "a \"b\"dc");
+}
+
 void test_tangle2() {
   istringstream in("a\nb\nc\n:(after b)\nd\n");
   list<Line> dummy;