diff options
Diffstat (limited to 'baremetal/shell/read.mu')
-rw-r--r-- | baremetal/shell/read.mu | 29 |
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 } |