Mercurial > irccd
annotate extern/libcompat/win/dirent/dirent.h @ 1004:3ea3361f0fc7
irccd: now track modes
author | David Demelier <markand@malikania.fr> |
---|---|
date | Tue, 16 Feb 2021 18:37:22 +0100 |
parents | 21a91311c8ea |
children |
rev | line source |
---|---|
948
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
1 /* |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
2 * Dirent interface for Microsoft Visual Studio |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
3 * |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
4 * Copyright (C) 1998-2019 Toni Ronkko |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
5 * This file is part of dirent. Dirent may be freely distributed |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
6 * under the MIT license. For all details and documentation, see |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
7 * https://github.com/tronkko/dirent |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
8 */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
9 #ifndef DIRENT_H |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
10 #define DIRENT_H |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
11 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
12 /* Hide warnings about unreferenced local functions */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
13 #if defined(__clang__) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
14 # pragma clang diagnostic ignored "-Wunused-function" |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
15 #elif defined(_MSC_VER) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
16 # pragma warning(disable:4505) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
17 #elif defined(__GNUC__) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
18 # pragma GCC diagnostic ignored "-Wunused-function" |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
19 #endif |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
20 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
21 /* |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
22 * Include windows.h without Windows Sockets 1.1 to prevent conflicts with |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
23 * Windows Sockets 2.0. |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
24 */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
25 #ifndef WIN32_LEAN_AND_MEAN |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
26 # define WIN32_LEAN_AND_MEAN |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
27 #endif |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
28 #include <windows.h> |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
29 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
30 #include <stdio.h> |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
31 #include <stdarg.h> |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
32 #include <wchar.h> |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
33 #include <string.h> |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
34 #include <stdlib.h> |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
35 #include <malloc.h> |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
36 #include <sys/types.h> |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
37 #include <sys/stat.h> |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
38 #include <errno.h> |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
39 #include <ctype.h> |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
40 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
41 /* Indicates that d_type field is available in dirent structure */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
42 #define _DIRENT_HAVE_D_TYPE |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
43 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
44 /* Indicates that d_namlen field is available in dirent structure */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
45 #define _DIRENT_HAVE_D_NAMLEN |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
46 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
47 /* Entries missing from MSVC 6.0 */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
48 #if !defined(FILE_ATTRIBUTE_DEVICE) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
49 # define FILE_ATTRIBUTE_DEVICE 0x40 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
50 #endif |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
51 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
52 /* File type and permission flags for stat(), general mask */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
53 #if !defined(S_IFMT) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
54 # define S_IFMT _S_IFMT |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
55 #endif |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
56 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
57 /* Directory bit */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
58 #if !defined(S_IFDIR) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
59 # define S_IFDIR _S_IFDIR |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
60 #endif |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
61 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
62 /* Character device bit */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
63 #if !defined(S_IFCHR) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
64 # define S_IFCHR _S_IFCHR |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
65 #endif |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
66 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
67 /* Pipe bit */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
68 #if !defined(S_IFFIFO) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
69 # define S_IFFIFO _S_IFFIFO |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
70 #endif |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
71 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
72 /* Regular file bit */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
73 #if !defined(S_IFREG) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
74 # define S_IFREG _S_IFREG |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
75 #endif |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
76 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
77 /* Read permission */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
78 #if !defined(S_IREAD) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
79 # define S_IREAD _S_IREAD |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
80 #endif |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
81 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
82 /* Write permission */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
83 #if !defined(S_IWRITE) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
84 # define S_IWRITE _S_IWRITE |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
85 #endif |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
86 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
87 /* Execute permission */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
88 #if !defined(S_IEXEC) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
89 # define S_IEXEC _S_IEXEC |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
90 #endif |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
91 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
92 /* Pipe */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
93 #if !defined(S_IFIFO) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
94 # define S_IFIFO _S_IFIFO |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
95 #endif |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
96 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
97 /* Block device */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
98 #if !defined(S_IFBLK) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
99 # define S_IFBLK 0 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
100 #endif |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
101 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
102 /* Link */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
103 #if !defined(S_IFLNK) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
104 # define S_IFLNK 0 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
105 #endif |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
106 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
107 /* Socket */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
108 #if !defined(S_IFSOCK) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
109 # define S_IFSOCK 0 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
110 #endif |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
111 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
112 /* Read user permission */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
113 #if !defined(S_IRUSR) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
114 # define S_IRUSR S_IREAD |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
115 #endif |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
116 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
117 /* Write user permission */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
118 #if !defined(S_IWUSR) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
119 # define S_IWUSR S_IWRITE |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
120 #endif |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
121 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
122 /* Execute user permission */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
123 #if !defined(S_IXUSR) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
124 # define S_IXUSR 0 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
125 #endif |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
126 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
127 /* Read group permission */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
128 #if !defined(S_IRGRP) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
129 # define S_IRGRP 0 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
130 #endif |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
131 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
132 /* Write group permission */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
133 #if !defined(S_IWGRP) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
134 # define S_IWGRP 0 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
135 #endif |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
136 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
137 /* Execute group permission */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
138 #if !defined(S_IXGRP) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
139 # define S_IXGRP 0 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
140 #endif |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
141 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
142 /* Read others permission */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
143 #if !defined(S_IROTH) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
144 # define S_IROTH 0 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
145 #endif |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
146 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
147 /* Write others permission */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
148 #if !defined(S_IWOTH) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
149 # define S_IWOTH 0 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
150 #endif |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
151 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
152 /* Execute others permission */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
153 #if !defined(S_IXOTH) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
154 # define S_IXOTH 0 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
155 #endif |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
156 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
157 /* Maximum length of file name */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
158 #if !defined(PATH_MAX) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
159 # define PATH_MAX MAX_PATH |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
160 #endif |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
161 #if !defined(FILENAME_MAX) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
162 # define FILENAME_MAX MAX_PATH |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
163 #endif |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
164 #if !defined(NAME_MAX) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
165 # define NAME_MAX FILENAME_MAX |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
166 #endif |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
167 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
168 /* File type flags for d_type */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
169 #define DT_UNKNOWN 0 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
170 #define DT_REG S_IFREG |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
171 #define DT_DIR S_IFDIR |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
172 #define DT_FIFO S_IFIFO |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
173 #define DT_SOCK S_IFSOCK |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
174 #define DT_CHR S_IFCHR |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
175 #define DT_BLK S_IFBLK |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
176 #define DT_LNK S_IFLNK |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
177 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
178 /* Macros for converting between st_mode and d_type */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
179 #define IFTODT(mode) ((mode) & S_IFMT) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
180 #define DTTOIF(type) (type) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
181 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
182 /* |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
183 * File type macros. Note that block devices, sockets and links cannot be |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
184 * distinguished on Windows and the macros S_ISBLK, S_ISSOCK and S_ISLNK are |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
185 * only defined for compatibility. These macros should always return false |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
186 * on Windows. |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
187 */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
188 #if !defined(S_ISFIFO) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
189 # define S_ISFIFO(mode) (((mode) & S_IFMT) == S_IFIFO) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
190 #endif |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
191 #if !defined(S_ISDIR) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
192 # define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
193 #endif |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
194 #if !defined(S_ISREG) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
195 # define S_ISREG(mode) (((mode) & S_IFMT) == S_IFREG) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
196 #endif |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
197 #if !defined(S_ISLNK) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
198 # define S_ISLNK(mode) (((mode) & S_IFMT) == S_IFLNK) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
199 #endif |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
200 #if !defined(S_ISSOCK) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
201 # define S_ISSOCK(mode) (((mode) & S_IFMT) == S_IFSOCK) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
202 #endif |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
203 #if !defined(S_ISCHR) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
204 # define S_ISCHR(mode) (((mode) & S_IFMT) == S_IFCHR) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
205 #endif |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
206 #if !defined(S_ISBLK) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
207 # define S_ISBLK(mode) (((mode) & S_IFMT) == S_IFBLK) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
208 #endif |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
209 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
210 /* Return the exact length of the file name without zero terminator */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
211 #define _D_EXACT_NAMLEN(p) ((p)->d_namlen) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
212 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
213 /* Return the maximum size of a file name */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
214 #define _D_ALLOC_NAMLEN(p) ((PATH_MAX)+1) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
215 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
216 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
217 #ifdef __cplusplus |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
218 extern "C" { |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
219 #endif |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
220 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
221 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
222 /* Wide-character version */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
223 struct _wdirent { |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
224 /* Always zero */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
225 long d_ino; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
226 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
227 /* File position within stream */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
228 long d_off; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
229 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
230 /* Structure size */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
231 unsigned short d_reclen; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
232 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
233 /* Length of name without \0 */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
234 size_t d_namlen; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
235 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
236 /* File type */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
237 int d_type; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
238 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
239 /* File name */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
240 wchar_t d_name[PATH_MAX+1]; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
241 }; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
242 typedef struct _wdirent _wdirent; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
243 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
244 struct _WDIR { |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
245 /* Current directory entry */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
246 struct _wdirent ent; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
247 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
248 /* Private file data */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
249 WIN32_FIND_DATAW data; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
250 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
251 /* True if data is valid */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
252 int cached; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
253 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
254 /* Win32 search handle */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
255 HANDLE handle; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
256 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
257 /* Initial directory name */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
258 wchar_t *patt; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
259 }; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
260 typedef struct _WDIR _WDIR; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
261 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
262 /* Multi-byte character version */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
263 struct dirent { |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
264 /* Always zero */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
265 long d_ino; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
266 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
267 /* File position within stream */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
268 long d_off; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
269 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
270 /* Structure size */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
271 unsigned short d_reclen; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
272 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
273 /* Length of name without \0 */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
274 size_t d_namlen; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
275 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
276 /* File type */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
277 int d_type; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
278 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
279 /* File name */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
280 char d_name[PATH_MAX+1]; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
281 }; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
282 typedef struct dirent dirent; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
283 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
284 struct DIR { |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
285 struct dirent ent; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
286 struct _WDIR *wdirp; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
287 }; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
288 typedef struct DIR DIR; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
289 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
290 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
291 /* Dirent functions */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
292 static DIR *opendir(const char *dirname); |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
293 static _WDIR *_wopendir(const wchar_t *dirname); |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
294 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
295 static struct dirent *readdir(DIR *dirp); |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
296 static struct _wdirent *_wreaddir(_WDIR *dirp); |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
297 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
298 static int readdir_r( |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
299 DIR *dirp, struct dirent *entry, struct dirent **result); |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
300 static int _wreaddir_r( |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
301 _WDIR *dirp, struct _wdirent *entry, struct _wdirent **result); |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
302 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
303 static int closedir(DIR *dirp); |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
304 static int _wclosedir(_WDIR *dirp); |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
305 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
306 static void rewinddir(DIR* dirp); |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
307 static void _wrewinddir(_WDIR* dirp); |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
308 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
309 static int scandir(const char *dirname, struct dirent ***namelist, |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
310 int (*filter)(const struct dirent*), |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
311 int (*compare)(const struct dirent**, const struct dirent**)); |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
312 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
313 static int alphasort(const struct dirent **a, const struct dirent **b); |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
314 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
315 static int versionsort(const struct dirent **a, const struct dirent **b); |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
316 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
317 static int strverscmp(const char *a, const char *b); |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
318 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
319 /* For compatibility with Symbian */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
320 #define wdirent _wdirent |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
321 #define WDIR _WDIR |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
322 #define wopendir _wopendir |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
323 #define wreaddir _wreaddir |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
324 #define wclosedir _wclosedir |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
325 #define wrewinddir _wrewinddir |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
326 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
327 /* Compatibility with older Microsoft compilers and non-Microsoft compilers */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
328 #if !defined(_MSC_VER) || _MSC_VER < 1400 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
329 # define wcstombs_s dirent_wcstombs_s |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
330 # define mbstowcs_s dirent_mbstowcs_s |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
331 #endif |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
332 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
333 /* Optimize dirent_set_errno() away on modern Microsoft compilers */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
334 #if defined(_MSC_VER) && _MSC_VER >= 1400 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
335 # define dirent_set_errno _set_errno |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
336 #endif |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
337 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
338 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
339 /* Internal utility functions */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
340 static WIN32_FIND_DATAW *dirent_first(_WDIR *dirp); |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
341 static WIN32_FIND_DATAW *dirent_next(_WDIR *dirp); |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
342 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
343 #if !defined(_MSC_VER) || _MSC_VER < 1400 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
344 static int dirent_mbstowcs_s( |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
345 size_t *pReturnValue, wchar_t *wcstr, size_t sizeInWords, |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
346 const char *mbstr, size_t count); |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
347 #endif |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
348 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
349 #if !defined(_MSC_VER) || _MSC_VER < 1400 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
350 static int dirent_wcstombs_s( |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
351 size_t *pReturnValue, char *mbstr, size_t sizeInBytes, |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
352 const wchar_t *wcstr, size_t count); |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
353 #endif |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
354 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
355 #if !defined(_MSC_VER) || _MSC_VER < 1400 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
356 static void dirent_set_errno(int error); |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
357 #endif |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
358 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
359 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
360 /* |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
361 * Open directory stream DIRNAME for read and return a pointer to the |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
362 * internal working area that is used to retrieve individual directory |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
363 * entries. |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
364 */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
365 static _WDIR *_wopendir(const wchar_t *dirname) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
366 { |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
367 wchar_t *p; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
368 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
369 /* Must have directory name */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
370 if (dirname == NULL || dirname[0] == '\0') { |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
371 dirent_set_errno(ENOENT); |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
372 return NULL; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
373 } |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
374 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
375 /* Allocate new _WDIR structure */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
376 _WDIR *dirp = (_WDIR*) malloc(sizeof(struct _WDIR)); |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
377 if (!dirp) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
378 return NULL; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
379 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
380 /* Reset _WDIR structure */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
381 dirp->handle = INVALID_HANDLE_VALUE; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
382 dirp->patt = NULL; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
383 dirp->cached = 0; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
384 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
385 /* |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
386 * Compute the length of full path plus zero terminator |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
387 * |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
388 * Note that on WinRT there's no way to convert relative paths |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
389 * into absolute paths, so just assume it is an absolute path. |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
390 */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
391 #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
392 /* Desktop */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
393 DWORD n = GetFullPathNameW(dirname, 0, NULL, NULL); |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
394 #else |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
395 /* WinRT */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
396 size_t n = wcslen(dirname); |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
397 #endif |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
398 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
399 /* Allocate room for absolute directory name and search pattern */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
400 dirp->patt = (wchar_t*) malloc(sizeof(wchar_t) * n + 16); |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
401 if (dirp->patt == NULL) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
402 goto exit_closedir; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
403 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
404 /* |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
405 * Convert relative directory name to an absolute one. This |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
406 * allows rewinddir() to function correctly even when current |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
407 * working directory is changed between opendir() and rewinddir(). |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
408 * |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
409 * Note that on WinRT there's no way to convert relative paths |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
410 * into absolute paths, so just assume it is an absolute path. |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
411 */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
412 #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
413 /* Desktop */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
414 n = GetFullPathNameW(dirname, n, dirp->patt, NULL); |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
415 if (n <= 0) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
416 goto exit_closedir; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
417 #else |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
418 /* WinRT */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
419 wcsncpy_s(dirp->patt, n+1, dirname, n); |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
420 #endif |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
421 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
422 /* Append search pattern \* to the directory name */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
423 p = dirp->patt + n; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
424 switch (p[-1]) { |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
425 case '\\': |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
426 case '/': |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
427 case ':': |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
428 /* Directory ends in path separator, e.g. c:\temp\ */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
429 /*NOP*/; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
430 break; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
431 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
432 default: |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
433 /* Directory name doesn't end in path separator */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
434 *p++ = '\\'; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
435 } |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
436 *p++ = '*'; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
437 *p = '\0'; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
438 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
439 /* Open directory stream and retrieve the first entry */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
440 if (!dirent_first(dirp)) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
441 goto exit_closedir; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
442 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
443 /* Success */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
444 return dirp; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
445 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
446 /* Failure */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
447 exit_closedir: |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
448 _wclosedir(dirp); |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
449 return NULL; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
450 } |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
451 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
452 /* |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
453 * Read next directory entry. |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
454 * |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
455 * Returns pointer to static directory entry which may be overwritten by |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
456 * subsequent calls to _wreaddir(). |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
457 */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
458 static struct _wdirent *_wreaddir(_WDIR *dirp) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
459 { |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
460 /* |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
461 * Read directory entry to buffer. We can safely ignore the return |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
462 * value as entry will be set to NULL in case of error. |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
463 */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
464 struct _wdirent *entry; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
465 (void) _wreaddir_r(dirp, &dirp->ent, &entry); |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
466 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
467 /* Return pointer to statically allocated directory entry */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
468 return entry; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
469 } |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
470 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
471 /* |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
472 * Read next directory entry. |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
473 * |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
474 * Returns zero on success. If end of directory stream is reached, then sets |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
475 * result to NULL and returns zero. |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
476 */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
477 static int _wreaddir_r( |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
478 _WDIR *dirp, struct _wdirent *entry, struct _wdirent **result) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
479 { |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
480 /* Read next directory entry */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
481 WIN32_FIND_DATAW *datap = dirent_next(dirp); |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
482 if (!datap) { |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
483 /* Return NULL to indicate end of directory */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
484 *result = NULL; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
485 return /*OK*/0; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
486 } |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
487 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
488 /* |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
489 * Copy file name as wide-character string. If the file name is too |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
490 * long to fit in to the destination buffer, then truncate file name |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
491 * to PATH_MAX characters and zero-terminate the buffer. |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
492 */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
493 size_t n = 0; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
494 while (n < PATH_MAX && datap->cFileName[n] != 0) { |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
495 entry->d_name[n] = datap->cFileName[n]; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
496 n++; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
497 } |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
498 entry->d_name[n] = 0; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
499 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
500 /* Length of file name excluding zero terminator */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
501 entry->d_namlen = n; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
502 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
503 /* File type */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
504 DWORD attr = datap->dwFileAttributes; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
505 if ((attr & FILE_ATTRIBUTE_DEVICE) != 0) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
506 entry->d_type = DT_CHR; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
507 else if ((attr & FILE_ATTRIBUTE_DIRECTORY) != 0) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
508 entry->d_type = DT_DIR; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
509 else |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
510 entry->d_type = DT_REG; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
511 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
512 /* Reset dummy fields */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
513 entry->d_ino = 0; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
514 entry->d_off = 0; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
515 entry->d_reclen = sizeof(struct _wdirent); |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
516 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
517 /* Set result address */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
518 *result = entry; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
519 return /*OK*/0; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
520 } |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
521 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
522 /* |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
523 * Close directory stream opened by opendir() function. This invalidates the |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
524 * DIR structure as well as any directory entry read previously by |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
525 * _wreaddir(). |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
526 */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
527 static int _wclosedir(_WDIR *dirp) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
528 { |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
529 if (!dirp) { |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
530 dirent_set_errno(EBADF); |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
531 return /*failure*/-1; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
532 } |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
533 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
534 /* Release search handle */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
535 if (dirp->handle != INVALID_HANDLE_VALUE) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
536 FindClose(dirp->handle); |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
537 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
538 /* Release search pattern */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
539 free(dirp->patt); |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
540 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
541 /* Release directory structure */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
542 free(dirp); |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
543 return /*success*/0; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
544 } |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
545 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
546 /* |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
547 * Rewind directory stream such that _wreaddir() returns the very first |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
548 * file name again. |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
549 */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
550 static void _wrewinddir(_WDIR* dirp) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
551 { |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
552 if (!dirp) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
553 return; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
554 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
555 /* Release existing search handle */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
556 if (dirp->handle != INVALID_HANDLE_VALUE) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
557 FindClose(dirp->handle); |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
558 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
559 /* Open new search handle */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
560 dirent_first(dirp); |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
561 } |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
562 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
563 /* Get first directory entry */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
564 static WIN32_FIND_DATAW *dirent_first(_WDIR *dirp) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
565 { |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
566 if (!dirp) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
567 return NULL; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
568 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
569 /* Open directory and retrieve the first entry */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
570 dirp->handle = FindFirstFileExW( |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
571 dirp->patt, FindExInfoStandard, &dirp->data, |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
572 FindExSearchNameMatch, NULL, 0); |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
573 if (dirp->handle == INVALID_HANDLE_VALUE) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
574 goto error; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
575 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
576 /* A directory entry is now waiting in memory */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
577 dirp->cached = 1; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
578 return &dirp->data; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
579 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
580 error: |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
581 /* Failed to open directory: no directory entry in memory */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
582 dirp->cached = 0; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
583 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
584 /* Set error code */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
585 DWORD errorcode = GetLastError(); |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
586 switch (errorcode) { |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
587 case ERROR_ACCESS_DENIED: |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
588 /* No read access to directory */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
589 dirent_set_errno(EACCES); |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
590 break; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
591 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
592 case ERROR_DIRECTORY: |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
593 /* Directory name is invalid */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
594 dirent_set_errno(ENOTDIR); |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
595 break; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
596 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
597 case ERROR_PATH_NOT_FOUND: |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
598 default: |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
599 /* Cannot find the file */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
600 dirent_set_errno(ENOENT); |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
601 } |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
602 return NULL; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
603 } |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
604 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
605 /* Get next directory entry */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
606 static WIN32_FIND_DATAW *dirent_next(_WDIR *dirp) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
607 { |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
608 /* Is the next directory entry already in cache? */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
609 if (dirp->cached) { |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
610 /* Yes, a valid directory entry found in memory */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
611 dirp->cached = 0; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
612 return &dirp->data; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
613 } |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
614 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
615 /* No directory entry in cache */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
616 if (dirp->handle == INVALID_HANDLE_VALUE) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
617 return NULL; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
618 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
619 /* Read the next directory entry from stream */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
620 if (FindNextFileW(dirp->handle, &dirp->data) == FALSE) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
621 goto exit_close; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
622 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
623 /* Success */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
624 return &dirp->data; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
625 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
626 /* Failure */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
627 exit_close: |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
628 FindClose(dirp->handle); |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
629 dirp->handle = INVALID_HANDLE_VALUE; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
630 return NULL; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
631 } |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
632 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
633 /* Open directory stream using plain old C-string */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
634 static DIR *opendir(const char *dirname) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
635 { |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
636 /* Must have directory name */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
637 if (dirname == NULL || dirname[0] == '\0') { |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
638 dirent_set_errno(ENOENT); |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
639 return NULL; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
640 } |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
641 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
642 /* Allocate memory for DIR structure */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
643 struct DIR *dirp = (DIR*) malloc(sizeof(struct DIR)); |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
644 if (!dirp) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
645 return NULL; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
646 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
647 /* Convert directory name to wide-character string */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
648 wchar_t wname[PATH_MAX + 1]; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
649 size_t n; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
650 int error = mbstowcs_s(&n, wname, PATH_MAX + 1, dirname, PATH_MAX+1); |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
651 if (error) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
652 goto exit_failure; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
653 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
654 /* Open directory stream using wide-character name */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
655 dirp->wdirp = _wopendir(wname); |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
656 if (!dirp->wdirp) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
657 goto exit_failure; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
658 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
659 /* Success */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
660 return dirp; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
661 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
662 /* Failure */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
663 exit_failure: |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
664 free(dirp); |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
665 return NULL; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
666 } |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
667 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
668 /* Read next directory entry */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
669 static struct dirent *readdir(DIR *dirp) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
670 { |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
671 /* |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
672 * Read directory entry to buffer. We can safely ignore the return |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
673 * value as entry will be set to NULL in case of error. |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
674 */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
675 struct dirent *entry; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
676 (void) readdir_r(dirp, &dirp->ent, &entry); |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
677 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
678 /* Return pointer to statically allocated directory entry */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
679 return entry; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
680 } |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
681 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
682 /* |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
683 * Read next directory entry into called-allocated buffer. |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
684 * |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
685 * Returns zero on success. If the end of directory stream is reached, then |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
686 * sets result to NULL and returns zero. |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
687 */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
688 static int readdir_r( |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
689 DIR *dirp, struct dirent *entry, struct dirent **result) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
690 { |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
691 /* Read next directory entry */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
692 WIN32_FIND_DATAW *datap = dirent_next(dirp->wdirp); |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
693 if (!datap) { |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
694 /* No more directory entries */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
695 *result = NULL; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
696 return /*OK*/0; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
697 } |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
698 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
699 /* Attempt to convert file name to multi-byte string */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
700 size_t n; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
701 int error = wcstombs_s( |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
702 &n, entry->d_name, PATH_MAX + 1, |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
703 datap->cFileName, PATH_MAX + 1); |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
704 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
705 /* |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
706 * If the file name cannot be represented by a multi-byte string, then |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
707 * attempt to use old 8+3 file name. This allows the program to |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
708 * access files although file names may seem unfamiliar to the user. |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
709 * |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
710 * Be ware that the code below cannot come up with a short file name |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
711 * unless the file system provides one. At least VirtualBox shared |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
712 * folders fail to do this. |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
713 */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
714 if (error && datap->cAlternateFileName[0] != '\0') { |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
715 error = wcstombs_s( |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
716 &n, entry->d_name, PATH_MAX + 1, |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
717 datap->cAlternateFileName, PATH_MAX + 1); |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
718 } |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
719 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
720 if (!error) { |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
721 /* Length of file name excluding zero terminator */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
722 entry->d_namlen = n - 1; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
723 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
724 /* File attributes */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
725 DWORD attr = datap->dwFileAttributes; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
726 if ((attr & FILE_ATTRIBUTE_DEVICE) != 0) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
727 entry->d_type = DT_CHR; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
728 else if ((attr & FILE_ATTRIBUTE_DIRECTORY) != 0) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
729 entry->d_type = DT_DIR; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
730 else |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
731 entry->d_type = DT_REG; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
732 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
733 /* Reset dummy fields */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
734 entry->d_ino = 0; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
735 entry->d_off = 0; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
736 entry->d_reclen = sizeof(struct dirent); |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
737 } else { |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
738 /* |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
739 * Cannot convert file name to multi-byte string so construct |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
740 * an erroneous directory entry and return that. Note that |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
741 * we cannot return NULL as that would stop the processing |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
742 * of directory entries completely. |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
743 */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
744 entry->d_name[0] = '?'; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
745 entry->d_name[1] = '\0'; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
746 entry->d_namlen = 1; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
747 entry->d_type = DT_UNKNOWN; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
748 entry->d_ino = 0; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
749 entry->d_off = -1; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
750 entry->d_reclen = 0; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
751 } |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
752 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
753 /* Return pointer to directory entry */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
754 *result = entry; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
755 return /*OK*/0; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
756 } |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
757 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
758 /* Close directory stream */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
759 static int closedir(DIR *dirp) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
760 { |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
761 int ok; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
762 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
763 if (!dirp) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
764 goto exit_failure; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
765 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
766 /* Close wide-character directory stream */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
767 ok = _wclosedir(dirp->wdirp); |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
768 dirp->wdirp = NULL; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
769 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
770 /* Release multi-byte character version */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
771 free(dirp); |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
772 return ok; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
773 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
774 exit_failure: |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
775 /* Invalid directory stream */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
776 dirent_set_errno(EBADF); |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
777 return /*failure*/-1; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
778 } |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
779 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
780 /* Rewind directory stream to beginning */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
781 static void rewinddir(DIR* dirp) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
782 { |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
783 if (!dirp) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
784 return; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
785 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
786 /* Rewind wide-character string directory stream */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
787 _wrewinddir(dirp->wdirp); |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
788 } |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
789 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
790 /* Scan directory for entries */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
791 static int scandir( |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
792 const char *dirname, struct dirent ***namelist, |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
793 int (*filter)(const struct dirent*), |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
794 int (*compare)(const struct dirent**, const struct dirent**)) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
795 { |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
796 int result; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
797 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
798 /* Open directory stream */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
799 DIR *dir = opendir(dirname); |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
800 if (!dir) { |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
801 /* Cannot open directory */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
802 return /*Error*/ -1; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
803 } |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
804 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
805 /* Read directory entries to memory */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
806 struct dirent *tmp = NULL; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
807 struct dirent **files = NULL; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
808 size_t size = 0; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
809 size_t allocated = 0; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
810 while (1) { |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
811 /* Allocate room for a temporary directory entry */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
812 if (!tmp) { |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
813 tmp = (struct dirent*) malloc(sizeof(struct dirent)); |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
814 if (!tmp) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
815 goto exit_failure; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
816 } |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
817 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
818 /* Read directory entry to temporary area */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
819 struct dirent *entry; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
820 if (readdir_r(dir, tmp, &entry) != /*OK*/0) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
821 goto exit_failure; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
822 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
823 /* Stop if we already read the last directory entry */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
824 if (entry == NULL) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
825 goto exit_success; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
826 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
827 /* Determine whether to include the entry in results */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
828 if (filter && !filter(tmp)) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
829 continue; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
830 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
831 /* Enlarge pointer table to make room for another pointer */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
832 if (size >= allocated) { |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
833 /* Compute number of entries in the new table */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
834 size_t num_entries = size * 2 + 16; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
835 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
836 /* Allocate new pointer table or enlarge existing */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
837 void *p = realloc(files, sizeof(void*) * num_entries); |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
838 if (!p) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
839 goto exit_failure; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
840 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
841 /* Got the memory */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
842 files = (dirent**) p; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
843 allocated = num_entries; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
844 } |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
845 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
846 /* Store the temporary entry to ptr table */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
847 files[size++] = tmp; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
848 tmp = NULL; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
849 } |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
850 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
851 exit_failure: |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
852 /* Release allocated file entries */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
853 for (size_t i = 0; i < size; i++) { |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
854 free(files[i]); |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
855 } |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
856 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
857 /* Release the pointer table */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
858 free(files); |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
859 files = NULL; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
860 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
861 /* Exit with error code */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
862 result = /*error*/ -1; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
863 goto exit_status; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
864 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
865 exit_success: |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
866 /* Sort directory entries */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
867 qsort(files, size, sizeof(void*), |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
868 (int (*) (const void*, const void*)) compare); |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
869 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
870 /* Pass pointer table to caller */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
871 if (namelist) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
872 *namelist = files; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
873 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
874 /* Return the number of directory entries read */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
875 result = (int) size; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
876 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
877 exit_status: |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
878 /* Release temporary directory entry, if we had one */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
879 free(tmp); |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
880 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
881 /* Close directory stream */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
882 closedir(dir); |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
883 return result; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
884 } |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
885 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
886 /* Alphabetical sorting */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
887 static int alphasort(const struct dirent **a, const struct dirent **b) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
888 { |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
889 return strcoll((*a)->d_name, (*b)->d_name); |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
890 } |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
891 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
892 /* Sort versions */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
893 static int versionsort(const struct dirent **a, const struct dirent **b) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
894 { |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
895 return strverscmp((*a)->d_name, (*b)->d_name); |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
896 } |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
897 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
898 /* Compare strings */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
899 static int strverscmp(const char *a, const char *b) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
900 { |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
901 size_t i = 0; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
902 size_t j; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
903 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
904 /* Find first difference */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
905 while (a[i] == b[i]) { |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
906 if (a[i] == '\0') { |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
907 /* No difference */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
908 return 0; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
909 } |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
910 ++i; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
911 } |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
912 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
913 /* Count backwards and find the leftmost digit */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
914 j = i; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
915 while (j > 0 && isdigit(a[j-1])) { |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
916 --j; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
917 } |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
918 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
919 /* Determine mode of comparison */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
920 if (a[j] == '0' || b[j] == '0') { |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
921 /* Find the next non-zero digit */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
922 while (a[j] == '0' && a[j] == b[j]) { |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
923 j++; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
924 } |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
925 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
926 /* String with more digits is smaller, e.g 002 < 01 */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
927 if (isdigit(a[j])) { |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
928 if (!isdigit(b[j])) { |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
929 return -1; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
930 } |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
931 } else if (isdigit(b[j])) { |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
932 return 1; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
933 } |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
934 } else if (isdigit(a[j]) && isdigit(b[j])) { |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
935 /* Numeric comparison */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
936 size_t k1 = j; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
937 size_t k2 = j; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
938 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
939 /* Compute number of digits in each string */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
940 while (isdigit(a[k1])) { |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
941 k1++; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
942 } |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
943 while (isdigit(b[k2])) { |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
944 k2++; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
945 } |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
946 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
947 /* Number with more digits is bigger, e.g 999 < 1000 */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
948 if (k1 < k2) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
949 return -1; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
950 else if (k1 > k2) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
951 return 1; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
952 } |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
953 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
954 /* Alphabetical comparison */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
955 return (int) ((unsigned char) a[i]) - ((unsigned char) b[i]); |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
956 } |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
957 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
958 /* Convert multi-byte string to wide character string */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
959 #if !defined(_MSC_VER) || _MSC_VER < 1400 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
960 static int dirent_mbstowcs_s( |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
961 size_t *pReturnValue, wchar_t *wcstr, |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
962 size_t sizeInWords, const char *mbstr, size_t count) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
963 { |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
964 /* Older Visual Studio or non-Microsoft compiler */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
965 size_t n = mbstowcs(wcstr, mbstr, sizeInWords); |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
966 if (wcstr && n >= count) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
967 return /*error*/ 1; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
968 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
969 /* Zero-terminate output buffer */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
970 if (wcstr && sizeInWords) { |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
971 if (n >= sizeInWords) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
972 n = sizeInWords - 1; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
973 wcstr[n] = 0; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
974 } |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
975 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
976 /* Length of multi-byte string with zero terminator */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
977 if (pReturnValue) { |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
978 *pReturnValue = n + 1; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
979 } |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
980 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
981 /* Success */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
982 return 0; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
983 } |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
984 #endif |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
985 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
986 /* Convert wide-character string to multi-byte string */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
987 #if !defined(_MSC_VER) || _MSC_VER < 1400 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
988 static int dirent_wcstombs_s( |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
989 size_t *pReturnValue, char *mbstr, |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
990 size_t sizeInBytes, const wchar_t *wcstr, size_t count) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
991 { |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
992 /* Older Visual Studio or non-Microsoft compiler */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
993 size_t n = wcstombs(mbstr, wcstr, sizeInBytes); |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
994 if (mbstr && n >= count) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
995 return /*error*/1; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
996 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
997 /* Zero-terminate output buffer */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
998 if (mbstr && sizeInBytes) { |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
999 if (n >= sizeInBytes) { |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
1000 n = sizeInBytes - 1; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
1001 } |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
1002 mbstr[n] = '\0'; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
1003 } |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
1004 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
1005 /* Length of resulting multi-bytes string WITH zero-terminator */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
1006 if (pReturnValue) { |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
1007 *pReturnValue = n + 1; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
1008 } |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
1009 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
1010 /* Success */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
1011 return 0; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
1012 } |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
1013 #endif |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
1014 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
1015 /* Set errno variable */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
1016 #if !defined(_MSC_VER) || _MSC_VER < 1400 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
1017 static void dirent_set_errno(int error) |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
1018 { |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
1019 /* Non-Microsoft compiler or older Microsoft compiler */ |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
1020 errno = error; |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
1021 } |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
1022 #endif |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
1023 |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
1024 #ifdef __cplusplus |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
1025 } |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
1026 #endif |
21a91311c8ea
cmake: switch back, GNU make is painful
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
1027 #endif /*DIRENT_H*/ |