From e129158330f9c1daa0ddea833c9cbc37dd749c61 Mon Sep 17 00:00:00 2001 From: Hartmut Birr Date: Mon, 1 Apr 2002 21:52:45 +0000 Subject: [PATCH] Added debug messages. Added LN to CR/LN translation for text files. svn path=/trunk/; revision=2799 --- reactos/lib/msvcrt/io/write.c | 77 ++++++++++++++++++++++++++++++++--- 1 file changed, 71 insertions(+), 6 deletions(-) diff --git a/reactos/lib/msvcrt/io/write.c b/reactos/lib/msvcrt/io/write.c index b7a3d8e041c..299d3042ef1 100644 --- a/reactos/lib/msvcrt/io/write.c +++ b/reactos/lib/msvcrt/io/write.c @@ -1,7 +1,7 @@ /* * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries - * FILE: lib/crtdll/io/write.c + * FILE: lib/msvcrt/io/write.c * PURPOSE: Writes to a file * PROGRAMER: Boudewijn Dekker * UPDATE HISTORY: @@ -9,15 +9,80 @@ */ #include #include +#include +#define NDEBUG +#include + +#define BUFSIZE 4096 size_t _write(int _fd, const void *_buf, size_t _nbyte) { - DWORD _wbyte; - - if (!WriteFile(_get_osfhandle(_fd),_buf,_nbyte,&_wbyte,NULL)) + char *tmp, *in, *out; + int count, result; + DWORD wbyte; + + DPRINT("_write(fd %d, buf %x, nbyte %d)\n", _fd, _buf, _nbyte); + if (__fileno_getmode(_fd) & O_TEXT) { - return -1; + result = _nbyte; + tmp = (char*) malloc(BUFSIZE); + if (tmp == NULL) + { + return -1; + } + count = BUFSIZE; + out = tmp; + in = (char*) _buf; + while (_nbyte--) + { + if (*in == 0x0a) + { + *out++ = 0x0d; + count--; + if (count == 0) + { + if (!WriteFile(_get_osfhandle(_fd), tmp, BUFSIZE, &wbyte, NULL)) + { + result = -1; + break; + } + if (wbyte < BUFSIZE) + { + result = in - (char*)_buf; + break; + } + count = BUFSIZE; + out = tmp; + } + } + *out++ = *in++; + count--; + if (count == 0 || _nbyte == 0) + { + if (!WriteFile(_get_osfhandle(_fd), tmp, BUFSIZE - count, &wbyte, NULL)) + { + result = -1; + break; + } + if (wbyte < BUFSIZE - count) + { + result = in - (char*)_buf; + break; + } + count = BUFSIZE; + out = tmp; + } + } + free(tmp); + return result; + } + else + { + if(!WriteFile(_get_osfhandle(_fd), _buf, _nbyte, &wbyte, NULL)) + { + return -1; + } + return wbyte; } - return (size_t)_wbyte; }