7107 - tile: file handles
This commit is contained in:
parent
2d7960d493
commit
5f5579e168
|
@ -38,6 +38,7 @@ type value {
|
|||
int-data: int # if type = 0
|
||||
text-data: (handle array byte) # if type = 1
|
||||
array-data: (handle array int) # if type = 2
|
||||
file-data: (handle buffered-file) # if type = 3
|
||||
}
|
||||
|
||||
type table {
|
||||
|
|
|
@ -778,6 +778,14 @@ fn bound-function? w: (addr word), functions-ah: (addr handle function) -> resul
|
|||
subresult <- word-equal? w, "len"
|
||||
compare subresult, 0 # false
|
||||
break-if-!=
|
||||
# if w == "open" return true
|
||||
subresult <- word-equal? w, "open"
|
||||
compare subresult, 0 # false
|
||||
break-if-!=
|
||||
# if w == "read" return true
|
||||
subresult <- word-equal? w, "read"
|
||||
compare subresult, 0 # false
|
||||
break-if-!=
|
||||
# return w in functions
|
||||
var out-h: (handle function)
|
||||
var out/eax: (addr handle function) <- address out-h
|
||||
|
@ -1372,6 +1380,16 @@ fn render-column screen: (addr screen), functions: (addr handle function), bindi
|
|||
render-array screen, val
|
||||
break $render-column:render-value
|
||||
}
|
||||
{
|
||||
compare *val-type, 3 # file
|
||||
break-if-!=
|
||||
var val-ah/eax: (addr handle buffered-file) <- get val-addr, file-data
|
||||
var val/eax: (addr buffered-file) <- lookup *val-ah
|
||||
start-color screen, 0, 7
|
||||
# TODO
|
||||
print-string screen, " FILE "
|
||||
break $render-column:render-value
|
||||
}
|
||||
# render ints by default for now
|
||||
var val-addr2/eax: (addr int) <- get val-addr, int-data
|
||||
render-integer screen, *val-addr2, max-width
|
||||
|
@ -1498,7 +1516,7 @@ fn clear-canvas _env: (addr environment) {
|
|||
print-string screen, "functions:"
|
||||
start-col <- add 2
|
||||
move-cursor screen, 2, start-col
|
||||
print-string screen, "+ - * len"
|
||||
print-string screen, "+ - * len open read"
|
||||
# currently defined functions
|
||||
var row/ebx: int <- copy 5
|
||||
var functions/esi: (addr handle function) <- get env, functions
|
||||
|
|
|
@ -102,6 +102,38 @@ fn evaluate functions: (addr handle function), bindings: (addr table), scratch:
|
|||
break $evaluate:process-word
|
||||
}
|
||||
}
|
||||
{
|
||||
var is-open?/eax: boolean <- stream-data-equal? curr-stream, "open"
|
||||
compare is-open?, 0
|
||||
break-if-=
|
||||
# pop target-val from out
|
||||
var out2/esi: (addr value-stack) <- copy out
|
||||
var top-addr/ecx: (addr int) <- get out2, top
|
||||
compare *top-addr, 0
|
||||
break-if-<=
|
||||
var data-ah/eax: (addr handle array value) <- get out2, data
|
||||
var data/eax: (addr array value) <- lookup *data-ah
|
||||
var top/edx: int <- copy *top-addr
|
||||
top <- decrement
|
||||
var dest-offset/edx: (offset value) <- compute-offset data, top
|
||||
var target-val/edx: (addr value) <- index data, dest-offset
|
||||
# check target-val is a string
|
||||
var target-type-addr/eax: (addr int) <- get target-val, type
|
||||
compare *target-type-addr, 1 # string
|
||||
break-if-!=
|
||||
# open target-val as a filename and save the handle in target-val
|
||||
var src-ah/eax: (addr handle array byte) <- get target-val, text-data
|
||||
var src/eax: (addr array byte) <- lookup *src-ah
|
||||
var result-ah/ecx: (addr handle buffered-file) <- get target-val, file-data
|
||||
open src, 0, result-ah # write? = false
|
||||
# save result into target-val
|
||||
var type-addr/eax: (addr int) <- get target-val, type
|
||||
copy-to *type-addr, 3 # file
|
||||
var target-string-ah/eax: (addr handle array byte) <- get target-val, text-data
|
||||
var empty: (handle array byte)
|
||||
copy-handle empty, target-string-ah
|
||||
break $evaluate:process-word
|
||||
}
|
||||
# if curr-stream defines a binding, save top of stack to bindings
|
||||
{
|
||||
var done?/eax: boolean <- stream-empty? curr-stream
|
||||
|
|
|
@ -176,6 +176,19 @@ fn value-stack-max-width _self: (addr value-stack) -> result/eax: int {
|
|||
break-if-<=
|
||||
copy-to out, w
|
||||
}
|
||||
{
|
||||
compare *type, 3 # file handle
|
||||
break-if-!=
|
||||
var f-ah/eax: (addr handle buffered-file) <- get g, file-data
|
||||
var f/eax: (addr buffered-file) <- lookup *f-ah
|
||||
compare f, 0
|
||||
break-if-=
|
||||
# TODO
|
||||
var w/eax: int <- copy 4
|
||||
compare w, out
|
||||
break-if-<=
|
||||
copy-to out, w
|
||||
}
|
||||
i <- increment
|
||||
loop
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue