summaryrefslogtreecommitdiff
path: root/lib/std/blat.myr
blob: 46a6e3e277e2f396ed7c24e0a2cb67951b7085a9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
use "syswrap"
use "result"

pkg std =
	const blat : (path : byte[:], buf : byte[:], perm : int64 -> bool)
	const fblat : (f : fd, buf : byte[:] -> bool)
;;

const blat = {path, buf, perm
	match openmode(path, Ocreat|Owrite, perm)
	| `Ok fd:
		var r = fblat(fd, buf)
		close(fd)
		-> r
	| `Err e:
		-> false
	;;
}


const fblat = {fd, buf
	var count

	count = 0
	while true
		match write(fd, buf[count:])
		| `Err e:	-> false
		| `Ok n:
			if n == 0
				break
			;;
			count += n
		;;
	;;
	-> count == buf.len
}