diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2013-01-12 00:05:41 +0400 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2013-01-12 00:05:41 +0400 |
commit | 3920a99a229053dc5692099626ada88d29b79b1f (patch) | |
tree | 7d22c6e747d406f9fbee2a34cc1704d5c6f71cbd /newlib | |
parent | 2f47bbd55583be9b24bee039e6b7f35e3727b8de (diff) |
* 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.
Diffstat (limited to 'newlib')
-rw-r--r-- | newlib/ChangeLog | 8 | ||||
-rw-r--r-- | 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 <vinschen@redhat.com> + + * 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 <marcus.shawcroft@linaro.org> * libc/machine/aarch64/Makefile.am (lib_a_SOURCES): Add @@ -8,7 +14,7 @@ 2013-01-10 Marcus Shawcroft <marcus.shawcroft@linaro.org> - * 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; |