]> pd.if.org Git - pdclib/blob - platform/win32/functions/_PDCLIB/_PDCLIB_fileops.c
PDCLib includes with quotes, not <>.
[pdclib] / platform / win32 / functions / _PDCLIB / _PDCLIB_fileops.c
1 /* _PDCLIB_fileops\r
2 \r
3    This file is part of the Public Domain C Library (PDCLib).\r
4    Permission is granted to use, modify, and / or redistribute at will.\r
5 */\r
6 \r
7 #ifndef REGTEST\r
8 #include <stdio.h>\r
9 #include <stdint.h>\r
10 #include "_PDCLIB_glue.h"\r
11 #include <errno.h>\r
12 #include <windows.h>\r
13 \r
14 #if _PDCLIB_C_MIN(2011)\r
15 _Static_assert(SEEK_SET == FILE_BEGIN, "SEEK_SET is incorrect");\r
16 _Static_assert(SEEK_CUR == FILE_CURRENT, "SEEK_CUR is incorrect");\r
17 _Static_assert(SEEK_END == FILE_END, "SEEK_END is incorrect");\r
18 #endif\r
19 \r
20 void _PDCLIB_w32errno(void);\r
21 \r
22 static bool readf( _PDCLIB_fd_t self, void * buf, size_t length, \r
23                    size_t * numBytesRead )\r
24 {\r
25     DWORD dwLen = length > INT32_MAX ? INT32_MAX : length;\r
26     DWORD dwBytesRead;\r
27     if(ReadFile(self.pointer, buf, dwLen, &dwBytesRead, NULL)) {\r
28         *numBytesRead = dwBytesRead;\r
29         return true;\r
30     } else {\r
31         _PDCLIB_w32errno();\r
32         return false;\r
33     }\r
34 }\r
35 \r
36 static bool writef( _PDCLIB_fd_t self, const void * buf, size_t length, \r
37                    size_t * numBytesWritten )\r
38 {\r
39     DWORD dwLen = length > INT32_MAX ? INT32_MAX : length;\r
40     DWORD dwBytesWritten;\r
41 \r
42     if(WriteFile(self.pointer, buf, dwLen, &dwBytesWritten, NULL)) {\r
43         *numBytesWritten = dwBytesWritten;\r
44         return true;\r
45     } else {\r
46         _PDCLIB_w32errno();\r
47         return false;\r
48     }\r
49 }\r
50 static bool seekf( _PDCLIB_fd_t self, int_fast64_t offset, int whence,\r
51     int_fast64_t* newPos )\r
52 {\r
53     LARGE_INTEGER liOffset;\r
54     liOffset.QuadPart = offset;\r
55     if(!SetFilePointerEx( self.pointer, liOffset, &liOffset, whence )) {\r
56         _PDCLIB_w32errno();\r
57         return false;\r
58     }\r
59 \r
60     *newPos = liOffset.QuadPart;\r
61     return true;\r
62 }\r
63 \r
64 static void closef( _PDCLIB_fd_t self )\r
65 {\r
66     CloseHandle( self.pointer );\r
67 }\r
68 \r
69 const _PDCLIB_fileops_t _PDCLIB_fileops = {\r
70     .read  = readf,\r
71     .write = writef,\r
72     .seek  = seekf,\r
73     .close = closef,\r
74 };\r
75 \r
76 #endif\r
77 \r
78 #ifdef TEST\r
79 #include "_PDCLIB_test.h"\r
80 \r
81 int main( void )\r
82 {\r
83     // Tested by stdio test cases\r
84     return TEST_RESULTS;\r
85 }\r
86 \r
87 #endif\r