about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--014literal_string.cc30
-rw-r--r--089scenario_filesystem.cc8
-rw-r--r--edit/011-errors.mu7
-rw-r--r--sandbox/011-errors.mu7
4 files changed, 34 insertions, 18 deletions
diff --git a/014literal_string.cc b/014literal_string.cc
index 421e873f..ec6a859f 100644
--- a/014literal_string.cc
+++ b/014literal_string.cc
@@ -64,7 +64,7 @@ void slurp_quoted_comment_oblivious(istream& in, ostream& out) {
   while (has_data(in)) {
     char c = in.get();
     if (c == '\\') {
-      out << static_cast<char>(in.get());
+      slurp_one_past_backslashes(in, out);
       continue;
     }
     out << c;
@@ -83,7 +83,7 @@ void slurp_quoted_comment_aware(istream& in, ostream& out) {
   char c;
   while (in >> c) {
     if (c == '\\') {
-      out << static_cast<char>(in.get());
+      slurp_one_past_backslashes(in, out);
       continue;
     }
     if (c == '#') {
@@ -145,6 +145,28 @@ void strip_last(string& s) {
   if (!s.empty()) s.erase(SIZE(s)-1);
 }
 
+void slurp_one_past_backslashes(istream& in, ostream& out) {
+  // When you encounter a backslash, strip it out and pass through any
+  // following run of backslashes. If we 'escaped' a single following
+  // character, then the character '\' would be:
+  //   '\\' escaped once
+  //   '\\\\' escaped twice
+  //   '\\\\\\\\' escaped thrice (8 backslashes)
+  // ..and so on. With our approach it'll be:
+  //   '\\' escaped once
+  //   '\\\' escaped twice
+  //   '\\\\' escaped thrice
+  // This only works as long as backslashes aren't also overloaded to create
+  // special characters. So Mu doesn't follow C's approach of overloading
+  // backslashes both to escape quote characters and also as a notation for
+  // unprintable characters like '\n'.
+  while (has_data(in)) {
+    char c = in.get();
+    out << c;
+    if (c != '\\') break;
+  }
+}
+
 :(scenario string_literal_nested)
 def main [
   1:address:array:character <- copy [abc [def]]
@@ -157,10 +179,10 @@ def main [
 ]
 +parse:   ingredient: {"abc [def": "literal-string"}
 
-:(scenario string_literal_escaped_comment_aware)
+:(scenario string_literal_escaped_twice)
 def main [
   1:address:array:character <- copy [
-abc \\\[def]
+abc \\[def]
 ]
 +parse:   ingredient: {"\nabc \[def": "literal-string"}
 
diff --git a/089scenario_filesystem.cc b/089scenario_filesystem.cc
index 120d30b7..8acdac0b 100644
--- a/089scenario_filesystem.cc
+++ b/089scenario_filesystem.cc
@@ -54,13 +54,9 @@ scenario assume-filesystem [
   local-scope
   assume-filesystem [
     # file 'a' containing a '|'
-    # ugly as hell that this requires 8 (!) backslashes for 3 '[' block escapes
-    # todo: use Sam Putman's idea to change the delimitors for the '[' blocks
-    # to:
-    #   [''[ ... ['[ ... [ ... ] ... ]'] ... ]'']
-    # That way we'd need just a single backslash -- to escape the |...| environment.
+    # need to escape '\' once for each block
     [a] <- [
-      |x\\\\\\\\|yz|
+      |x\\\\|yz|
     ]
   ]
   data:address:array:file-mapping <- get *filesystem:address:filesystem, data:offset
diff --git a/edit/011-errors.mu b/edit/011-errors.mu
index 080d5d37..774aedb1 100644
--- a/edit/011-errors.mu
+++ b/edit/011-errors.mu
@@ -377,10 +377,9 @@ scenario run-shows-unbalanced-bracket-errors [
   assume-screen 100/width, 15/height
   # recipe is incomplete (unbalanced '[')
   1:address:array:character <- new [ 
-recipe foo «
+recipe foo \\[
   x <- copy 0
 ]
-  replace 1:address:array:character, 171/«, 91  # '['
   2:address:array:character <- new [foo]
   3:address:programming-environment-data <- new-programming-environment screen:address:screen, 1:address:array:character, 2:address:array:character
   assume-console [
@@ -392,10 +391,10 @@ recipe foo «
   screen-should-contain [
     .  errors found                                                                   run (F4)           .
     .                                                  ┊foo                                              .
-    .recipe foo \\\[                                      ┊━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━.
+    .recipe foo \\[                                      ┊━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━.
     .  x <- copy 0                                     ┊                                                 .
     .                                                  ┊                                                 .
-    .9: unbalanced '\\\[' for recipe                      ┊                                                 .
+    .9: unbalanced '\\[' for recipe                      ┊                                                 .
     .┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┊                                                 .
     .                                                  ┊                                                 .
   ]
diff --git a/sandbox/011-errors.mu b/sandbox/011-errors.mu
index e326e446..f2652aaa 100644
--- a/sandbox/011-errors.mu
+++ b/sandbox/011-errors.mu
@@ -362,10 +362,9 @@ scenario run-shows-unbalanced-bracket-errors [
   assume-screen 50/width, 20/height
   # recipe is incomplete (unbalanced '[')
   1:address:array:character <- new [ 
-recipe foo «
+recipe foo \\[
   x <- copy 0
 ]
-  replace 1:address:array:character, 171/«, 91  # '['
   2:address:array:character <- new [foo]
   3:address:programming-environment-data <- new-programming-environment screen:address:screen, 2:address:array:character
   assume-console [
@@ -380,8 +379,8 @@ recipe foo «
     .━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━.
     .0   edit           copy           delete          .
     .foo                                               .
-    .9: unbalanced '\\\[' for recipe                      .
-    .9: unbalanced '\\\[' for recipe                      .
+    .9: unbalanced '\\[' for recipe                      .
+    .9: unbalanced '\\[' for recipe                      .
     .━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━.
     .                                                  .
   ]