Use free Windows DDK and compile with latest MinGW releases.
[reactos.git] / reactos / lib / msvcrt / io / find.c
1 #include <msvcrti.h>
2
3
4 int _findclose(int handle)
5 {
6 // check no wildcards or invalid handle
7 if (handle == 0 || handle == -1)
8 return 0;
9 return FindClose((void *)handle);
10 }
11
12 int _findfirst(const char *_name, struct _finddata_t *result)
13 {
14 WIN32_FIND_DATAA FindFileData;
15 char dir[MAX_PATH];
16 long hFindFile;
17 int len = 0;
18
19 if ( _name == NULL || _name[0] == 0 )
20 {
21 len = GetCurrentDirectoryA(MAX_PATH-4,dir);
22 if (dir[len-1] != '\\')
23 {
24 dir[len] = '\\';
25 dir[len+1] = 0;
26 }
27 strcat(dir,"*.*");
28 }
29 else
30 strcpy(dir,_name);
31
32 hFindFile = (long)FindFirstFileA( dir, &FindFileData );
33 if (hFindFile == -1)
34 {
35 memset(result,0,sizeof(struct _finddata_t));
36 return -1;
37 }
38
39 result->attrib = FindFileData.dwFileAttributes;
40 result->time_create = FileTimeToUnixTime(&FindFileData.ftCreationTime,NULL);
41 result->time_access = FileTimeToUnixTime(&FindFileData.ftLastAccessTime,NULL);
42 result->time_write = FileTimeToUnixTime(&FindFileData.ftLastWriteTime,NULL);
43 result->size = FindFileData.nFileSizeLow;
44 strncpy(result->name,FindFileData.cFileName,MAX_PATH);
45
46 // if no wildcard the find file handle can be closed right away
47 // a return value of 0 can flag this.
48
49 if (!strchr(dir,'*') && !strchr(dir,'?'))
50 {
51 _findclose(hFindFile);
52 return 0;
53 }
54
55 return hFindFile;
56 }
57
58 long _findfirsti64(const char *_name, struct _finddatai64_t *result)
59 {
60 WIN32_FIND_DATAA FindFileData;
61 char dir[MAX_PATH];
62 long hFindFile;
63 int len = 0;
64
65 if ( _name == NULL || _name[0] == 0 )
66 {
67 len = GetCurrentDirectoryA(MAX_PATH-4,dir);
68 if (dir[len-1] != '\\')
69 {
70 dir[len] = '\\';
71 dir[len+1] = 0;
72 }
73 strcat(dir, "*.*");
74 }
75 else
76 strcpy(dir, _name);
77
78 hFindFile = (long)FindFirstFileA(dir, &FindFileData);
79 if (hFindFile == -1)
80 {
81 memset(result,0,sizeof(struct _finddatai64_t));
82 return -1;
83 }
84
85 result->attrib = FindFileData.dwFileAttributes;
86 result->time_create = FileTimeToUnixTime(&FindFileData.ftCreationTime,NULL);
87 result->time_access = FileTimeToUnixTime(&FindFileData.ftLastAccessTime,NULL);
88 result->time_write = FileTimeToUnixTime(&FindFileData.ftLastWriteTime,NULL);
89 result->size =
90 (((__int64)FindFileData.nFileSizeLow)<<32) + FindFileData.nFileSizeLow;
91 strncpy(result->name,FindFileData.cFileName,MAX_PATH);
92
93 // if no wildcard the find file handle can be closed right away
94 // a return value of 0 can flag this.
95
96 if (!strchr(dir,'*') && !strchr(dir,'?'))
97 {
98 _findclose(hFindFile);
99 return 0;
100 }
101
102 return hFindFile;
103 }
104
105 int _findnext(int handle, struct _finddata_t *result)
106 {
107 WIN32_FIND_DATAA FindFileData;
108
109 // check no wildcards or invalid handle
110 if (handle == 0 || handle == -1)
111 return 0;
112
113 if (!FindNextFileA((void *)handle, &FindFileData))
114 return -1;
115
116 result->attrib = FindFileData.dwFileAttributes;
117 result->time_create = FileTimeToUnixTime(&FindFileData.ftCreationTime,NULL);
118 result->time_access = FileTimeToUnixTime(&FindFileData.ftLastAccessTime,NULL);
119 result->time_write = FileTimeToUnixTime(&FindFileData.ftLastWriteTime,NULL);
120 result->size = FindFileData.nFileSizeLow;
121 strncpy(result->name,FindFileData.cFileName, MAX_PATH);
122
123 return 0;
124 }
125
126 int _findnexti64(long handle, struct _finddatai64_t *result)
127 {
128 WIN32_FIND_DATAA FindFileData;
129
130 // check no wildcards or invalid handle
131 if (handle == 0 || handle == -1)
132 return 0;
133
134 if (!FindNextFileA((void *)handle, &FindFileData))
135 return -1;
136
137 result->attrib = FindFileData.dwFileAttributes;
138 result->time_create = FileTimeToUnixTime(&FindFileData.ftCreationTime,NULL);
139 result->time_access = FileTimeToUnixTime(&FindFileData.ftLastAccessTime,NULL);
140 result->time_write = FileTimeToUnixTime(&FindFileData.ftLastWriteTime,NULL);
141 result->size =
142 (((__int64)FindFileData.nFileSizeLow)<<32) + FindFileData.nFileSizeLow;
143 strncpy(result->name,FindFileData.cFileName,MAX_PATH);
144
145 return 0;
146 }
147
148 long _wfindfirst(const wchar_t *_name, struct _wfinddata_t *result)
149 {
150 WIN32_FIND_DATAW FindFileData;
151 wchar_t dir[MAX_PATH];
152 long hFindFile;
153 int len = 0;
154
155 if ( _name == NULL || _name[0] == 0 )
156 {
157 len = GetCurrentDirectoryW(MAX_PATH-4, dir);
158 if (dir[len-1] != L'\\')
159 {
160 dir[len] = L'\\';
161 dir[len+1] = 0;
162 }
163 wcscat(dir, L"*.*");
164 }
165 else
166 wcscpy(dir, _name);
167
168 hFindFile = (long)FindFirstFileW(dir, &FindFileData);
169 if (hFindFile == -1)
170 {
171 memset(result,0,sizeof(struct _wfinddata_t));
172 return -1;
173 }
174
175 result->attrib = FindFileData.dwFileAttributes;
176 result->time_create = FileTimeToUnixTime(&FindFileData.ftCreationTime,NULL);
177 result->time_access = FileTimeToUnixTime(&FindFileData.ftLastAccessTime,NULL);
178 result->time_write = FileTimeToUnixTime(&FindFileData.ftLastWriteTime,NULL);
179 result->size = FindFileData.nFileSizeLow;
180 wcsncpy(result->name,FindFileData.cFileName,MAX_PATH);
181
182 // if no wildcard the find file handle can be closed right away
183 // a return value of 0 can flag this.
184
185 if (!wcschr(dir, L'*') && !wcschr(dir, L'?'))
186 {
187 _findclose(hFindFile);
188 return 0;
189 }
190
191 return hFindFile;
192 }
193
194 long _wfindfirsti64(const wchar_t *_name, struct _wfinddatai64_t *result)
195 {
196 WIN32_FIND_DATAW FindFileData;
197 wchar_t dir[MAX_PATH];
198 long hFindFile;
199 int len = 0;
200
201 if (_name == NULL || _name[0] == 0)
202 {
203 len = GetCurrentDirectoryW(MAX_PATH-4,dir);
204 if (dir[len-1] != L'\\')
205 {
206 dir[len] = L'\\';
207 dir[len+1] = 0;
208 }
209 wcscat(dir, L"*.*");
210 }
211 else
212 wcscpy(dir, _name);
213
214 hFindFile = (long)FindFirstFileW(dir, &FindFileData);
215 if (hFindFile == -1)
216 {
217 memset(result,0,sizeof(struct _wfinddatai64_t));
218 return -1;
219 }
220
221 result->attrib = FindFileData.dwFileAttributes;
222 result->time_create = FileTimeToUnixTime(&FindFileData.ftCreationTime,NULL);
223 result->time_access = FileTimeToUnixTime(&FindFileData.ftLastAccessTime,NULL);
224 result->time_write = FileTimeToUnixTime(&FindFileData.ftLastWriteTime,NULL);
225 result->size =
226 (((__int64)FindFileData.nFileSizeLow)<<32) + FindFileData.nFileSizeLow;
227 wcsncpy(result->name,FindFileData.cFileName,MAX_PATH);
228
229 // if no wildcard the find file handle can be closed right away
230 // a return value of 0 can flag this.
231
232 if (!wcschr(dir,L'*') && !wcschr(dir,L'?'))
233 {
234 _findclose(hFindFile);
235 return 0;
236 }
237
238 return hFindFile;
239 }
240
241 int _wfindnext(long handle, struct _wfinddata_t *result)
242 {
243 WIN32_FIND_DATAW FindFileData;
244
245 // check no wildcards or invalid handle
246 if (handle == 0 || handle == -1)
247 return 0;
248
249 if (!FindNextFileW((void *)handle, &FindFileData))
250 return -1;
251
252 result->attrib = FindFileData.dwFileAttributes;
253 result->time_create = FileTimeToUnixTime(&FindFileData.ftCreationTime,NULL);
254 result->time_access = FileTimeToUnixTime(&FindFileData.ftLastAccessTime,NULL);
255 result->time_write = FileTimeToUnixTime(&FindFileData.ftLastWriteTime,NULL);
256 result->size = FindFileData.nFileSizeLow;
257 wcsncpy(result->name,FindFileData.cFileName, MAX_PATH);
258
259 return 0;
260 }
261
262 int _wfindnexti64(long handle, struct _wfinddatai64_t *result)
263 {
264 WIN32_FIND_DATAW FindFileData;
265
266 // check no wildcards or invalid handle
267 if (handle == 0 || handle == -1)
268 return 0;
269
270 if (!FindNextFileW((void *)handle, &FindFileData))
271 return -1;
272
273 result->attrib = FindFileData.dwFileAttributes;
274 result->time_create = FileTimeToUnixTime(&FindFileData.ftCreationTime,NULL);
275 result->time_access = FileTimeToUnixTime(&FindFileData.ftLastAccessTime,NULL);
276 result->time_write = FileTimeToUnixTime(&FindFileData.ftLastWriteTime,NULL);
277 result->size =
278 (((__int64)FindFileData.nFileSizeLow)<<32) + FindFileData.nFileSizeLow;
279 wcsncpy(result->name,FindFileData.cFileName,MAX_PATH);
280
281 return 0;
282 }