diff options
Diffstat (limited to 'src/base/string/appendf.c')
-rw-r--r-- | src/base/string/appendf.c | 24 |
1 files changed, 8 insertions, 16 deletions
diff --git a/src/base/string/appendf.c b/src/base/string/appendf.c index 4b8d76c..dee2065 100644 --- a/src/base/string/appendf.c +++ b/src/base/string/appendf.c @@ -6,26 +6,18 @@ */ int -str·appendf(string *s, const byte* fmt, ...) +string·appendf(string *s, byte* fmt, ...) { + int r, n; va_list args; + va_start(args, fmt); - int remain = str·cap(*s) - str·len(*s); - int n = vsnprintf(*s + str·len(*s), remain + 1, fmt, args); + do{ + r = string·cap(*s) - string·len(*s); + n = fmt·vnsprint(*s + string·len(*s), r+1, fmt, args); + string·grow(s, 2*string·cap(*s)); + }while(n==r); va_end(args); - if(n > remain){ - // If the first write was incomplete, we overwite the data again. - str·grow(s, n); - va_list args; - va_start(args, fmt); - n = vsnprintf(*s + str·len(*s), n + 1, fmt, args); - assert(n - remain <= str·cap(*s)); - va_end(args); - } - - Hdr* h = (Hdr*)(*s - sizeof(Hdr)); - h->len += n; - return n; } |