Added binary and unicode file i/o support to msvcrt.
[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 len = GetCurrentDirectoryA(MAX_PATH-4,dir);
24 if (dir[len-1] != '\\') {
25 dir[len] = '\\';
26 dir[len+1] = 0;
27 }
28 strcat(dir,"*.*");
29 } else {
30 strcpy(dir,_name);
31 }
32
33 hFindFile = (long)FindFirstFileA(dir, &FindFileData);
34 if (hFindFile == -1) {
35 memset(result,0,sizeof(struct _finddata_t));
36 return -1;
37 }
38
39 result->attrib = FindFileData.dwFileAttributes;
40 result->time_create = FileTimeToUnixTime(&FindFileData.ftCreationTime,NULL);
41 result->time_access = FileTimeToUnixTime(&FindFileData.ftLastAccessTime,NULL);
42 result->time_write = FileTimeToUnixTime(&FindFileData.ftLastWriteTime,NULL);
43 result->size = FindFileData.nFileSizeLow;
44 strncpy(result->name,FindFileData.cFileName,MAX_PATH);
45
46 // if no wildcard the find file handle can be closed right away
47 // a return value of 0 can flag this.
48
49 if (!strchr(dir,'*') && !strchr(dir,'?')) {
50 _findclose(hFindFile);
51 return 0;
52 }
53
54 return hFindFile;
55 }
56
57 int _findnext(int handle, struct _finddata_t* result)
58 {
59 WIN32_FIND_DATAA FindFileData;
60
61 // check no wildcards or invalid handle
62 if (handle == 0 || handle == -1)
63 return 0;
64
65 if (!FindNextFileA((void*)handle, &FindFileData))
66 return -1;
67
68 result->attrib = FindFileData.dwFileAttributes;
69 result->time_create = FileTimeToUnixTime(&FindFileData.ftCreationTime,NULL);
70 result->time_access = FileTimeToUnixTime(&FindFileData.ftLastAccessTime,NULL);
71 result->time_write = FileTimeToUnixTime(&FindFileData.ftLastWriteTime,NULL);
72 result->size = FindFileData.nFileSizeLow;
73 strncpy(result->name,FindFileData.cFileName, MAX_PATH);
74
75 return 0;
76 }
77