summaryrefslogtreecommitdiff
path: root/lib/std/slurp.myr
diff options
context:
space:
mode:
Diffstat (limited to 'lib/std/slurp.myr')
-rw-r--r--lib/std/slurp.myr43
1 files changed, 43 insertions, 0 deletions
diff --git a/lib/std/slurp.myr b/lib/std/slurp.myr
new file mode 100644
index 0000000..8636f40
--- /dev/null
+++ b/lib/std/slurp.myr
@@ -0,0 +1,43 @@
+use "alloc.use"
+use "die.use"
+use "result.use"
+use "extremum.use"
+use "syswrap.use"
+use "types.use"
+
+pkg std =
+ const slurp : (path : byte[:] -> result(byte[:], byte[:]))
+ const fslurp : (path : fd -> result(byte[:], byte[:]))
+;;
+
+const Bufstart = 4096
+
+const slurp = {path
+ var fd
+ fd = open(path, Ordonly)
+ if fd < 0
+ -> `Fail "Could not open file"
+ ;;
+ -> fslurp(fd)
+}
+
+const fslurp = {fd
+ var len, bufsz
+ var buf
+ var n
+
+ len = 0
+ bufsz = Bufstart
+ buf = slalloc(bufsz)
+ while true
+ n = read(fd, buf[len:])
+ if n <= 0
+ goto done
+ ;;
+ len += n
+ bufsz *= 2
+ buf = slgrow(buf, bufsz)
+ ;;
+:done
+ -> `Ok buf[:len]
+}