merge trunk head (37902)
[reactos.git] / reactos / lib / sdk / crt / stdio / find64.c
1 #include <precomp.h>
2 #include <tchar.h>
3 #include <io.h>
4
5 #ifndef _USE_FIND64
6 #define _USE_FIND64 1
7 #endif
8
9 /*
10 * @implemented
11 */
12 #if _USE_FIND64
13 intptr_t _tfindfirst32i64(const _TCHAR* _name, struct _tfinddata32i64_t* result)
14 #else
15 intptr_t _tfindfirst32(const _TCHAR* _name, struct _tfinddata32_t* result)
16 #endif
17 {
18 WIN32_FIND_DATA FindFileData;
19 HANDLE hFindFile;
20
21 hFindFile = FindFirstFile(_name, &FindFileData);
22 if (hFindFile == INVALID_HANDLE_VALUE) {
23 _dosmaperr(GetLastError());
24 return -1;
25 }
26
27 result->attrib = FindFileData.dwFileAttributes;
28 result->time_create = FileTimeToUnixTime(&FindFileData.ftCreationTime,NULL);
29 result->time_access = FileTimeToUnixTime(&FindFileData.ftLastAccessTime,NULL);
30 result->time_write = FileTimeToUnixTime(&FindFileData.ftLastWriteTime,NULL);
31 result->size = FindFileData.nFileSizeLow;
32 _tcsncpy(result->name,FindFileData.cFileName,MAX_PATH);
33
34 return (intptr_t)hFindFile;
35 }
36
37 /*
38 * @implemented
39 */
40 #if _USE_FIND64
41 int _tfindnext32i64(intptr_t handle, struct _tfinddata32i64_t* result)
42 #else
43 int _tfindnext32(intptr_t handle, struct _tfinddata32_t* result)
44 #endif
45 {
46 WIN32_FIND_DATA FindFileData;
47
48 if (!FindNextFile((HANDLE)handle, &FindFileData)) {
49 _dosmaperr(GetLastError());
50 return -1;
51 }
52
53 result->attrib = FindFileData.dwFileAttributes;
54 result->time_create = FileTimeToUnixTime(&FindFileData.ftCreationTime,NULL);
55 result->time_access = FileTimeToUnixTime(&FindFileData.ftLastAccessTime,NULL);
56 result->time_write = FileTimeToUnixTime(&FindFileData.ftLastWriteTime,NULL);
57 result->size = FindFileData.nFileSizeLow;
58 _tcsncpy(result->name,FindFileData.cFileName, MAX_PATH);
59
60 return 0;
61 }
62
63
64 /*
65 * @implemented
66 */
67 #if _USE_FIND64
68 intptr_t _tfindfirst64(const _TCHAR *_name, struct _tfinddata64_t *result)
69 #else
70 intptr_t _tfindfirst64i32(const _TCHAR *_name, struct _tfinddata64i32_t *result)
71 #endif
72 {
73 WIN32_FIND_DATA FindFileData;
74 HANDLE hFindFile;
75
76 hFindFile = FindFirstFile(_name, &FindFileData);
77 if (hFindFile == INVALID_HANDLE_VALUE) {
78 _dosmaperr(GetLastError());
79 return -1;
80 }
81
82 result->attrib = FindFileData.dwFileAttributes;
83 result->time_create = FileTimeToUnixTime(&FindFileData.ftCreationTime,NULL);
84 result->time_access = FileTimeToUnixTime(&FindFileData.ftLastAccessTime,NULL);
85 result->time_write = FileTimeToUnixTime(&FindFileData.ftLastWriteTime,NULL);
86 result->size =
87 (((__int64)FindFileData.nFileSizeLow)<<32) + FindFileData.nFileSizeLow;
88 _tcsncpy(result->name,FindFileData.cFileName,MAX_PATH);
89
90 return (intptr_t)hFindFile;
91 }
92
93 /*
94 * @implemented
95 */
96 #if _USE_FIND64
97 int _tfindnext64(intptr_t handle, struct _tfinddata64_t *result)
98 #else
99 int _tfindnext64i32(intptr_t handle, struct _tfinddata64i32_t *result)
100 #endif
101 {
102 WIN32_FIND_DATA FindFileData;
103
104 if (!FindNextFile((HANDLE)handle, &FindFileData)) {
105 _dosmaperr(GetLastError());
106 return -1;
107 }
108
109 result->attrib = FindFileData.dwFileAttributes;
110 result->time_create = FileTimeToUnixTime(&FindFileData.ftCreationTime,NULL);
111 result->time_access = FileTimeToUnixTime(&FindFileData.ftLastAccessTime,NULL);
112 result->time_write = FileTimeToUnixTime(&FindFileData.ftLastWriteTime,NULL);
113 result->size =
114 (((__int64)FindFileData.nFileSizeLow)<<32) + FindFileData.nFileSizeLow;
115 _tcsncpy(result->name,FindFileData.cFileName,MAX_PATH);
116
117 return 0;
118 }
119