diff options
author | Kartik Agaram <vc@akkartik.com> | 2020-10-25 21:33:24 -0700 |
---|---|---|
committer | Kartik Agaram <vc@akkartik.com> | 2020-10-25 21:35:24 -0700 |
commit | 5f5579e1682fbcea3340a036ef57684cacb835e4 (patch) | |
tree | ac5798c83cca7f5d5fe86d1aba954ebd5c7e0abd /apps/tile/rpn.mu | |
parent | 2d7960d493c11ba6286193ec01b7f6771cd0b695 (diff) | |
download | mu-5f5579e1682fbcea3340a036ef57684cacb835e4.tar.gz |
7107 - tile: file handles
Diffstat (limited to 'apps/tile/rpn.mu')
-rw-r--r-- | apps/tile/rpn.mu | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/apps/tile/rpn.mu b/apps/tile/rpn.mu index ef53bb7e..c206e997 100644 --- a/apps/tile/rpn.mu +++ b/apps/tile/rpn.mu @@ -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 |