summaryrefslogtreecommitdiff
path: root/lib/fileutil/del.myr
blob: c82bfc9fc52dc3bb6d9b11f564b7eeb4765a5134 (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
37
38
39
40
41
42
43
use std

use "loopcheck"

pkg fileutil =
	const rmrf	: (dir : byte[:] -> bool)
;;

const rmrf = {dir
	var loopck, ok
	
	loopck = mkloopcheck(dir)
	ok = rmrf_rec(dir, loopck)
	freeloopcheck(loopck)
	-> ok
}

const rmrf_rec = {path, loopck
	var ok, p

	ok = true
	if std.fisdir(path)
		match std.diropen(path)
		| `std.Err e:
			ok = false
		| `std.Ok d:
			for e : std.byentry(d)
				if std.sleq(e, ".") || std.sleq(e, "..")
					continue
				;;
				p = std.pathcat(path, e)
				if !looped(loopck, p)
					ok = ok && rmrf(p)
				;;
				std.slfree(p)
			;;
			ok = ok && std.remove(path)
		;;
	else
		ok = ok && std.remove(path)
	;;
	-> ok
}