:pserver:cvsanon@mok.lvcm.com:/CVS/ReactOS reactos
[reactos.git] / 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 }