From 9c38a6899957746cbf2c0c04d110626a9271d51a Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Thu, 20 Jul 2000 08:56:12 +0000 Subject: Update. 2000-07-20 Ulrich Drepper * libio/Makefile (tests): Add tst_wprintf2. (tst_wprintf2-ARGS): Define. * libio/tst_wprintf2.c: New file. Based on a test case by Yoshito Kawada . * libio/wfiledoalloc.c: Only allocate external buffer if this hasn't happened yet. * libio/wfileops.c (_IO_wdo_write): Overflow only if there is really something in the buffer. gconv call can write up to end of the buffer, not only _IO_write_end. (_IO_wfile_overflow): Allocate also external buffer. * stdio-common/vfprintf.c (process_string_arg): Handle multibyte strings with precision in vfwprintf correctly. * stdio-common/vfprintf.c: Fix completely broken handling of unbuffered wide character streams. Reported by Yoshito Kawada . --- libio/wfileops.c | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) (limited to 'libio/wfileops.c') diff --git a/libio/wfileops.c b/libio/wfileops.c index 3489b36fb1..94c14c9151 100644 --- a/libio/wfileops.c +++ b/libio/wfileops.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1993, 1995, 1997, 1998, 1999 Free Software Foundation, Inc. +/* Copyright (C) 1993, 95, 97, 98, 99, 2000 Free Software Foundation, Inc. This file is part of the GNU IO Library. Written by Ulrich Drepper . Based on the single byte version by Per Bothner . @@ -67,7 +67,8 @@ _IO_wdo_write (fp, data, to_do) enum __codecvt_result result; const wchar_t *new_data; - if (fp->_IO_write_end == fp->_IO_write_ptr) + if (fp->_IO_write_end == fp->_IO_write_ptr + && fp->_IO_write_end != fp->_IO_write_base) { _IO_new_file_overflow (fp, EOF); assert (fp->_IO_write_end > fp->_IO_write_ptr); @@ -77,7 +78,7 @@ _IO_wdo_write (fp, data, to_do) result = (*cc->__codecvt_do_out) (cc, &fp->_wide_data->_IO_state, data, data + to_do, &new_data, fp->_IO_write_ptr, - fp->_IO_write_end, + fp->_IO_buf_end, &fp->_IO_write_ptr); /* Write out what we produced so far. */ @@ -289,6 +290,12 @@ _IO_wfile_overflow (f, wch) _IO_wdoallocbuf (f); _IO_wsetg (f, f->_wide_data->_IO_buf_base, f->_wide_data->_IO_buf_base, f->_wide_data->_IO_buf_base); + + if (f->_IO_write_base == NULL) + { + _IO_doallocbuf (f); + _IO_setg (f, f->_IO_buf_base, f->_IO_buf_base, f->_IO_buf_base); + } } else { @@ -313,13 +320,18 @@ _IO_wfile_overflow (f, wch) f->_wide_data->_IO_read_base = f->_wide_data->_IO_read_ptr = f->_wide_data->_IO_read_end; + f->_IO_write_ptr = f->_IO_read_ptr; + f->_IO_write_base = f->_IO_write_ptr; + f->_IO_write_end = f->_IO_buf_end; + f->_IO_read_base = f->_IO_read_ptr = f->_IO_read_end; + f->_flags |= _IO_CURRENTLY_PUTTING; if (f->_flags & (_IO_LINE_BUF+_IO_UNBUFFERED)) f->_wide_data->_IO_write_end = f->_wide_data->_IO_write_ptr; } if (wch == WEOF) return _IO_do_flush (f); - if (f->_wide_data->_IO_write_ptr == f->_wide_data->_IO_buf_end ) + if (f->_wide_data->_IO_write_ptr == f->_wide_data->_IO_buf_end) /* Buffer is really full */ if (_IO_do_flush (f) == WEOF) return WEOF; -- cgit v1.2.3