Mercurial > ecos
changeset 2898:bfb377ab267a
* src/common/vsnprintf.cxx (class Cyg_VsnprintfStream):
Remove destructor.
(vsnprintf): Apply null terminator correctly when truncated.
| author | jlarmour |
|---|---|
| date | Fri, 07 Aug 2009 19:20:30 +0000 |
| parents | 5d701b4e0c3b |
| children | 5dedbd1910f7 |
| files | packages/language/c/libc/stdio/current/ChangeLog packages/language/c/libc/stdio/current/src/common/vsnprintf.cxx |
| diffstat | 2 files changed, 20 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/packages/language/c/libc/stdio/current/ChangeLog +++ b/packages/language/c/libc/stdio/current/ChangeLog @@ -1,3 +1,9 @@ +2009-08-07 Jonathan Larmour <jifl@eCosCentric.com> + + * src/common/vsnprintf.cxx (class Cyg_VsnprintfStream): + Remove destructor. + (vsnprintf): Apply null terminator correctly when truncated. + 2009-02-16 Lars Povlsen <lpovlsen@vitesse.com> * include/stdio.h: Removed extra semicolon after scanf()
--- a/packages/language/c/libc/stdio/current/src/common/vsnprintf.cxx +++ b/packages/language/c/libc/stdio/current/src/common/vsnprintf.cxx @@ -71,8 +71,6 @@ class Cyg_VsnprintfStream: public Cyg_Ou public: Cyg_VsnprintfStream(char* s): s_(s) {} - virtual ~Cyg_VsnprintfStream() { *s_ = '\0'; } - virtual Cyg_ErrNo write( const cyg_uint8 *buffer, cyg_ucount32 buffer_length, cyg_ucount32 *bytes_written ); @@ -88,6 +86,11 @@ Cyg_VsnprintfStream::write( cyg_ucount32 buffer_length, cyg_ucount32 *bytes_written ) { +#ifdef WHEN_MEMCPY_OPTIMISED_IN_ECOS_EVENTUALLY + memcpy(s_, buffer, buffer_length); + s_ += buffer_length; + *bytes_written = buffer_length; +#else char *dest = s_; char const *src = (char const *)buffer; char const *end = src + buffer_length; @@ -95,14 +98,22 @@ Cyg_VsnprintfStream::write( *dest++ = *src++; s_ = dest; *bytes_written = buffer_length; +#endif return ENOERR; } externC int vsnprintf( char *s, size_t size, const char *format, va_list arg ) __THROW { + int ret; Cyg_VsnprintfStream stream(s); - return vfnprintf( (FILE *)(void *)&stream, size, format, arg ); + ret = vfnprintf( (FILE *)(void *)&stream, size, format, arg ); + /* If no error, and string not truncated, then apply null termination in + * correct place + */ + if ( (ret >= 0) && ((size_t)ret < size) ) + s[ret] = '\0'; + return ret; } // vsnprintf() // EOF vsnprintf.cxx
