diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2013-01-11 20:05:41 +0000 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2013-01-11 20:05:41 +0000 |
commit | 3920a99a229053dc5692099626ada88d29b79b1f (patch) | |
tree | 7d22c6e747d406f9fbee2a34cc1704d5c6f71cbd /newlib/libc/stdio | |
parent | 2f47bbd55583be9b24bee039e6b7f35e3727b8de (diff) | |
download | cygnal-3920a99a229053dc5692099626ada88d29b79b1f.tar.gz cygnal-3920a99a229053dc5692099626ada88d29b79b1f.tar.bz2 cygnal-3920a99a229053dc5692099626ada88d29b79b1f.zip |
* 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/libc/stdio')
-rw-r--r-- | newlib/libc/stdio/vfwprintf.c | 38 |
1 files changed, 30 insertions, 8 deletions
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; |