X-Git-Url: https://pd.if.org/git/?a=blobdiff_plain;f=platform%2Fwin32%2Ffunctions%2F_PDCLIB%2F_PDCLIB_open.c;fp=platform%2Fwin32%2Ffunctions%2F_PDCLIB%2F_PDCLIB_open.c;h=bfdb8975c49bfb9726306749e7a1a1444670f390;hb=d8928b5f31bbdac23f9ec296ef28b4b10efa31d5;hp=0000000000000000000000000000000000000000;hpb=219271fd548949abce8bd75c34dd42e519418fc4;p=pdclib diff --git a/platform/win32/functions/_PDCLIB/_PDCLIB_open.c b/platform/win32/functions/_PDCLIB/_PDCLIB_open.c new file mode 100644 index 0000000..bfdb897 --- /dev/null +++ b/platform/win32/functions/_PDCLIB/_PDCLIB_open.c @@ -0,0 +1,94 @@ +/* $Id$ */ + +/* _PDCLIB_open( char const * const, int ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +/* This is a stub implementation of open. +*/ + +#include +#include + +#ifndef REGTEST +#include <_PDCLIB_glue.h> +#include + +void _PDCLIB_w32errno(void); +HANDLE _PDCLIB_open( char const * const filename, unsigned int mode ) +{ + DWORD desiredAccess; + DWORD creationDisposition; + + switch(mode & ( _PDCLIB_FREAD | _PDCLIB_FWRITE | _PDCLIB_FAPPEND + | _PDCLIB_FRW )) + { + case _PDCLIB_FREAD: /* "r" */ + desiredAccess = GENERIC_READ; + creationDisposition = OPEN_EXISTING; + break; + case _PDCLIB_FWRITE: /* "w" */ + desiredAccess = GENERIC_WRITE; + creationDisposition = CREATE_ALWAYS; + break; + case _PDCLIB_FAPPEND: /* "a" */ + desiredAccess = GENERIC_WRITE; + creationDisposition = OPEN_ALWAYS; + break; + case _PDCLIB_FREAD | _PDCLIB_FRW: /* "r+" */ + desiredAccess = GENERIC_READ | GENERIC_WRITE; + creationDisposition = OPEN_EXISTING; + break; + case _PDCLIB_FWRITE | _PDCLIB_FRW: /* "w+" */ + desiredAccess = GENERIC_WRITE | GENERIC_READ; + creationDisposition = CREATE_ALWAYS; + break; + case _PDCLIB_FAPPEND | _PDCLIB_FRW: /* "a+" */ + desiredAccess = GENERIC_WRITE | GENERIC_READ; + creationDisposition = OPEN_ALWAYS; + break; + default: /* Invalid mode */ + errno = EINVAL; + return NULL; + } + + HANDLE fd = CreateFileA(filename, desiredAccess, + FILE_SHARE_READ | FILE_SHARE_DELETE, + NULL, creationDisposition, FILE_ATTRIBUTE_NORMAL, NULL); + + if(fd == INVALID_HANDLE_VALUE) { + _PDCLIB_w32errno(); + return NULL; + } + + if(mode & _PDCLIB_FAPPEND) { + LARGE_INTEGER offs; + offs.QuadPart = 0; + BOOL ok = SetFilePointerEx(fd, offs, NULL, FILE_END); + if(!ok) { + _PDCLIB_w32errno(); + CloseHandle(fd); + return NULL; + } + } + + return fd; +} + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> + +#include +#include + +int main( void ) +{ + return TEST_RESULTS; +} + +#endif +