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