- Rewrite broken _flsbuf and implement _flswbuf
- use _flswbuf in wstreamout
- Fixes broken text output in dwnl etc

svn path=/trunk/; revision=50290
This commit is contained in:
Timo Kreuzer 2011-01-04 22:22:13 +00:00
parent 6ea6bad914
commit 79ec14277f
5 changed files with 115 additions and 48 deletions

View file

@ -354,6 +354,8 @@
<file>xcptinfo.c</file>
</directory>
<directory name="stdio">
<file>_flsbuf.c</file>
<file>_flswbuf.c</file>
<file>access.c</file>
<file>file.c</file>
<file>find.c</file>

View file

@ -16,6 +16,8 @@
#ifdef _UNICODE
#define streamout wstreamout
#define format_float format_floatw
#define _flsbuf _flswbuf
int __cdecl _flwsbuf(int ch, FILE *stream);
#endif
#define MB_CUR_MAX 10
@ -68,7 +70,8 @@ enum
va_arg(argptr, double)
#ifdef _LIBCNT_
# define _flsbuf(chr, stream) 0
# undef _flsbuf
# define _flsbuf(chr, stream) _TEOF
#endif
#define get_exp(f) floor(f == 0 ? 0 : (f >= 0 ? log10(f) : log10(-f)))

View file

@ -0,0 +1,82 @@
/*
* COPYRIGHT: GNU GPL, see COPYING in the top level directory
* PROJECT: ReactOS crt library
* FILE: lib/sdk/crt/stdio/_flsbuf.c
* PURPOSE: Implementation of _flsbuf / _flswbuf
* PROGRAMMER: Timo Kreuzer
*/
#include <stdio.h>
#include <io.h>
#include <tchar.h>
void __cdecl alloc_buffer(FILE *stream);
int __cdecl
_flsbuf(int ch, FILE *stream)
{
int count, written;
/* Check if the stream supports flushing */
if ((stream->_flag & _IOSTRG) || !(stream->_flag & (_IORW|_IOWRT)))
{
stream->_flag |= _IOERR;
return EOF;
}
/* Is this was a read buffer */
if (stream->_flag & _IOREAD)
{
/* Must be at the end of the file */
if (!(stream->_flag & _IOEOF))
{
stream->_flag |= _IOERR;
stream->_cnt = 0;
return EOF;
}
/* Reset buffer */
stream->_ptr = stream->_base;
}
/* Fixup flags */
stream->_flag &= ~(_IOREAD|_IOEOF);
stream->_flag |= _IOWRT;
/* If we have no buffer, try to allocate one */
if (!stream->_base && stream != stdout && stream != stderr)
{
alloc_buffer(stream);
}
/* Check if we have a buffer now */
if (stream->_base)
{
/* We have one, check if there is something to write */
count = stream->_ptr - stream->_base;
if (count > 0)
written = _write(stream->_file, stream->_base, count);
else
written = 0;
/* Reset buffer and put the char into it */
stream->_ptr = stream->_base + sizeof(TCHAR);
stream->_cnt = stream->_bufsiz - sizeof(TCHAR);
*(TCHAR*)stream->_base = ch;
}
else
{
/* There is no buffer, write the char directly */
count = sizeof(TCHAR);
written = _write(stream->_file, &ch, sizeof(TCHAR));
}
/* Check for failure */
if (written != count)
{
stream->_flag |= _IOERR;
return EOF;
}
return (TCHAR)ch;
}

View file

@ -0,0 +1,11 @@
/*
* COPYRIGHT: GNU GPL, see COPYING in the top level directory
* PROJECT: ReactOS crt library
* FILE: lib/sdk/crt/stdio/_flswbuf
* PURPOSE: Implementation of _flswbuf
* PROGRAMMER: Timo Kreuzer
*/
#define _UNICODE
#define _flsbuf _flswbuf
#include "_flsbuf.c"

View file

@ -409,7 +409,7 @@ static int flush_buffer(FILE* file)
}
/* INTERNAL: Allocate stdio file buffer */
static void alloc_buffer(FILE* file)
void alloc_buffer(FILE* file)
{
file->_base = calloc(BUFSIZ,1);
if(file->_base) {
@ -2290,37 +2290,6 @@ int CDECL fputc(int c, FILE* file)
}
}
/*********************************************************************
* _flsbuf (MSVCRT.@)
*/
int CDECL _flsbuf(int c, FILE* file)
{
/* Flush output buffer */
if(file->_bufsiz == 0 && !(file->_flag & _IONBF)) {
alloc_buffer(file);
}
if(!(file->_flag & _IOWRT)) {
if(file->_flag & _IORW) {
file->_flag |= _IOWRT;
} else {
return EOF;
}
}
if(file->_bufsiz) {
int res=flush_buffer(file);
return res?res : fputc(c, file);
} else {
unsigned char cc=c;
int len;
/* set _cnt to 0 for unbuffered FILEs */
file->_cnt = 0;
len = _write(file->_file, &cc, 1);
if (len == 1) return c & 0xff;
file->_flag |= _IOERR;
return EOF;
}
}
/*********************************************************************
* _fputchar (MSVCRT.@)
*/