From da925d0697d61db6d265fd78cab3d1adf214950c Mon Sep 17 00:00:00 2001 From: "Kartik K. Agaram" Date: Tue, 16 Aug 2016 17:13:26 -0700 Subject: 3203 - testable interface for reading a file This commit was written by Stephen Malina. Thanks also to Stephen for running into the bug of commit 3202. --- 088file.mu | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 088file.mu (limited to '088file.mu') diff --git a/088file.mu b/088file.mu new file mode 100644 index 00000000..25263fa9 --- /dev/null +++ b/088file.mu @@ -0,0 +1,31 @@ +# Wrappers around file-system primitives that take a 'filesystem' object and +# are thus easier to test. + +container filesystem [ + {data: (address table (address array character) (address array character))} +] + +def start-reading fs:address:filesystem, filename:address:array:character -> contents:address:source:character [ + local-scope + load-ingredients + x:number/file <- $open-file-for-reading filename + contents:address:source:character, sink:address:sink:character <- new-channel 30 + $print [sink: ], sink, 10/newline + chan:address:channel:character <- get *sink, chan:offset + $print [chan in start-reading: ], chan, 10/newline + start-running transmit x, sink +] + +def transmit file:number, sink:address:sink:character -> file:number, sink:address:sink:character [ + local-scope + load-ingredients + { + c:character <- $read-from-file file + break-unless c + sink <- write sink, c + loop + } + $print [closing chan after reading file], 10/newline + sink <- close sink + $print [returning from 'transmit'], 10/newline +] -- cgit 1.4.1-2-gfad0