ref: 8bc429fb93070938b8bc5d459da4f2664c00abae
dir: /lib/std/slurp.myr/
use "alloc.use" use "die.use" use "result.use" use "extremum.use" use "syswrap.use" use "errno.use" use "types.use" pkg std = const slurp : (path : byte[:] -> result(byte[:], errno)) const fslurp : (path : fd -> result(byte[:], errno)) ;; const Bufstart = 4096 const slurp = {path match open(path, Ordonly) | `Ok fd: -> fslurp(fd) | `Fail e: -> `Fail e ;; } const fslurp = {fd var len, bufsz var buf len = 0 bufsz = Bufstart buf = slalloc(bufsz) while true match read(fd, buf[len:]) | `Ok n: if n == 0 -> `Ok buf[:len] ;; len += n bufsz *= 2 buf = slgrow(buf, bufsz) | `Fail e: -> `Fail e ;; ;; die("unreachable") }