]> pd.if.org Git - pdclib/blob - platform/win32/functions/_PDCLIB/_PDCLIB_open.c
Cosmetic comment fixes.
[pdclib] / platform / win32 / functions / _PDCLIB / _PDCLIB_open.c
1 /* _PDCLIB_open( char const * const, int )
2
3    This file is part of the Public Domain C Library (PDCLib).
4    Permission is granted to use, modify, and / or redistribute at will.
5 */
6
7 #include <stdio.h>
8 #include <errno.h>
9
10 #ifndef REGTEST
11 #include "_PDCLIB_glue.h"
12 #include <windows.h>
13
14 extern const _PDCLIB_fileops_t _PDCLIB_fileops;
15
16 void _PDCLIB_w32errno(void);
17 bool _PDCLIB_open( _PDCLIB_fd_t * pFd, const _PDCLIB_fileops_t ** pOps,
18                    char const * const filename, unsigned int mode )
19 {
20     DWORD desiredAccess;
21     DWORD creationDisposition;
22
23     switch(mode & ( _PDCLIB_FREAD | _PDCLIB_FWRITE | _PDCLIB_FAPPEND 
24                     | _PDCLIB_FRW ))
25     {
26     case _PDCLIB_FREAD: /* "r" */
27         desiredAccess = GENERIC_READ;
28         creationDisposition = OPEN_EXISTING;
29         break;
30     case _PDCLIB_FWRITE: /* "w" */
31         desiredAccess = GENERIC_WRITE;
32         creationDisposition = CREATE_ALWAYS;
33         break;
34     case _PDCLIB_FAPPEND: /* "a" */
35         desiredAccess = GENERIC_WRITE;
36         creationDisposition = OPEN_ALWAYS;
37         break;
38     case _PDCLIB_FREAD | _PDCLIB_FRW: /* "r+" */
39         desiredAccess = GENERIC_READ | GENERIC_WRITE;
40         creationDisposition = OPEN_EXISTING;
41         break;
42     case _PDCLIB_FWRITE | _PDCLIB_FRW: /* "w+" */
43         desiredAccess = GENERIC_WRITE | GENERIC_READ;
44         creationDisposition = CREATE_ALWAYS;
45         break;
46     case _PDCLIB_FAPPEND | _PDCLIB_FRW: /* "a+" */
47         desiredAccess = GENERIC_WRITE | GENERIC_READ;
48         creationDisposition = OPEN_ALWAYS;
49         break;
50     default: /* Invalid mode */
51         errno = EINVAL;
52         return false;
53     }
54
55     HANDLE fd = CreateFileA(filename, desiredAccess, 
56         FILE_SHARE_READ | FILE_SHARE_DELETE,
57         NULL, creationDisposition, FILE_ATTRIBUTE_NORMAL, NULL);
58
59     if(fd == INVALID_HANDLE_VALUE) {
60 #if 0
61         DWORD dw = GetLastError();
62         char* msgBuf;
63         FormatMessage(
64             FORMAT_MESSAGE_ALLOCATE_BUFFER | 
65             FORMAT_MESSAGE_FROM_SYSTEM |
66             FORMAT_MESSAGE_IGNORE_INSERTS,
67             NULL,
68             dw,
69             MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
70             (LPSTR) &msgBuf,
71             0, NULL );
72
73         fprintf(stderr, "Error: %s\n", msgBuf);
74 #endif
75         _PDCLIB_w32errno();
76         return false;
77     }
78
79     if(mode & _PDCLIB_FAPPEND) {
80         LARGE_INTEGER offs;
81         offs.QuadPart = 0;
82         BOOL ok = SetFilePointerEx(fd, offs, NULL, FILE_END);
83         if(!ok) {
84             _PDCLIB_w32errno();
85             CloseHandle(fd);
86             return false;
87         }
88     }
89
90     pFd->pointer = fd;
91     *pOps = &_PDCLIB_fileops;
92     return true;
93 }
94
95 #endif
96
97 #ifdef TEST
98 #include "_PDCLIB_test.h"
99
100 #include <stdlib.h>
101 #include <string.h>
102
103 int main( void )
104 {
105     return TEST_RESULTS;
106 }
107
108 #endif
109