diff options
author | Kartik K. Agaram <vc@akkartik.com> | 2016-08-20 18:29:09 -0700 |
---|---|---|
committer | Kartik K. Agaram <vc@akkartik.com> | 2016-08-20 18:29:09 -0700 |
commit | ebea4c3f4a3aed3bb0f6c16edd1d44eea965ca6b (patch) | |
tree | 0be5ca83da65d689db6acd0bc36509d046cf0d4f /088file.mu | |
parent | f09d9076f16dbc8104a8320f54251347b1387d9f (diff) | |
download | mu-ebea4c3f4a3aed3bb0f6c16edd1d44eea965ca6b.tar.gz |
3231 - reading from fake files in scenarios
Diffstat (limited to '088file.mu')
-rw-r--r-- | 088file.mu | 47 |
1 files changed, 43 insertions, 4 deletions
diff --git a/088file.mu b/088file.mu index 4e3a6dec..2eeeec2c 100644 --- a/088file.mu +++ b/088file.mu @@ -13,12 +13,35 @@ container file-mapping [ def start-reading fs:address:filesystem, filename:address:array:character -> contents:address:source:character [ local-scope load-ingredients - file:number <- $open-file-for-reading filename - contents:address:source:character, sink:address:sink:character <- new-channel 30 - start-running transmit-from-file file, sink + { + break-if fs + # real file-system + file:number <- $open-file-for-reading filename + assert file, [file not found] + contents:address:source:character, sink:address:sink:character <- new-channel 30 + start-running transmit-from-file file, sink + return + } + # fake file system + i:number <- copy 0 + data:address:array:file-mapping <- get *fs, data:offset + len:number <- length *data + { + done?:boolean <- greater-or-equal i, len + break-if done? + tmp:file-mapping <- index *data, i + curr-filename:address:array:character <- get tmp, name:offset + found?:boolean <- equal filename, curr-filename + loop-unless found? + contents:address:source:character, sink:address:sink:character <- new-channel 30 + curr-contents:address:array:character <- get tmp, contents:offset + start-running transmit-from-text curr-contents, sink + return + } + return 0/not-found ] -def transmit-from-file file:number, sink:address:sink:character -> file:number, sink:address:sink:character [ +def transmit-from-file file:number, sink:address:sink:character -> sink:address:sink:character [ local-scope load-ingredients { @@ -31,6 +54,22 @@ def transmit-from-file file:number, sink:address:sink:character -> file:number, $close-file file ] +def transmit-from-text contents:address:array:character, sink:address:sink:character -> sink:address:sink:character [ + local-scope + load-ingredients + i:number <- copy 0 + len:number <- length *contents + { + done?:boolean <- greater-or-equal i, len + break-if done? + c:character <- index *contents, i + sink <- write sink, c + i <- add i, 1 + loop + } + sink <- close sink +] + def start-writing fs:address:filesystem, filename:address:array:character -> sink:address:sink:character, routine-id:number [ local-scope load-ingredients |