about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--072scenario_screen.cc7
-rw-r--r--edit.mu47
2 files changed, 50 insertions, 4 deletions
diff --git a/072scenario_screen.cc b/072scenario_screen.cc
index fe91a823..a2824a07 100644
--- a/072scenario_screen.cc
+++ b/072scenario_screen.cc
@@ -327,9 +327,12 @@ void dump_screen() {
   assert(Memory[screen_data_start] == screen_width*screen_height);
   long long int curr = screen_data_start+1;  // skip length
   for (long long int row = 0; row < screen_height; ++row) {
-//?     cerr << curr << ":\n"; //? 1
+//?     cerr << curr << ":\n"; //? 2
     for (long long int col = 0; col < screen_width; ++col) {
-      cerr << static_cast<char>(Memory[curr]);
+      if (Memory[curr])
+        cerr << static_cast<char>(Memory[curr]);
+      else
+        cerr << ' ';
       curr += /*size of screen-cell*/2;
     }
     cerr << '\n';
diff --git a/edit.mu b/edit.mu
index 1f1527ca..ef545d18 100644
--- a/edit.mu
+++ b/edit.mu
@@ -17,13 +17,41 @@ recipe edit [
   default-space:address:array:location <- new location:type, 30:literal
   s:address:array:character <- next-ingredient
   screen:address <- next-ingredient
+  # no clipping of bounds
   top:number <- next-ingredient
   left:number <- next-ingredient
   bottom:number <- next-ingredient
   right:number <- next-ingredient
   keyboard:address <- next-ingredient
-  move-cursor screen:address, top:number, left:number
-  print-string screen:address, s:address:array:character
+  # traversing inside s
+  len:number <- length s:address:array:character/deref
+  i:number <- copy 0:literal
+  # traversing inside screen
+  row:number <- copy top:number
+  column:number <- copy left:number
+  move-cursor screen:address, row:number, column:number
+  {
+    +next-character
+    done?:boolean <- greater-or-equal i:number, len:number
+    break-if done?:boolean
+    off-screen?:boolean <- greater-or-equal row:number, bottom:number
+    break-if off-screen?:boolean
+    c:character <- index s:address:array:character/deref, i:number
+    {
+      # newline? move to left rather than 0
+      newline?:boolean <- equal c:character, 10:literal/newline
+      break-unless newline?:boolean
+      row:number <- add row:number, 1:literal
+      column:number <- copy left:number
+      move-cursor screen:address, row:number, column:number
+      i:number <- add i:number, 1:literal
+      loop +next-character:label
+    }
+    print-character screen:address, c:character
+    i:number <- add i:number, 1:literal
+    column:number <- add column:number, 1:literal
+    loop
+  }
 ]
 
 scenario edit-prints-multiple-lines [
@@ -54,3 +82,18 @@ scenario edit-handles-offsets [
     .     .
   ]
 ]
+
+scenario edit-prints-multiple-lines-at-offset [
+  assume-screen 5:literal/width, 3:literal/height
+  assume-keyboard []
+  run [
+    s:address:array:character <- new [abc
+def]
+    s2:address:array:character, screen:address, keyboard:address <- edit s:address:array:character, screen:address, 0:literal/top, 1:literal/left, 10:literal/bottom, 5:literal/right, keyboard:address
+  ]
+  screen-should-contain [
+    . abc .
+    . def .
+    .     .
+  ]
+]