From 3920a99a229053dc5692099626ada88d29b79b1f Mon Sep 17 00:00:00 2001 From: Corinna Vinschen Date: Fri, 11 Jan 2013 20:05:41 +0000 Subject: [PATCH] * libc/stdio/vfwprintf.c (_VFWPRINTF_R): Add code to correctly handle 's' format specifier on not _MB_CAPABLE targets. Fix a formatting glitch in _MB_CAPABLE enabled code. Add a missing 'L' specifier. --- newlib/ChangeLog | 8 +++++++- newlib/libc/stdio/vfwprintf.c | 38 +++++++++++++++++++++++++++-------- 2 files changed, 37 insertions(+), 9 deletions(-) diff --git a/newlib/ChangeLog b/newlib/ChangeLog index e9c67ba12..2a6d564e9 100644 --- a/newlib/ChangeLog +++ b/newlib/ChangeLog @@ -1,3 +1,9 @@ +2013-01-11 Corinna Vinschen + + * libc/stdio/vfwprintf.c (_VFWPRINTF_R): Add code to correctly handle + 's' format specifier on not _MB_CAPABLE targets. Fix a formatting + glitch in _MB_CAPABLE enabled code. Add a missing 'L' specifier. + 2013-01-10 Marcus Shawcroft * libc/machine/aarch64/Makefile.am (lib_a_SOURCES): Add @@ -8,7 +14,7 @@ 2013-01-10 Marcus Shawcroft - * libc/machine/aarch64/Makefile.am (lib_a_SOURCES): Add + * libc/machine/aarch64/Makefile.am (lib_a_SOURCES): Add strnlen-stub.c and strnlen.S * libc/machine/aarch64/Makefile.in: Regenerated. * libc/machine/aarch64/strnlen-stub.c: New file. diff --git a/newlib/libc/stdio/vfwprintf.c b/newlib/libc/stdio/vfwprintf.c index 968c218b5..dfa8fde2f 100644 --- a/newlib/libc/stdio/vfwprintf.c +++ b/newlib/libc/stdio/vfwprintf.c @@ -1171,11 +1171,11 @@ string: insize = strlen(arg); if (insize >= BUF) { if ((malloc_buf = (wchar_t *) _malloc_r (data, (insize + 1) * sizeof (wchar_t))) - == NULL) { - fp->_flags |= __SERR; - goto error; - } - cp = malloc_buf; + == NULL) { + fp->_flags |= __SERR; + goto error; + } + cp = malloc_buf; } else cp = buf; memset ((_PTR)&ps, '\0', sizeof (mbstate_t)); @@ -1195,9 +1195,31 @@ string: *p = L'\0'; size = p - cp; } - else +#else + if (ch != L'S' && !(flags & LONGINT)) { + char *arg = (char *) cp; + size_t insize = 0; + + if (prec >= 0) { + char *p = memchr (arg, '\0', prec); + insize = p ? p - arg : prec; + } else + insize = strlen (arg); + if (insize >= BUF) { + if ((malloc_buf = (wchar_t *) _malloc_r (data, (insize + 1) * sizeof (wchar_t))) + == NULL) { + fp->_flags |= __SERR; + goto error; + } + cp = malloc_buf; + } else + cp = buf; + for (size = 0; size < insize; ++size) + cp[size] = arg[size]; + cp[size] = L'\0'; + } #endif /* _MB_CAPABLE */ - if (prec >= 0) { + else if (prec >= 0) { /* * can't use wcslen; can only look for the * NUL in the first `prec' characters, and @@ -1222,7 +1244,7 @@ string: case L'X': xdigs = L"0123456789ABCDEF"; goto hex; - case 'x': + case L'x': xdigs = L"0123456789abcdef"; hex: _uquad = UARG (); base = HEX;