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