about summary refs log tree commit diff stats
path: root/088file.mu
diff options
context:
space:
mode:
authorKartik K. Agaram <vc@akkartik.com>2016-08-20 18:29:09 -0700
committerKartik K. Agaram <vc@akkartik.com>2016-08-20 18:29:09 -0700
commitebea4c3f4a3aed3bb0f6c16edd1d44eea965ca6b (patch)
tree0be5ca83da65d689db6acd0bc36509d046cf0d4f /088file.mu
parentf09d9076f16dbc8104a8320f54251347b1387d9f (diff)
downloadmu-ebea4c3f4a3aed3bb0f6c16edd1d44eea965ca6b.tar.gz
3231 - reading from fake files in scenarios
Diffstat (limited to '088file.mu')
-rw-r--r--088file.mu47
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