summaryrefslogtreecommitdiff
path: root/libkern/vsmprint.c
diff options
context:
space:
mode:
authorCharles Forsyth <charles.forsyth@gmail.com>2014-06-30 10:57:08 +0100
committerCharles Forsyth <charles.forsyth@gmail.com>2014-06-30 10:57:08 +0100
commit3cd4f1d15146c08f05206d6328ecbc1c7fdc8dfa (patch)
treea546acadca10b43d6b5eafc6d85f4aed361e9988 /libkern/vsmprint.c
parentee030d07b2cf167be70f1dc36f56bdf3012860ae (diff)
update to match lib9
Diffstat (limited to 'libkern/vsmprint.c')
-rw-r--r--libkern/vsmprint.c15
1 files changed, 10 insertions, 5 deletions
diff --git a/libkern/vsmprint.c b/libkern/vsmprint.c
index 44789be5..0e18fe44 100644
--- a/libkern/vsmprint.c
+++ b/libkern/vsmprint.c
@@ -20,6 +20,8 @@ fmtStrFlush(Fmt *f)
char *s;
int n;
+ if(f->start == nil)
+ return 0;
n = (int)f->farg;
n += 256;
f->farg = (void*)n;
@@ -41,7 +43,7 @@ fmtstrinit(Fmt *f)
{
int n;
- f->runes = 0;
+ memset(f, 0, sizeof(*f));
n = 32;
f->start = malloc(n);
if(f->start == nil)
@@ -65,10 +67,13 @@ vsmprint(char *fmt, va_list args)
if(fmtstrinit(&f) < 0)
return nil;
- f.args = args;
+ va_copy(f.args, args);
n = dofmt(&f, fmt);
- if(n < 0)
+ va_end(f.args);
+ if(n < 0){
+ free(f.start);
+ f.start = nil;
return nil;
- *(char*)f.to = '\0';
- return f.start;
+ }
+ return fmtstrflush(&f);
}