summaryrefslogtreecommitdiff
path: root/lib9
diff options
context:
space:
mode:
Diffstat (limited to 'lib9')
-rw-r--r--lib9/fmtdef.h4
-rw-r--r--lib9/fmtprint.c6
-rw-r--r--lib9/fmtvprint.c9
-rw-r--r--lib9/runevseprint.c3
-rw-r--r--lib9/vfprint.c3
-rw-r--r--lib9/vseprint.c3
-rw-r--r--lib9/vsmprint.c15
-rw-r--r--lib9/vsnprint.c3
8 files changed, 32 insertions, 14 deletions
diff --git a/lib9/fmtdef.h b/lib9/fmtdef.h
index 071041cf..9b0e9782 100644
--- a/lib9/fmtdef.h
+++ b/lib9/fmtdef.h
@@ -96,3 +96,7 @@ void _fmtunlock(void);
t += runetochar(t, &_rune);\
}\
}while(0)
+
+#ifndef va_copy
+#define va_copy(a, b) ((a) = (b))
+#endif
diff --git a/lib9/fmtprint.c b/lib9/fmtprint.c
index c93cb315..549049a3 100644
--- a/lib9/fmtprint.c
+++ b/lib9/fmtprint.c
@@ -29,14 +29,16 @@ fmtprint(Fmt *f, char *fmt, ...)
f->flags = 0;
f->width = 0;
f->prec = 0;
- va = f->args;
+ va_copy(va, f->args);
+ va_end(f->args);
va_start(f->args, fmt);
n = dofmt(f, fmt);
va_end(f->args);
f->flags = 0;
f->width = 0;
f->prec = 0;
- f->args = va;
+ va_copy(f->args, va);
+ va_end(va);
if(n >= 0)
return 0;
return n;
diff --git a/lib9/fmtvprint.c b/lib9/fmtvprint.c
index 6682cd33..8e7c1f45 100644
--- a/lib9/fmtvprint.c
+++ b/lib9/fmtvprint.c
@@ -29,13 +29,16 @@ fmtvprint(Fmt *f, char *fmt, va_list args)
f->flags = 0;
f->width = 0;
f->prec = 0;
- va = f->args;
- f->args = args;
+ va_copy(va, f->args);
+ va_end(f->args);
+ va_copy(f->args, args);
n = dofmt(f, fmt);
f->flags = 0;
f->width = 0;
f->prec = 0;
- f->args = va;
+ va_end(f->args);
+ va_copy(f->args, va);
+ va_end(va);
if(n >= 0)
return 0;
return n;
diff --git a/lib9/runevseprint.c b/lib9/runevseprint.c
index 46fdee60..2432b581 100644
--- a/lib9/runevseprint.c
+++ b/lib9/runevseprint.c
@@ -14,8 +14,9 @@ runevseprint(Rune *buf, Rune *e, char *fmt, va_list args)
f.flush = nil;
f.farg = nil;
f.nfmt = 0;
- f.args = args;
+ va_copy(f.args, args);
dofmt(&f, fmt);
+ va_end(f.args);
*(Rune*)f.to = '\0';
return f.to;
}
diff --git a/lib9/vfprint.c b/lib9/vfprint.c
index eeea55d1..cd98bc13 100644
--- a/lib9/vfprint.c
+++ b/lib9/vfprint.c
@@ -38,8 +38,9 @@ vfprint(int fd, char *fmt, va_list args)
int n;
fmtfdinit(&f, fd, buf, sizeof(buf));
- f.args = args;
+ va_copy(f.args, args);
n = dofmt(&f, fmt);
+ va_end(f.args);
if(n > 0 && _fmtFdFlush(&f) == 0)
return -1;
return n;
diff --git a/lib9/vseprint.c b/lib9/vseprint.c
index 6f478960..b9675b35 100644
--- a/lib9/vseprint.c
+++ b/lib9/vseprint.c
@@ -27,8 +27,9 @@ vseprint(char *buf, char *e, char *fmt, va_list args)
f.flush = nil;
f.farg = nil;
f.nfmt = 0;
- f.args = args;
+ va_copy(f.args, args);
dofmt(&f, fmt);
+ va_end(f.args);
*(char*)f.to = '\0';
return f.to;
}
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);
}
diff --git a/lib9/vsnprint.c b/lib9/vsnprint.c
index 841d142c..3a5710cb 100644
--- a/lib9/vsnprint.c
+++ b/lib9/vsnprint.c
@@ -27,8 +27,9 @@ vsnprint(char *buf, int len, char *fmt, va_list args)
f.flush = nil;
f.farg = nil;
f.nfmt = 0;
- f.args = args;
+ va_copy(f.args, args);
dofmt(&f, fmt);
+ va_end(f.args);
*(char*)f.to = '\0';
return (char*)f.to - buf;
}