diff options
author | Mattias Andrée <maandree@operamail.com> | 2015-10-16 18:48:27 +0200 |
---|---|---|
committer | Mattias Andrée <maandree@operamail.com> | 2015-10-16 18:48:27 +0200 |
commit | c1f787f89431628753a412ab3faf29702ef4553d (patch) | |
tree | 0a433f90c7bb2609a896d64a31e52b44881835f2 /src/stdio | |
parent | m (diff) | |
download | slibc-c1f787f89431628753a412ab3faf29702ef4553d.tar.gz slibc-c1f787f89431628753a412ab3faf29702ef4553d.tar.bz2 slibc-c1f787f89431628753a412ab3faf29702ef4553d.tar.xz |
improve and fix bprintf
Signed-off-by: Mattias Andrée <maandree@operamail.com>
Diffstat (limited to 'src/stdio')
-rw-r--r-- | src/stdio/printf.c | 37 |
1 files changed, 25 insertions, 12 deletions
diff --git a/src/stdio/printf.c b/src/stdio/printf.c index 7e89378..ac7b8f9 100644 --- a/src/stdio/printf.c +++ b/src/stdio/printf.c @@ -76,9 +76,9 @@ struct buffer } buf; /** - * The size of the buffer, in number of elements. + * Pointer to the size of the buffer, in number of elements. */ - size_t size; + size_t* size; /** * The write offset. @@ -86,7 +86,8 @@ struct buffer size_t off; /** - * Whether `secure_realloc` shall be used. + * Whether `EXTALLOC_CLEAR`, `secure_realloc`, + * or `secure_free` shall be used. */ int secure; @@ -237,11 +238,17 @@ static int wwrite_stream(const wchar_t* text, size_t length, FILE* stream) */ static int write_buffer(const char* text, size_t length, struct buffer* buffer) { + enum extalloc_mode flags = EXTALLOC_MALLOC | (buffer->secure ? EXTALLOC_CLEAR : 0); char* new; - if (buffer->off + length > buffer->size) + + if (buffer->off + length > *(buffer->size)) { - new = (buffer->secure ? secure_realloc : fast_realloc) - (buffer->buf.str, buffer->size * sizeof(char)); + if (buffer->off || !*(buffer->size)) + new = (buffer->secure ? secure_realloc : fast_realloc) + (buffer->buf.str, *(buffer->size) * sizeof(char)); + else + new = extalloc(buffer->buf.str, *(buffer->size) * sizeof(char), flags); + if (new == NULL) { if (buffer->free_on_error) @@ -249,7 +256,7 @@ static int write_buffer(const char* text, size_t length, struct buffer* buffer) buffer->buf.str = NULL; return -1; } - buffer->size = buffer->off + length; + *(buffer->size) = buffer->off + length; buffer->buf.str = new; } memcpy(buffer->buf.str, text, length); @@ -268,11 +275,17 @@ static int write_buffer(const char* text, size_t length, struct buffer* buffer) */ static int wwrite_buffer(const wchar_t* text, size_t length, struct buffer* buffer) { + enum extalloc_mode flags = EXTALLOC_MALLOC | (buffer->secure ? EXTALLOC_CLEAR : 0); wchar_t* new; + if (buffer->off + length > buffer->size) { - new = (buffer->secure ? secure_realloc : fast_realloc) - (buffer->buf.wcs, buffer->size * sizeof(wchar_t)); + if (buffer->off || !*(buffer->size)) + new = (buffer->secure ? secure_realloc : fast_realloc) + (buffer->buf.wcs, *(buffer->size) * sizeof(wchar_t)); + else + new = extalloc(buffer->buf.wcs, *(buffer->size) * sizeof(wchar_t), flags); + if (new == NULL) { if (buffer->free_on_error) @@ -280,7 +293,7 @@ static int wwrite_buffer(const wchar_t* text, size_t length, struct buffer* buff buffer->buf.wcs = NULL; return -1; } - buffer->size = buffer->off + length; + *(buffer->size) = buffer->off + length; buffer->buf.wcs = new; } wmemcpy(buffer->buf.wcs, text, length); @@ -764,7 +777,7 @@ int vbprintf(char** restrict buffer, size_t* restrict size, size_t offset, struct buffer buf = { .buf.str = *buffer, - .size = *size, + .size = size, .off = offset, .secure = secure, .free_on_error = buffer == NULL, @@ -1199,7 +1212,7 @@ int vbwprintf(wchar_t** restrict buffer, size_t* restrict size, size_t offset, struct buffer buf = { .buf.wcs = *buffer, - .size = *size, + .size = size, .off = offset, .secure = secure, .free_on_error = buffer == NULL, |