diff options
author | Eric Blake <eblake@redhat.com> | 2007-05-04 02:55:16 +0000 |
---|---|---|
committer | Eric Blake <eblake@redhat.com> | 2007-05-04 02:55:16 +0000 |
commit | b9db5292223d1e716a126b5db8a69391ba4ef73e (patch) | |
tree | 15865fe52e65c81bee2654b162c38aeed9743c29 /newlib/libc/stdio/fvwrite.c | |
parent | fb3937fade3487b7bd181bc6ab50c74637b6757f (diff) | |
download | cygnal-b9db5292223d1e716a126b5db8a69391ba4ef73e.tar.gz cygnal-b9db5292223d1e716a126b5db8a69391ba4ef73e.tar.bz2 cygnal-b9db5292223d1e716a126b5db8a69391ba4ef73e.zip |
Add support for asnprintf, and improve *printf documentation.
* libc/stdio/Makefile.am (ELIX_SOURCES): Rename...
(ELIX_2_SOURCES): ...to this.
(ELIX_4_SOURCES): Add new variable. Build asnprintf.
(GENERAL_SOURCES): Move dprintf to ELIX_4_SOURCES.
(CHEWOUT_FILES): Include diprintf in documentation.
* libc/stdio/Makefile.in: Regenerate.
* libc/stdio/diprintf.c: Improve documentation.
* libc/stdio/dprintf.c: Likewise.
* libc/stdio/siprintf.c: Likewise.
* libc/stdio/sprintf.c: Likewise.
* libc/stdio/vfprintf.c: Likewise.
* libc/stdio/viprintf.c: Likewise.
* libc/stdio/vsniprintf.c: Consolidate documentation.
* libc/stdio/asiprintf.c: Refer to documentation.
* libc/stdio/asprintf.c: Likewise.
* libc/stdio/fiprintf.c: Likewise.
* libc/stdio/fprintf.c: Likewise.
* libc/stdio/iprintf.c: Likewise.
* libc/stdio/printf.c: Likewise.
* libc/stdio/sniprintf.c: Likewise.
* libc/stdio/vdiprintf.c: Likewise.
* libc/stdio/vdprintf.c: Likewise.
* libc/stdio/vsiprintf.c: Likewise.
* libc/stdio/fvwrite.c (__sfvwrite_r): Handle asnprintf.
* libc/stdio/asniprintf.c (asniprintf, _asniprintf_r): New file.
* libc/stdio/asnprintf.c (asnprintf, _asnprintf_r): New file.
* libc/stdio/vasniprintf.c (vasniprintf, _vasniprintf_r): New
file.
* libc/stdio/vasnprintf.c (vasnprintf, _vasnprintf_r): New file.
* libc/stdio/vdprintf.c (_vdprintf_r): Rewrite to avoid malloc in
typical case.
* libc/stdio/vdiprintf.c (_vdiprintf_r): Likewise.
* libc/include/stdio.h: Add prototypes for new functions; sort
existing functions.
Diffstat (limited to 'newlib/libc/stdio/fvwrite.c')
-rw-r--r-- | newlib/libc/stdio/fvwrite.c | 33 |
1 files changed, 24 insertions, 9 deletions
diff --git a/newlib/libc/stdio/fvwrite.c b/newlib/libc/stdio/fvwrite.c index 0d91aa2d9..031624d92 100644 --- a/newlib/libc/stdio/fvwrite.c +++ b/newlib/libc/stdio/fvwrite.c @@ -127,7 +127,7 @@ _DEFUN(__sfvwrite_r, (ptr, fp, uio), w = fp->_w; if (fp->_flags & __SSTR) { - if (len >= w && fp->_flags & __SMBF) + if (len >= w && fp->_flags & (__SMBF | __SOPT)) { /* must be asprintf family */ unsigned char *str; int curpos = (fp->_p - fp->_bf._base); @@ -141,15 +141,30 @@ _DEFUN(__sfvwrite_r, (ptr, fp, uio), int newsize = fp->_bf._size * 3 / 2; if (newsize < curpos + len + 1) newsize = curpos + len + 1; - str = (unsigned char *)_realloc_r (ptr, fp->_bf._base, - newsize); - if (!str) + if (fp->_flags & __SOPT) { - /* Free buffer which is no longer used. */ - _free_r (ptr, fp->_bf._base); - /* Ensure correct errno, even if free changed it. */ - ptr->_errno = ENOMEM; - goto err; + /* asnprintf leaves original buffer alone. */ + str = (unsigned char *)_malloc_r (ptr, newsize); + if (!str) + { + ptr->_errno = ENOMEM; + goto err; + } + memcpy (str, fp->_bf._base, curpos); + fp->_flags = (fp->_flags & ~__SOPT) | __SMBF; + } + else + { + str = (unsigned char *)_realloc_r (ptr, fp->_bf._base, + newsize); + if (!str) + { + /* Free buffer which is no longer used. */ + _free_r (ptr, fp->_bf._base); + /* Ensure correct errno, even if free changed it. */ + ptr->_errno = ENOMEM; + goto err; + } } fp->_bf._base = str; fp->_p = str + curpos; |