aboutsummaryrefslogtreecommitdiff
path: root/src/base/string/appendf.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/base/string/appendf.c')
-rw-r--r--src/base/string/appendf.c24
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;
}