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
|
int-data: int # if type = 0
|
||||||
text-data: (handle array byte) # if type = 1
|
text-data: (handle array byte) # if type = 1
|
||||||
array-data: (handle array int) # if type = 2
|
array-data: (handle array int) # if type = 2
|
||||||
|
file-data: (handle buffered-file) # if type = 3
|
||||||
}
|
}
|
||||||
|
|
||||||
type table {
|
type table {
|
||||||
|
|
|
@ -778,6 +778,14 @@ fn bound-function? w: (addr word), functions-ah: (addr handle function) -> resul
|
||||||
subresult <- word-equal? w, "len"
|
subresult <- word-equal? w, "len"
|
||||||
compare subresult, 0 # false
|
compare subresult, 0 # false
|
||||||
break-if-!=
|
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
|
# return w in functions
|
||||||
var out-h: (handle function)
|
var out-h: (handle function)
|
||||||
var out/eax: (addr handle function) <- address out-h
|
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
|
render-array screen, val
|
||||||
break $render-column:render-value
|
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
|
# render ints by default for now
|
||||||
var val-addr2/eax: (addr int) <- get val-addr, int-data
|
var val-addr2/eax: (addr int) <- get val-addr, int-data
|
||||||
render-integer screen, *val-addr2, max-width
|
render-integer screen, *val-addr2, max-width
|
||||||
|
@ -1498,7 +1516,7 @@ fn clear-canvas _env: (addr environment) {
|
||||||
print-string screen, "functions:"
|
print-string screen, "functions:"
|
||||||
start-col <- add 2
|
start-col <- add 2
|
||||||
move-cursor screen, 2, start-col
|
move-cursor screen, 2, start-col
|
||||||
print-string screen, "+ - * len"
|
print-string screen, "+ - * len open read"
|
||||||
# currently defined functions
|
# currently defined functions
|
||||||
var row/ebx: int <- copy 5
|
var row/ebx: int <- copy 5
|
||||||
var functions/esi: (addr handle function) <- get env, functions
|
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
|
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
|
# if curr-stream defines a binding, save top of stack to bindings
|
||||||
{
|
{
|
||||||
var done?/eax: boolean <- stream-empty? curr-stream
|
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-<=
|
break-if-<=
|
||||||
copy-to out, w
|
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
|
i <- increment
|
||||||
loop
|
loop
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue