diff options
author | Nicholas Noll <nbnoll@eml.cc> | 2021-12-05 09:47:21 -0800 |
---|---|---|
committer | Nicholas Noll <nbnoll@eml.cc> | 2021-12-05 10:54:20 -0800 |
commit | 521d01e8ad87e931af3e9a763cc84a6cf7fe5ee3 (patch) | |
tree | f544119060c3eefc7b0fec6cff1740a362541213 /src/base/string/appendf.c | |
parent | 158d9b84f14457136379f42e7c071eb79d87ee6b (diff) |
Feat: basic string and memory functions
Continue filling out the basic standard lib functions.
Included prototypes of the str* and mem* families.
Plan to add e(str|mem) and n(str|mem) variants as well.
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; } |