diff options
author | Kartik K. Agaram <vc@akkartik.com> | 2021-02-21 22:17:26 -0800 |
---|---|---|
committer | Kartik K. Agaram <vc@akkartik.com> | 2021-02-21 22:17:26 -0800 |
commit | 87fe53e691d3bbd78fa5c3d25e0228b469802040 (patch) | |
tree | 2276194ab16d502a97688fc9f945b7708c878917 /baremetal/shell | |
parent | 37e8e05721083b34c1a309d3db8337f433f2b492 (diff) | |
download | mu-87fe53e691d3bbd78fa5c3d25e0228b469802040.tar.gz |
7779
Diffstat (limited to 'baremetal/shell')
-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 } |