about summary refs log tree commit diff stats
path: root/baremetal/shell/read.mu
diff options
context:
space:
mode:
Diffstat (limited to 'baremetal/shell/read.mu')
-rw-r--r--baremetal/shell/read.mu29
1 files changed, 25 insertions, 4 deletions
diff --git a/baremetal/shell/read.mu b/baremetal/shell/read.mu
index ced559b1..b6446b55 100644
--- a/baremetal/shell/read.mu
+++ b/baremetal/shell/read.mu
@@ -7,10 +7,31 @@ fn read-cell in: (addr gap-buffer), out: (addr handle cell) {
   #   token tree
   #   syntax tree
   rewind-gap-buffer in
-  read-symbol in, out
+  var token-storage: (stream byte 0x1000)  # strings can be large
+  var token/ecx: (addr stream byte) <- address token-storage
+  {
+    var done?/eax: boolean <- gap-buffer-scan-done? in
+    compare done?, 0/false
+    break-if-!=
+    next-token in, token
+    read-symbol token, out
+    loop
+  }
 }
 
-fn read-symbol in: (addr gap-buffer), _out: (addr handle cell) {
+fn next-token in: (addr gap-buffer), out: (addr stream byte) {
+  clear-stream out
+  {
+    var done?/eax: boolean <- gap-buffer-scan-done? in
+    compare done?, 0/false
+    break-if-!=
+    var g/eax: grapheme <- read-from-gap-buffer in
+    write-grapheme out, g
+    loop
+  }
+}
+
+fn read-symbol in: (addr stream byte), _out: (addr handle cell) {
   var out/eax: (addr handle cell) <- copy _out
   new-symbol out
   var out-a/eax: (addr cell) <- lookup *out
@@ -18,10 +39,10 @@ fn read-symbol in: (addr gap-buffer), _out: (addr handle cell) {
   var _out-data/eax: (addr stream byte) <- lookup *out-data-ah
   var out-data/edi: (addr stream byte) <- copy _out-data
   {
-    var done?/eax: boolean <- gap-buffer-scan-done? in
+    var done?/eax: boolean <- stream-empty? in
     compare done?, 0/false
     break-if-!=
-    var g/eax: grapheme <- read-from-gap-buffer in
+    var g/eax: grapheme <- read-grapheme in
     write-grapheme out-data, g
     loop
   }