about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorKartik K. Agaram <vc@akkartik.com>2015-05-27 22:25:01 -0700
committerKartik K. Agaram <vc@akkartik.com>2015-05-27 22:25:01 -0700
commit036ec49c606ab792f1705c024a176e47e1433488 (patch)
treeddf821c72503f39d3b090c661240aace6dd5ab96
parentd389a61a34c9c4562af69354726c18d6b83032c8 (diff)
downloadmu-036ec49c606ab792f1705c024a176e47e1433488.tar.gz
1494
-rw-r--r--050scenario.cc2
-rw-r--r--repl.mu193
2 files changed, 189 insertions, 6 deletions
diff --git a/050scenario.cc b/050scenario.cc
index 30e82989..5ed9faa1 100644
--- a/050scenario.cc
+++ b/050scenario.cc
@@ -88,7 +88,7 @@ time_t mu_time; time(&mu_time);
 cerr << "\nMu tests: " << ctime(&mu_time);
 for (long long int i = 0; i < SIZE(Scenarios); ++i) {
 //?   cerr << Passed << '\n'; //? 1
-//?   cerr << i << ": " << Scenarios.at(i).name << '\n'; //? 3
+//?   cerr << i << ": " << Scenarios.at(i).name << '\n'; //? 5
   run_mu_scenario(Scenarios.at(i));
   if (Passed) cerr << ".";
 }
diff --git a/repl.mu b/repl.mu
index c1364a6b..ddb7e6a2 100644
--- a/repl.mu
+++ b/repl.mu
@@ -63,10 +63,20 @@ recipe read-instruction [
       comment?:boolean <- equal c:character, 35:literal/hash
       break-unless comment?:boolean
       print-character x:address:screen, c:character, 4:literal/blue
+      result:address:buffer <- buffer-append result:address:buffer, c:character
       result:address:buffer, k:address:keyboard, x:address:screen <- slurp-comment result:address:buffer, k:address:keyboard, x:address:screen
       # continue appending to this instruction, whether comment ended or was backspaced out of
       loop +next-character:label
     }
+    # string
+    {
+      string?:boolean <- equal c:character, 91:literal/open-bracket
+      break-unless string?:boolean
+      print-character x:address:screen, c:character, 6:literal/cyan
+      result:address:buffer <- buffer-append result:address:buffer, c:character
+      result:address:buffer, _, k:address:keyboard, x:address:screen <- slurp-string result:address:buffer, k:address:keyboard, x:address:screen
+      loop +next-character:label
+    }
     # print
     print-character x:address:screen, c:character  # default color
     # append
@@ -77,7 +87,7 @@ recipe read-instruction [
     loop
   }
   result2:address:array:character <- buffer-to-array result:address:buffer
-  reply result2:address:array:character, k:address:keyboard, x:address:screen
+  reply result2:address:array:character, k:address:keyboard/same-as-ingredient:0, x:address:screen/same-as-ingredient:1
 ]
 
 # Simpler version of read-instruction that prints in the comment color and
@@ -98,12 +108,12 @@ recipe slurp-comment [
     {
       ctrl-d?:boolean <- equal c:character, 4:literal/ctrl-d/eof
       break-unless ctrl-d?:boolean
-      reply 0:literal, k:address:keyboard/same-as-ingredient:0, x:address:screen/same-as-ingredient:1
+      reply 0:literal, k:address:keyboard/same-as-ingredient:1, x:address:screen/same-as-ingredient:2
     }
     {
       null?:boolean <- equal c:character, 0:literal/null
       break-unless null?:boolean
-      reply 0:literal, k:address:keyboard/same-as-ingredient:0, x:address:screen/same-as-ingredient:1
+      reply 0:literal, k:address:keyboard/same-as-ingredient:1, x:address:screen/same-as-ingredient:2
     }
     # print
     print-character x:address:screen, c:character, 4:literal/blue
@@ -117,7 +127,7 @@ recipe slurp-comment [
       {
         reset-color?:boolean <- lesser-or-equal characters-slurped:number, 0:literal
         break-unless reset-color?:boolean
-        reply result:address:buffer, k:address:keyboard, x:address:screen
+        reply result:address:buffer, k:address:keyboard/same-as-ingredient:1, x:address:screen/same-as-ingredient:2
       }
       loop +next-character:label
     }
@@ -128,7 +138,58 @@ recipe slurp-comment [
     break-if done?:boolean
     loop
   }
-  reply result:address:buffer, k:address:keyboard, x:address:screen
+  reply result:address:buffer, k:address:keyboard/same-as-ingredient:1, x:address:screen/same-as-ingredient:2
+]
+
+# Version of read-instruction that prints in the string color and doesn't
+# handle comments. Does handle nested strings. Tracks an extra count in case
+# we backspace out of it, which it needs to return because recursion.
+recipe slurp-string [
+  default-space:address:array:location <- new location:type, 60:literal
+  result:address:buffer <- next-ingredient
+  k:address:keyboard <- next-ingredient
+  x:address:screen <- next-ingredient
+  # use this to track when backspace should reset color
+  characters-slurped:number <- copy 1:literal  # for the initial '[' that's already appended to result
+  {
+    +next-character
+    # read character
+    c:character, k:address:keyboard <- wait-for-key k:address:keyboard
+    # quit?
+    {
+      ctrl-d?:boolean <- equal c:character, 4:literal/ctrl-d/eof
+      break-unless ctrl-d?:boolean
+      reply 0:literal, 0:literal, k:address:keyboard/same-as-ingredient:1, x:address:screen/same-as-ingredient:2
+    }
+    {
+      null?:boolean <- equal c:character, 0:literal/null
+      break-unless null?:boolean
+      reply 0:literal, 0:literal, k:address:keyboard/same-as-ingredient:1, x:address:screen/same-as-ingredient:2
+    }
+    # print
+    print-character x:address:screen, c:character, 6:literal/cyan
+    # append
+    result:address:buffer <- buffer-append result:address:buffer, c:character
+    # backspace? decrement
+    {
+      backspace?:boolean <- equal c:character, 8:literal/backspace
+      break-unless backspace?:boolean
+      characters-slurped:number <- subtract characters-slurped:number, 1:literal
+      {
+        reset-color?:boolean <- lesser-or-equal characters-slurped:number, 0:literal
+        break-unless reset-color?:boolean
+        reply result:address:buffer/same-as-ingredient:0, 0:literal, k:address:keyboard/same-as-ingredient:1, x:address:screen/same-as-ingredient:2
+      }
+      loop +next-character:label
+    }
+    # otherwise increment
+    characters-slurped:number <- add characters-slurped:number, 1:literal
+    # done with this instruction?
+    done?:boolean <- equal c:character, 93:literal/close-bracket
+    break-if done?:boolean
+    loop
+  }
+  reply result:address:buffer/same-as-ingredient:0, characters-slurped:number, k:address:keyboard/same-as-ingredient:1, x:address:screen/same-as-ingredient:2
 ]
 
 scenario read-instruction-color-comment [
@@ -222,3 +283,125 @@ scenario read-instruction-cancel-comment-on-backspace3 [
     .                              .
   ]
 ]
+
+scenario read-instruction-color-string [
+#?   $start-tracing #? 1
+  assume-screen 30:literal/width, 5:literal/height
+  assume-keyboard [abc [string]
+]
+  run [
+    read-instruction keyboard:address, screen:address
+  ]
+  screen-should-contain [
+    .abc [string]                  .
+    .                              .
+  ]
+  screen-should-contain-in-color 6:literal/cyan, [
+    .    [string]                  .
+    .                              .
+  ]
+  screen-should-contain-in-color 7:literal/white, [
+    .abc                           .
+    .                              .
+  ]
+]
+
+scenario read-instruction-color-string-multiline [
+  assume-screen 30:literal/width, 5:literal/height
+  assume-keyboard [abc [line1
+line2]
+]
+  run [
+    read-instruction keyboard:address, screen:address
+  ]
+  screen-should-contain [
+    .abc [line1                    .
+    .line2]                        .
+    .                              .
+  ]
+  screen-should-contain-in-color 6:literal/cyan, [
+    .    [line1                    .
+    .line2]                        .
+    .                              .
+  ]
+  screen-should-contain-in-color 7:literal/white, [
+    .abc                           .
+    .                              .
+    .                              .
+  ]
+]
+
+scenario read-instruction-color-string-and-comment [
+  assume-screen 30:literal/width, 5:literal/height
+  assume-keyboard [abc [string]  # comment
+]
+  run [
+    read-instruction keyboard:address, screen:address
+  ]
+  screen-should-contain [
+    .abc [string]  # comment       .
+    .                              .
+  ]
+  screen-should-contain-in-color 4:literal/blue, [
+    .              # comment       .
+    .                              .
+  ]
+  screen-should-contain-in-color 6:literal/cyan, [
+    .    [string]                  .
+    .                              .
+  ]
+  screen-should-contain-in-color 7:literal/white, [
+    .abc                           .
+    .                              .
+  ]
+]
+
+scenario read-instruction-ignore-comment-inside-string [
+  assume-screen 30:literal/width, 5:literal/height
+  assume-keyboard [abc [string # not a comment]
+]
+  run [
+    read-instruction keyboard:address, screen:address
+  ]
+  screen-should-contain [
+    .abc [string # not a comment]  .
+    .                              .
+  ]
+  screen-should-contain-in-color 6:literal/cyan, [
+    .    [string # not a comment]  .
+    .                              .
+  ]
+  screen-should-contain-in-color 7:literal/white, [
+    .abc                           .
+    .                              .
+  ]
+  screen-should-contain-in-color 4:literal/blue, [
+    .                              .
+    .                              .
+  ]
+]
+
+scenario read-instruction-ignore-string-inside-comment [
+  assume-screen 30:literal/width, 5:literal/height
+  assume-keyboard [abc # comment [not a string]
+]
+  run [
+    read-instruction keyboard:address, screen:address
+  ]
+  screen-should-contain [
+    .abc # comment [not a string]  .
+    .                              .
+  ]
+  screen-should-contain-in-color 6:literal/cyan, [
+    .                              .
+    .                              .
+  ]
+  screen-should-contain-in-color 7:literal/white, [
+    .abc                           .
+    .                              .
+  ]
+  screen-should-contain-in-color 4:literal/blue, [
+    .    # comment [not a string]  .
+    .                              .
+  ]
+]