aboutsummaryrefslogtreecommitdiffhomepage
path: root/io.c
diff options
context:
space:
mode:
Diffstat (limited to 'io.c')
-rw-r--r--io.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/io.c b/io.c
index aa6af3f..b715d51 100644
--- a/io.c
+++ b/io.c
@@ -291,7 +291,7 @@ putdouble(struct wbuf *buf, double x, vlong prec)
int
vbfmt(struct wbuf *out, const char *fmt, va_list ap)
{
- bool quote, umod, lmod, lower;
+ bool quote, umod, lmod, zmod, lower;
int base;
vlong i;
int pad, prec, q;
@@ -340,7 +340,10 @@ vbfmt(struct wbuf *out, const char *fmt, va_list ap)
prec = prec*10 + *fmt-'0';
}
fmt += umod = *fmt == 'u';
- fmt += lmod = *fmt == 'l';
+ if ((zmod = *fmt == 'z'))
+ ++fmt, lmod = 0;
+ else
+ fmt += lmod = *fmt == 'l';
lower = 0;
prevn = n;
switch (*fmt++) {
@@ -403,7 +406,10 @@ vbfmt(struct wbuf *out, const char *fmt, va_list ap)
base = 10;
Int:
if (base != 10) umod = 1;
- i = lmod ? va_arg(ap, vlong) : (umod ? va_arg(ap, uint) : (vlong)va_arg(ap, int));
+ i = lmod ? va_arg(ap, vlong)
+ : umod ? va_arg(ap, uint)
+ : zmod && sizeof(&i-&i) > sizeof(int) ? va_arg(ap, vlong)
+ : (vlong)va_arg(ap, int);
tmp2.len = 0;
if (quote) {
switch (base) {