summaryrefslogtreecommitdiff
path: root/lib9/vsmprint.c
diff options
context:
space:
mode:
authorCharles.Forsyth <devnull@localhost>2007-06-08 10:51:11 +0000
committerCharles.Forsyth <devnull@localhost>2007-06-08 10:51:11 +0000
commit1f44c82a26ff60e012a2ff697cb036a25c0c7f97 (patch)
tree73cb74c31ef90c5ee906bbdf9040f8e9d8ebbb20 /lib9/vsmprint.c
parent7d5a2526f46cd3474fb96a684f7b87e9e78128b0 (diff)
20070608-1149
Diffstat (limited to 'lib9/vsmprint.c')
-rw-r--r--lib9/vsmprint.c15
1 files changed, 10 insertions, 5 deletions
diff --git a/lib9/vsmprint.c b/lib9/vsmprint.c
index 44789be5..0e18fe44 100644
--- a/lib9/vsmprint.c
+++ b/lib9/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);
}