-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathreaddir.kt
63 lines (51 loc) · 1.44 KB
/
readdir.kt
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
package datkt.fs
import kotlinx.cinterop.staticCFunction
import kotlinx.cinterop.memScoped
import kotlinx.cinterop.toKString
import kotlinx.cinterop.CPointer
import kotlinx.cinterop.alloc
import datkt.uv.uv_fs_scandir_next
import datkt.uv.uv_fs_scandir
import datkt.uv.uv_dirent_t
import datkt.uv.uv_fs_t
import datkt.uv.UV_EOF
import datkt.fs.ReadDirectoryCallback as Callback
fun readdir(path: String, callback: Callback) {
val cb = staticCFunction(::onscandir)
val req = uv.init<Callback>(callback)
val ref = uv.toCValuesRef<uv_fs_t>(req)
val loop = datkt.fs.loop.default
val errno = uv_fs_scandir(loop, ref, path, 0, cb)
if (errno < 0) {
callback(createError(errno), null)
}
}
private fun onscandir(req: CPointer<uv_fs_t>?) {
uv.request<Callback>(req) { err, (fs, done, cleanup) ->
var files: Array<String>? = null
if (null != fs && null == err) {
files = emptyArray()
memScoped {
val dirent = alloc<uv_dirent_t>()
val ref = uv.toCValuesRef<uv_dirent_t>(dirent)
while (true) {
val errno = uv_fs_scandir_next(req, ref)
val name = dirent.name?.toKString()
if (UV_EOF == errno) {
break
}
if (errno < 0) {
done(createError(errno), null)
cleanup()
break
}
if (null != name) {
files += name
}
}
}
}
done(err, files)
cleanup()
}
}