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-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-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 06:37:44 +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
|
|
|
|
var data-ah/eax: (addr handle gap-buffer) <- get self, data
|
|
|
|
var data/eax: (addr gap-buffer) <- lookup *data-ah
|
|
|
|
var dummy/eax: int <- render-gap-buffer screen, data, x, y, 1/true
|
2021-02-21 20:20:31 +00:00
|
|
|
increment y
|
|
|
|
var value-ah/eax: (addr handle stream byte) <- get self, value
|
|
|
|
var value/eax: (addr stream byte) <- lookup *value-ah
|
|
|
|
var dummy/eax: int <- draw-stream-rightward screen, value, x, 0x30/xmax, y, 7/fg=grey, 0/bg
|
2021-02-21 06:37:44 +00:00
|
|
|
}
|
|
|
|
|
2021-02-21 20:20:31 +00:00
|
|
|
fn edit-sandbox _self: (addr sandbox), key: byte {
|
|
|
|
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-21 20:20:31 +00:00
|
|
|
{
|
|
|
|
compare g, 0x13/ctrl-s
|
|
|
|
break-if-!=
|
|
|
|
# ctrl-s: run sandbox(es)
|
|
|
|
var value-ah/eax: (addr handle stream byte) <- get self, value
|
|
|
|
var value/eax: (addr stream byte) <- lookup *value-ah
|
|
|
|
write value, "=> LISP"
|
|
|
|
return
|
|
|
|
}
|
2021-02-21 06:37:44 +00:00
|
|
|
add-grapheme-to-sandbox self, g
|
|
|
|
}
|