2021-02-21 06:37:44 +00:00
|
|
|
type sandbox {
|
|
|
|
data: (handle gap-buffer)
|
2021-02-21 20:20:31 +00:00
|
|
|
value: (handle stream byte)
|
2021-02-23 03:46:23 +00:00
|
|
|
trace: (handle trace)
|
2021-02-21 06:37:44 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
fn initialize-sandbox _self: (addr sandbox) {
|
|
|
|
var self/esi: (addr sandbox) <- copy _self
|
|
|
|
var data-ah/eax: (addr handle gap-buffer) <- get self, data
|
|
|
|
allocate data-ah
|
|
|
|
var data/eax: (addr gap-buffer) <- lookup *data-ah
|
|
|
|
initialize-gap-buffer data, 0x1000/4KB
|
2021-02-21 20:20:31 +00:00
|
|
|
var value-ah/eax: (addr handle stream byte) <- get self, value
|
|
|
|
populate-stream value-ah, 0x1000/4KB
|
2021-02-23 04:23:43 +00:00
|
|
|
var trace-ah/eax: (addr handle trace) <- get self, trace
|
|
|
|
allocate trace-ah
|
|
|
|
var trace/eax: (addr trace) <- lookup *trace-ah
|
|
|
|
initialize-trace trace, 0x100/lines
|
2021-02-21 06:37:44 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
## some helpers for tests
|
|
|
|
|
|
|
|
fn initialize-sandbox-with _self: (addr sandbox), s: (addr array byte) {
|
|
|
|
var self/esi: (addr sandbox) <- copy _self
|
|
|
|
var data-ah/eax: (addr handle gap-buffer) <- get self, data
|
|
|
|
allocate data-ah
|
|
|
|
var data/eax: (addr gap-buffer) <- lookup *data-ah
|
|
|
|
initialize-gap-buffer-with data, s
|
|
|
|
}
|
|
|
|
|
|
|
|
fn allocate-sandbox-with _out: (addr handle sandbox), s: (addr array byte) {
|
|
|
|
var out/eax: (addr handle sandbox) <- copy _out
|
|
|
|
allocate out
|
|
|
|
var out-addr/eax: (addr sandbox) <- lookup *out
|
|
|
|
initialize-sandbox-with out-addr, s
|
|
|
|
}
|
|
|
|
|
|
|
|
fn add-grapheme-to-sandbox _self: (addr sandbox), c: grapheme {
|
|
|
|
var self/esi: (addr sandbox) <- copy _self
|
|
|
|
var data-ah/eax: (addr handle gap-buffer) <- get self, data
|
|
|
|
var data/eax: (addr gap-buffer) <- lookup *data-ah
|
|
|
|
add-grapheme-at-gap data, c
|
|
|
|
}
|
|
|
|
|
2021-02-21 06:45:10 +00:00
|
|
|
fn delete-grapheme-before-cursor _self: (addr sandbox) {
|
|
|
|
var self/esi: (addr sandbox) <- copy _self
|
|
|
|
var data-ah/eax: (addr handle gap-buffer) <- get self, data
|
|
|
|
var data/eax: (addr gap-buffer) <- lookup *data-ah
|
|
|
|
delete-before-gap data
|
|
|
|
}
|
|
|
|
|
2021-02-21 22:32:46 +00:00
|
|
|
fn render-sandbox screen: (addr screen), _self: (addr sandbox), _x: int, _y: int {
|
2021-02-21 06:45:10 +00:00
|
|
|
clear-screen screen
|
2021-02-21 06:37:44 +00:00
|
|
|
var self/esi: (addr sandbox) <- copy _self
|
2021-02-23 04:23:43 +00:00
|
|
|
# data
|
2021-02-21 06:37:44 +00:00
|
|
|
var data-ah/eax: (addr handle gap-buffer) <- get self, data
|
2021-02-21 22:32:46 +00:00
|
|
|
var _data/eax: (addr gap-buffer) <- lookup *data-ah
|
|
|
|
var data/edx: (addr gap-buffer) <- copy _data
|
|
|
|
var x/eax: int <- copy _x
|
|
|
|
var y/ecx: int <- copy _y
|
2021-02-23 04:23:43 +00:00
|
|
|
x, y <- render-gap-buffer-wrapping-right-then-down screen, data, x, y, 0x20/xmax, 0x20/ymax, x, y, 1/show-cursor
|
2021-02-22 05:44:34 +00:00
|
|
|
{
|
|
|
|
var value-ah/eax: (addr handle stream byte) <- get self, value
|
|
|
|
var value/eax: (addr stream byte) <- lookup *value-ah
|
|
|
|
var done?/eax: boolean <- stream-empty? value
|
|
|
|
compare done?, 0/false
|
|
|
|
break-if-=
|
|
|
|
return
|
|
|
|
}
|
2021-02-21 22:32:46 +00:00
|
|
|
y <- increment
|
2021-02-23 04:23:43 +00:00
|
|
|
# trace
|
|
|
|
var trace-ah/eax: (addr handle trace) <- get self, trace
|
|
|
|
var _trace/eax: (addr trace) <- lookup *trace-ah
|
|
|
|
var trace/edx: (addr trace) <- copy _trace
|
|
|
|
y <- render-trace screen, trace, _x, y, 0x20/xmax, 0x20/ymax
|
|
|
|
y <- increment
|
|
|
|
# value
|
|
|
|
var x/eax: int <- copy 0
|
2021-02-22 05:44:34 +00:00
|
|
|
x, y <- draw-text-wrapping-right-then-down screen, "=> ", _x, y, 0x20/xmax, 0x20/ymax, _x, y, 7/fg, 0/bg
|
|
|
|
var x2/edx: int <- copy x
|
2021-02-21 20:20:31 +00:00
|
|
|
var value-ah/eax: (addr handle stream byte) <- get self, value
|
|
|
|
var value/eax: (addr stream byte) <- lookup *value-ah
|
2021-02-22 05:44:34 +00:00
|
|
|
var dummy/eax: int <- draw-stream-rightward screen, value, x2, 0x30/xmax, y, 7/fg=grey, 0/bg
|
2021-02-21 06:37:44 +00:00
|
|
|
}
|
|
|
|
|
2021-02-22 05:27:42 +00:00
|
|
|
fn edit-sandbox _self: (addr sandbox), key: byte {
|
2021-02-21 20:20:31 +00:00
|
|
|
var self/esi: (addr sandbox) <- copy _self
|
2021-02-21 06:37:44 +00:00
|
|
|
var g/edx: grapheme <- copy key
|
2021-02-21 06:45:10 +00:00
|
|
|
{
|
|
|
|
compare g, 8/backspace
|
|
|
|
break-if-!=
|
|
|
|
delete-grapheme-before-cursor self
|
|
|
|
return
|
|
|
|
}
|
2021-02-22 05:25:38 +00:00
|
|
|
{
|
|
|
|
compare g, 0x12/ctrl-r
|
|
|
|
break-if-!=
|
|
|
|
# ctrl-r: run function outside sandbox
|
|
|
|
# required: fn (addr screen), (addr keyboard)
|
|
|
|
# Mu will pass in the real screen and keyboard.
|
|
|
|
return
|
|
|
|
}
|
2021-02-21 20:20:31 +00:00
|
|
|
{
|
|
|
|
compare g, 0x13/ctrl-s
|
|
|
|
break-if-!=
|
|
|
|
# ctrl-s: run sandbox(es)
|
2021-02-22 05:21:36 +00:00
|
|
|
var data-ah/eax: (addr handle gap-buffer) <- get self, data
|
2021-02-22 05:30:57 +00:00
|
|
|
var _data/eax: (addr gap-buffer) <- lookup *data-ah
|
|
|
|
var data/ecx: (addr gap-buffer) <- copy _data
|
2021-02-21 20:20:31 +00:00
|
|
|
var value-ah/eax: (addr handle stream byte) <- get self, value
|
2021-02-23 03:46:23 +00:00
|
|
|
var _value/eax: (addr stream byte) <- lookup *value-ah
|
|
|
|
var value/edx: (addr stream byte) <- copy _value
|
|
|
|
var trace-ah/eax: (addr handle trace) <- get self, trace
|
|
|
|
var trace/eax: (addr trace) <- lookup *trace-ah
|
2021-02-23 04:23:43 +00:00
|
|
|
clear-trace trace
|
2021-02-23 03:46:23 +00:00
|
|
|
run data, value, trace
|
2021-02-21 20:20:31 +00:00
|
|
|
return
|
|
|
|
}
|
2021-02-21 06:37:44 +00:00
|
|
|
add-grapheme-to-sandbox self, g
|
|
|
|
}
|
2021-02-22 05:36:33 +00:00
|
|
|
|
2021-02-23 03:46:23 +00:00
|
|
|
fn run in: (addr gap-buffer), out: (addr stream byte), trace: (addr trace) {
|
2021-02-22 06:06:03 +00:00
|
|
|
var read-result-storage: (handle cell)
|
|
|
|
var read-result/esi: (addr handle cell) <- address read-result-storage
|
2021-02-23 03:46:23 +00:00
|
|
|
read-cell in, read-result, trace
|
|
|
|
var error?/eax: boolean <- has-errors? trace
|
|
|
|
{
|
|
|
|
compare error?, 0/false
|
|
|
|
break-if-=
|
|
|
|
return
|
|
|
|
}
|
2021-02-22 06:06:03 +00:00
|
|
|
# TODO: eval
|
|
|
|
print-cell read-result, out
|
2021-02-22 05:36:33 +00:00
|
|
|
}
|