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.
7 /* This is a stub implementation of open.
14 #include <_PDCLIB_glue.h>
17 extern const _PDCLIB_fileops_t _PDCLIB_fileops;
19 void _PDCLIB_w32errno(void);
20 bool _PDCLIB_open( _PDCLIB_fd_t * pFd, const _PDCLIB_fileops_t ** pOps,
21 char const * const filename, unsigned int mode )
24 DWORD creationDisposition;
26 switch(mode & ( _PDCLIB_FREAD | _PDCLIB_FWRITE | _PDCLIB_FAPPEND
29 case _PDCLIB_FREAD: /* "r" */
30 desiredAccess = GENERIC_READ;
31 creationDisposition = OPEN_EXISTING;
33 case _PDCLIB_FWRITE: /* "w" */
34 desiredAccess = GENERIC_WRITE;
35 creationDisposition = CREATE_ALWAYS;
37 case _PDCLIB_FAPPEND: /* "a" */
38 desiredAccess = GENERIC_WRITE;
39 creationDisposition = OPEN_ALWAYS;
41 case _PDCLIB_FREAD | _PDCLIB_FRW: /* "r+" */
42 desiredAccess = GENERIC_READ | GENERIC_WRITE;
43 creationDisposition = OPEN_EXISTING;
45 case _PDCLIB_FWRITE | _PDCLIB_FRW: /* "w+" */
46 desiredAccess = GENERIC_WRITE | GENERIC_READ;
47 creationDisposition = CREATE_ALWAYS;
49 case _PDCLIB_FAPPEND | _PDCLIB_FRW: /* "a+" */
50 desiredAccess = GENERIC_WRITE | GENERIC_READ;
51 creationDisposition = OPEN_ALWAYS;
53 default: /* Invalid mode */
58 HANDLE fd = CreateFileA(filename, desiredAccess,
59 FILE_SHARE_READ | FILE_SHARE_DELETE,
60 NULL, creationDisposition, FILE_ATTRIBUTE_NORMAL, NULL);
62 if(fd == INVALID_HANDLE_VALUE) {
64 DWORD dw = GetLastError();
67 FORMAT_MESSAGE_ALLOCATE_BUFFER |
68 FORMAT_MESSAGE_FROM_SYSTEM |
69 FORMAT_MESSAGE_IGNORE_INSERTS,
72 MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
76 fprintf(stderr, "Error: %s\n", msgBuf);
82 if(mode & _PDCLIB_FAPPEND) {
85 BOOL ok = SetFilePointerEx(fd, offs, NULL, FILE_END);
94 *pOps = &_PDCLIB_fileops;
101 #include <_PDCLIB_test.h>