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