use sys use "alloc"use "die"use "memops"use "option"use "result"use "slcp"use "sldup"use "types" pkg std = type dir = struct fd : sys.fd buf : byte[16384] len : int64 off : int64 ;; const diropen : (p : byte[:] -> std.result(dir#, byte[:])) const dirread : (d : dir# -> std.option(byte[:])) const dirclose : (d : dir# -> void);; const Direntoverhead = 20 const diropen = {p var fd var dir fd = sys.open(p, sys.Ordonly | sys.Odir) if fd < 0 -> `Err "couldn't open directory" ;; dir = zalloc() dir.fd = fd -> `Ok dir} const dirread = {d var len var dent var namelen if d.off >= d.len len = sys.getdents64(d.fd, d.buf[:]) if len <= 0 -> `None ;; d.len = len d.off = 0 ;; dent = (&d.buf[d.off] : sys.dirent64#) namelen = 0 d.off += (dent.reclen : int64) while dent.name[namelen] != 0 namelen++ ;; -> `Some sldup(dent.name[:namelen])} const dirclose = {d sys.close(d.fd) free(d)}
use sys
use "alloc"
use "die"
use "memops"
use "option"
use "result"
use "slcp"
use "sldup"
use "types"
pkg std =
type dir = struct
fd : sys.fd
buf : byte[16384]
len : int64
off : int64
;;
const diropen : (p : byte[:] -> std.result(dir#, byte[:]))
const dirread : (d : dir# -> std.option(byte[:]))
const dirclose : (d : dir# -> void)
;;
const Direntoverhead = 20
const diropen = {p
var fd
var dir
fd = sys.open(p, sys.Ordonly | sys.Odir)
if fd < 0
-> `Err "couldn't open directory"
;;
dir = zalloc()
dir.fd = fd
-> `Ok dir
}
const dirread = {d
var len
var dent
var namelen
if d.off >= d.len
len = sys.getdents64(d.fd, d.buf[:])
if len <= 0
-> `None
;;
d.len = len
d.off = 0
;;
dent = (&d.buf[d.off] : sys.dirent64#)
namelen = 0
d.off += (dent.reclen : int64)
while dent.name[namelen] != 0
namelen++
;;
-> `Some sldup(dent.name[:namelen])
}
const dirclose = {d
sys.close(d.fd)
free(d)
}