diff options
author | Ulrich Drepper <drepper@redhat.com> | 2000-07-20 08:56:12 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2000-07-20 08:56:12 +0000 |
commit | 9c38a6899957746cbf2c0c04d110626a9271d51a (patch) | |
tree | 7baeb90b3aff1cf0acf63fed32577f3a9ad17764 /stdio-common/vfprintf.c | |
parent | 4e8286acfa4224ac9ccfb07e90b8fd70fab1467e (diff) | |
download | glibc-9c38a6899957746cbf2c0c04d110626a9271d51a.tar glibc-9c38a6899957746cbf2c0c04d110626a9271d51a.tar.gz glibc-9c38a6899957746cbf2c0c04d110626a9271d51a.tar.bz2 glibc-9c38a6899957746cbf2c0c04d110626a9271d51a.zip |
Update.
2000-07-20 Ulrich Drepper <drepper@redhat.com>
* libio/Makefile (tests): Add tst_wprintf2.
(tst_wprintf2-ARGS): Define.
* libio/tst_wprintf2.c: New file.
Based on a test case by Yoshito Kawada <KAWADA@jp.ibm.com>.
* 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 <KAWADA@jp.ibm.com>.
Diffstat (limited to 'stdio-common/vfprintf.c')
-rw-r--r-- | stdio-common/vfprintf.c | 34 |
1 files changed, 31 insertions, 3 deletions
diff --git a/stdio-common/vfprintf.c b/stdio-common/vfprintf.c index 32ad9d85ab..23981d18cd 100644 --- a/stdio-common/vfprintf.c +++ b/stdio-common/vfprintf.c @@ -1030,14 +1030,14 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap) const char *mbs = (const char *) string; \ mbstate_t mbstate; \ \ - len = prec == -1 ? strnlen (mbs, prec) : strlen (mbs); \ + len = prec != -1 ? strnlen (mbs, prec) : strlen (mbs); \ \ /* Allocate dynamically an array which definitely is long \ enough for the wide character version. */ \ - string = (CHAR_T *) alloca ((len + 1) * sizeof (wchar_t)); \ + string = (CHAR_T *) alloca (len * sizeof (wchar_t)); \ \ memset (&mbstate, '\0', sizeof (mbstate_t)); \ - len = __mbsrtowcs (string, &mbs, len + 1, &mbstate); \ + len = __mbsrtowcs (string, &mbs, len, &mbstate); \ if (len == (size_t) -1) \ { \ /* Illegal multibyte character. */ \ @@ -1919,6 +1919,9 @@ group_number (CHAR_T *w, CHAR_T *rear_ptr, const char *grouping, struct helper_file { struct _IO_FILE_plus _f; +#ifdef COMPILE_WPRINTF + struct _IO_wide_data _wide_data; +#endif _IO_FILE *_put_stream; #ifdef _IO_MTSAFE_IO _IO_lock_t lock; @@ -1948,6 +1951,29 @@ _IO_helper_overflow (_IO_FILE *s, int c) return PUTC (c, s); } +#ifdef COMPILE_WPRINTF +static const struct _IO_jump_t _IO_helper_jumps = +{ + JUMP_INIT_DUMMY, + JUMP_INIT (finish, _IO_wdefault_finish), + JUMP_INIT (overflow, _IO_helper_overflow), + JUMP_INIT (underflow, _IO_default_underflow), + JUMP_INIT (uflow, _IO_default_uflow), + JUMP_INIT (pbackfail, (_IO_pbackfail_t) _IO_wdefault_pbackfail), + JUMP_INIT (xsputn, _IO_wdefault_xsputn), + JUMP_INIT (xsgetn, _IO_wdefault_xsgetn), + JUMP_INIT (seekoff, _IO_default_seekoff), + JUMP_INIT (seekpos, _IO_default_seekpos), + JUMP_INIT (setbuf,(_IO_setbuf_t) _IO_wdefault_setbuf), + JUMP_INIT (sync, _IO_default_sync), + JUMP_INIT (doallocate, _IO_wdefault_doallocate), + JUMP_INIT (read, _IO_default_read), + JUMP_INIT (write, _IO_default_write), + JUMP_INIT (seek, _IO_default_seek), + JUMP_INIT (close, _IO_default_close), + JUMP_INIT (stat, _IO_default_stat) +}; +#else static const struct _IO_jump_t _IO_helper_jumps = { JUMP_INIT_DUMMY, @@ -1969,6 +1995,7 @@ static const struct _IO_jump_t _IO_helper_jumps = JUMP_INIT (close, _IO_default_close), JUMP_INIT (stat, _IO_default_stat) }; +#endif static int internal_function @@ -1983,6 +2010,7 @@ buffered_vfprintf (register _IO_FILE *s, const CHAR_T *format, /* Initialize helper. */ helper._put_stream = s; #ifdef COMPILE_WPRINTF + hp->_wide_data = &helper._wide_data; _IO_wsetp (hp, buf, buf + sizeof buf / sizeof (CHAR_T)); hp->_mode = 1; #else |