1 /* _PDCLIB_open( char const * const, int )
3 This file is part of the Public Domain C Library (PDCLib).
4 Permission is granted to use, modify, and / or redistribute at will.
11 #include "_PDCLIB_glue.h"
14 extern const _PDCLIB_fileops_t _PDCLIB_fileops;
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 )
21 DWORD creationDisposition;
23 switch(mode & ( _PDCLIB_FREAD | _PDCLIB_FWRITE | _PDCLIB_FAPPEND
26 case _PDCLIB_FREAD: /* "r" */
27 desiredAccess = GENERIC_READ;
28 creationDisposition = OPEN_EXISTING;
30 case _PDCLIB_FWRITE: /* "w" */
31 desiredAccess = GENERIC_WRITE;
32 creationDisposition = CREATE_ALWAYS;
34 case _PDCLIB_FAPPEND: /* "a" */
35 desiredAccess = GENERIC_WRITE;
36 creationDisposition = OPEN_ALWAYS;
38 case _PDCLIB_FREAD | _PDCLIB_FRW: /* "r+" */
39 desiredAccess = GENERIC_READ | GENERIC_WRITE;
40 creationDisposition = OPEN_EXISTING;
42 case _PDCLIB_FWRITE | _PDCLIB_FRW: /* "w+" */
43 desiredAccess = GENERIC_WRITE | GENERIC_READ;
44 creationDisposition = CREATE_ALWAYS;
46 case _PDCLIB_FAPPEND | _PDCLIB_FRW: /* "a+" */
47 desiredAccess = GENERIC_WRITE | GENERIC_READ;
48 creationDisposition = OPEN_ALWAYS;
50 default: /* Invalid mode */
55 HANDLE fd = CreateFileA(filename, desiredAccess,
56 FILE_SHARE_READ | FILE_SHARE_DELETE,
57 NULL, creationDisposition, FILE_ATTRIBUTE_NORMAL, NULL);
59 if(fd == INVALID_HANDLE_VALUE) {
61 DWORD dw = GetLastError();
64 FORMAT_MESSAGE_ALLOCATE_BUFFER |
65 FORMAT_MESSAGE_FROM_SYSTEM |
66 FORMAT_MESSAGE_IGNORE_INSERTS,
69 MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
73 fprintf(stderr, "Error: %s\n", msgBuf);
79 if(mode & _PDCLIB_FAPPEND) {
82 BOOL ok = SetFilePointerEx(fd, offs, NULL, FILE_END);
91 *pOps = &_PDCLIB_fileops;
98 #include "_PDCLIB_test.h"