annotate libmlk-util/mlk/util/dir.c @ 646:7e1eb7f6c049 default tip @

misc: remove .clang
author David Demelier <markand@malikania.fr>
date Sun, 04 Feb 2024 15:24:37 +0100
parents f937857336f3
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 }