Mercurial > molko
annotate libmlk-util/mlk/util/dir.c @ 599:cb8ca73f1aa4
rpg: walksprite -> mlk_walksprite
author | David Demelier <markand@malikania.fr> |
---|---|
date | Fri, 31 Mar 2023 20:01:00 +0200 |
parents | f937857336f3 |
children |
rev | line source |
---|---|
570
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
1 /* |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
2 * dir.c -- portable directory iterator |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
3 * |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
4 * Copyright (c) 2020-2023 David Demelier <markand@malikania.fr> |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
5 * |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
6 * Permission to use, copy, modify, and/or distribute this software for any |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
7 * purpose with or without fee is hereby granted, provided that the above |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
8 * copyright notice and this permission notice appear in all copies. |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
9 * |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
17 */ |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
18 |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
19 #include <assert.h> |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
20 |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
21 #include "dir.h" |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
22 #include "sysconfig.h" |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
23 |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
24 #if defined(MLK_HAVE_DIRENT_H) |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
25 |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
26 /* {{{ Generic dirent.h support. */ |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
27 |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
28 #include <dirent.h> |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
29 #include <stdio.h> |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
30 #include <stdlib.h> |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
31 #include <string.h> |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
32 |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
33 struct self { |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
34 DIR *dp; |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
35 struct dirent *entry; |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
36 }; |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
37 |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
38 static inline int |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
39 skip(const struct self *self) |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
40 { |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
41 return strcmp(self->entry->d_name, ".") == 0 || |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
42 strcmp(self->entry->d_name, "..") == 0; |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
43 } |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
44 |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
45 static void |
577
f937857336f3
util: mlk_dir_iter -> mlk_dir
David Demelier <markand@malikania.fr>
parents:
572
diff
changeset
|
46 handle_finish(struct mlk_dir *iter) |
570
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
47 { |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
48 struct self *self = iter->handle; |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
49 |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
50 if (self) { |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
51 closedir(self->dp); |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
52 free(self); |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
53 } |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
54 |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
55 iter->entry = NULL; |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
56 iter->handle = NULL; |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
57 } |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
58 |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
59 static int |
577
f937857336f3
util: mlk_dir_iter -> mlk_dir
David Demelier <markand@malikania.fr>
parents:
572
diff
changeset
|
60 handle_open(struct mlk_dir *iter, const char *path) |
570
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
61 { |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
62 struct self *self; |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
63 |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
64 if (!(self = calloc(1, sizeof (*self)))) |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
65 return -1; |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
66 if (!(self->dp = opendir(path))) { |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
67 free(self); |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
68 return -1; |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
69 } |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
70 |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
71 iter->handle = self; |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
72 |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
73 return 0; |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
74 } |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
75 |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
76 static int |
577
f937857336f3
util: mlk_dir_iter -> mlk_dir
David Demelier <markand@malikania.fr>
parents:
572
diff
changeset
|
77 handle_next(struct mlk_dir *iter) |
570
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
78 { |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
79 struct self *self = iter->handle; |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
80 |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
81 /* Skip . and .. which are barely useful. */ |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
82 while ((self->entry = readdir(self->dp)) && skip(self)) |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
83 continue; |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
84 |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
85 /* End of directory, free all and indicate EOF to the user. */ |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
86 if (!self->entry) { |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
87 handle_finish(iter); |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
88 return 0; |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
89 } |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
90 |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
91 iter->entry = self->entry->d_name; |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
92 |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
93 return 1; |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
94 } |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
95 |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
96 /* }}} */ |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
97 |
572
f7dcad94b7cf
util: add Windows support in dir
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
98 #elif defined(_WIN32) |
f7dcad94b7cf
util: add Windows support in dir
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
99 |
f7dcad94b7cf
util: add Windows support in dir
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
100 /* {{{ Native Windows implementation. */ |
f7dcad94b7cf
util: add Windows support in dir
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
101 |
f7dcad94b7cf
util: add Windows support in dir
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
102 #include <stdio.h> |
f7dcad94b7cf
util: add Windows support in dir
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
103 #include <stdlib.h> |
f7dcad94b7cf
util: add Windows support in dir
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
104 #include <string.h> |
f7dcad94b7cf
util: add Windows support in dir
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
105 #include <windows.h> |
f7dcad94b7cf
util: add Windows support in dir
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
106 |
f7dcad94b7cf
util: add Windows support in dir
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
107 struct self { |
f7dcad94b7cf
util: add Windows support in dir
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
108 WIN32_FIND_DATA data; |
f7dcad94b7cf
util: add Windows support in dir
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
109 HANDLE handle; |
f7dcad94b7cf
util: add Windows support in dir
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
110 int cached; |
f7dcad94b7cf
util: add Windows support in dir
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
111 }; |
f7dcad94b7cf
util: add Windows support in dir
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
112 |
f7dcad94b7cf
util: add Windows support in dir
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
113 static inline int |
f7dcad94b7cf
util: add Windows support in dir
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
114 skip(const struct self *self) |
f7dcad94b7cf
util: add Windows support in dir
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
115 { |
f7dcad94b7cf
util: add Windows support in dir
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
116 return strcmp(self->data.cFileName, ".") == 0 || |
f7dcad94b7cf
util: add Windows support in dir
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
117 strcmp(self->data.cFileName, "..") == 0; |
f7dcad94b7cf
util: add Windows support in dir
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
118 } |
f7dcad94b7cf
util: add Windows support in dir
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
119 |
f7dcad94b7cf
util: add Windows support in dir
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
120 static void |
577
f937857336f3
util: mlk_dir_iter -> mlk_dir
David Demelier <markand@malikania.fr>
parents:
572
diff
changeset
|
121 handle_finish(struct mlk_dir *iter) |
572
f7dcad94b7cf
util: add Windows support in dir
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
122 { |
f7dcad94b7cf
util: add Windows support in dir
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
123 struct self *self = iter->handle; |
f7dcad94b7cf
util: add Windows support in dir
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
124 |
f7dcad94b7cf
util: add Windows support in dir
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
125 if (self) { |
f7dcad94b7cf
util: add Windows support in dir
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
126 FindClose(self->handle); |
f7dcad94b7cf
util: add Windows support in dir
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
127 free(self); |
f7dcad94b7cf
util: add Windows support in dir
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
128 } |
f7dcad94b7cf
util: add Windows support in dir
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
129 |
f7dcad94b7cf
util: add Windows support in dir
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
130 iter->entry = NULL; |
f7dcad94b7cf
util: add Windows support in dir
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
131 iter->handle = NULL; |
f7dcad94b7cf
util: add Windows support in dir
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
132 } |
f7dcad94b7cf
util: add Windows support in dir
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
133 |
f7dcad94b7cf
util: add Windows support in dir
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
134 static int |
577
f937857336f3
util: mlk_dir_iter -> mlk_dir
David Demelier <markand@malikania.fr>
parents:
572
diff
changeset
|
135 handle_open(struct mlk_dir *iter, const char *path) |
572
f7dcad94b7cf
util: add Windows support in dir
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
136 { |
f7dcad94b7cf
util: add Windows support in dir
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
137 struct self *self; |
f7dcad94b7cf
util: add Windows support in dir
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
138 char directory[MAX_PATH]; |
f7dcad94b7cf
util: add Windows support in dir
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
139 BOOL ret = TRUE; |
f7dcad94b7cf
util: add Windows support in dir
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
140 |
f7dcad94b7cf
util: add Windows support in dir
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
141 snprintf(directory, sizeof (directory), "%s\\*", path); |
f7dcad94b7cf
util: add Windows support in dir
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
142 |
f7dcad94b7cf
util: add Windows support in dir
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
143 if (!(self = calloc(1, sizeof (*self)))) |
f7dcad94b7cf
util: add Windows support in dir
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
144 return -1; |
f7dcad94b7cf
util: add Windows support in dir
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
145 if ((self->handle = FindFirstFileA(directory, &self->data)) == INVALID_HANDLE_VALUE) { |
f7dcad94b7cf
util: add Windows support in dir
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
146 free(self); |
f7dcad94b7cf
util: add Windows support in dir
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
147 return -1; |
f7dcad94b7cf
util: add Windows support in dir
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
148 } |
f7dcad94b7cf
util: add Windows support in dir
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
149 |
f7dcad94b7cf
util: add Windows support in dir
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
150 /* Skip . and .. */ |
f7dcad94b7cf
util: add Windows support in dir
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
151 while (skip(self) && (ret = FindNextFileA(self->handle, &self->data))) |
f7dcad94b7cf
util: add Windows support in dir
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
152 continue; |
f7dcad94b7cf
util: add Windows support in dir
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
153 |
f7dcad94b7cf
util: add Windows support in dir
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
154 /* Something failed. */ |
f7dcad94b7cf
util: add Windows support in dir
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
155 if (!ret) { |
f7dcad94b7cf
util: add Windows support in dir
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
156 handle_finish(iter); |
f7dcad94b7cf
util: add Windows support in dir
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
157 return -1; |
f7dcad94b7cf
util: add Windows support in dir
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
158 } |
f7dcad94b7cf
util: add Windows support in dir
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
159 |
f7dcad94b7cf
util: add Windows support in dir
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
160 self->cached = 1; |
f7dcad94b7cf
util: add Windows support in dir
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
161 iter->entry = self->data.cFileName; |
f7dcad94b7cf
util: add Windows support in dir
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
162 iter->handle = self; |
f7dcad94b7cf
util: add Windows support in dir
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
163 |
f7dcad94b7cf
util: add Windows support in dir
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
164 return 0; |
f7dcad94b7cf
util: add Windows support in dir
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
165 } |
f7dcad94b7cf
util: add Windows support in dir
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
166 |
f7dcad94b7cf
util: add Windows support in dir
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
167 static int |
577
f937857336f3
util: mlk_dir_iter -> mlk_dir
David Demelier <markand@malikania.fr>
parents:
572
diff
changeset
|
168 handle_next(struct mlk_dir *iter) |
572
f7dcad94b7cf
util: add Windows support in dir
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
169 { |
f7dcad94b7cf
util: add Windows support in dir
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
170 struct self *self = iter->handle; |
f7dcad94b7cf
util: add Windows support in dir
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
171 BOOL ret = TRUE; |
f7dcad94b7cf
util: add Windows support in dir
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
172 |
f7dcad94b7cf
util: add Windows support in dir
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
173 /* Returning the first entry on open. */ |
f7dcad94b7cf
util: add Windows support in dir
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
174 if (self->cached) |
f7dcad94b7cf
util: add Windows support in dir
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
175 self->cached = 0; |
f7dcad94b7cf
util: add Windows support in dir
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
176 else { |
f7dcad94b7cf
util: add Windows support in dir
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
177 /* The . and .. can still appear now. */ |
f7dcad94b7cf
util: add Windows support in dir
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
178 while ((ret = FindNextFileA(self->handle, &self->data)) && skip(self)) |
f7dcad94b7cf
util: add Windows support in dir
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
179 continue; |
f7dcad94b7cf
util: add Windows support in dir
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
180 |
f7dcad94b7cf
util: add Windows support in dir
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
181 if (!ret) |
f7dcad94b7cf
util: add Windows support in dir
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
182 handle_finish(iter); |
f7dcad94b7cf
util: add Windows support in dir
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
183 } |
f7dcad94b7cf
util: add Windows support in dir
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
184 |
f7dcad94b7cf
util: add Windows support in dir
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
185 return iter->entry != NULL; |
f7dcad94b7cf
util: add Windows support in dir
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
186 } |
f7dcad94b7cf
util: add Windows support in dir
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
187 |
f7dcad94b7cf
util: add Windows support in dir
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
188 /* }}} */ |
f7dcad94b7cf
util: add Windows support in dir
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
189 |
570
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
190 #else |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
191 |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
192 /* {{{ No-op implementation */ |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
193 |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
194 #include <stddef.h> |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
195 |
572
f7dcad94b7cf
util: add Windows support in dir
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
196 static int |
577
f937857336f3
util: mlk_dir_iter -> mlk_dir
David Demelier <markand@malikania.fr>
parents:
572
diff
changeset
|
197 handle_open(struct mlk_dir *iter, const char *path) |
570
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
198 { |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
199 (void)path; |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
200 |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
201 iter->entry = NULL; |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
202 iter->handle = NULL; |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
203 |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
204 return -1; |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
205 } |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
206 |
572
f7dcad94b7cf
util: add Windows support in dir
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
207 static int |
577
f937857336f3
util: mlk_dir_iter -> mlk_dir
David Demelier <markand@malikania.fr>
parents:
572
diff
changeset
|
208 handle_next(struct mlk_dir *iter) |
570
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
209 { |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
210 (void)iter; |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
211 |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
212 return 0; |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
213 } |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
214 |
572
f7dcad94b7cf
util: add Windows support in dir
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
215 static void |
577
f937857336f3
util: mlk_dir_iter -> mlk_dir
David Demelier <markand@malikania.fr>
parents:
572
diff
changeset
|
216 handle_finish(struct mlk_dir *iter) |
570
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
217 { |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
218 (void)iter; |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
219 } |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
220 |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
221 /* }}} */ |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
222 |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
223 #endif |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
224 |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
225 int |
577
f937857336f3
util: mlk_dir_iter -> mlk_dir
David Demelier <markand@malikania.fr>
parents:
572
diff
changeset
|
226 mlk_dir_open(struct mlk_dir *iter, const char *path) |
570
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
227 { |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
228 assert(path); |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
229 |
572
f7dcad94b7cf
util: add Windows support in dir
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
230 iter->entry = NULL; |
f7dcad94b7cf
util: add Windows support in dir
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
231 iter->handle = NULL; |
f7dcad94b7cf
util: add Windows support in dir
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
232 |
570
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
233 return handle_open(iter, path); |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
234 } |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
235 |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
236 int |
577
f937857336f3
util: mlk_dir_iter -> mlk_dir
David Demelier <markand@malikania.fr>
parents:
572
diff
changeset
|
237 mlk_dir_next(struct mlk_dir *iter) |
570
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
238 { |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
239 assert(iter); |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
240 |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
241 return handle_next(iter); |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
242 } |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
243 |
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
244 void |
577
f937857336f3
util: mlk_dir_iter -> mlk_dir
David Demelier <markand@malikania.fr>
parents:
572
diff
changeset
|
245 mlk_dir_finish(struct mlk_dir *iter) |
570
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
246 { |
571
cba66f7d8a53
misc: various windows fixes
David Demelier <markand@malikania.fr>
parents:
570
diff
changeset
|
247 handle_finish(iter); |
570
aaf518c87628
util: introduce dir module
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
248 } |