X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/disorder/blobdiff_plain/eb525fcd474c7c30e98e0764698a6fac33eb10ce..07bc035e2ec3e4fb109fb36ad5f1fd751a960e70:/lib/printf.c diff --git a/lib/printf.c b/lib/printf.c index df807ed..15478ce 100644 --- a/lib/printf.c +++ b/lib/printf.c @@ -33,6 +33,7 @@ #include "printf.h" #include "sink.h" +#include "vacopy.h" enum flags { f_thousands = 1, @@ -144,6 +145,7 @@ static int check_integer(const struct conversion *c) { case l_intmax_t: case l_size_t: case l_longdouble: + case l_ptrdiff_t: return 0; default: return -1; @@ -282,11 +284,11 @@ static int output_integer(struct state *s, struct conversion *c) { * '-' beats '0'. */ if(c->flags & f_left) { - if(pad && do_pad(s, ' ', pad) < 0) return -1; if(sign && do_write(s, &sign, 1)) return -1; if(xform && do_write(s, c->specifier->xform, xform)) return -1; if(prec && do_pad(s, '0', prec) < 0) return -1; if(ndigits && do_write(s, digits + dp, ndigits)) return -1; + if(pad && do_pad(s, ' ', pad) < 0) return -1; } else if(c->flags & f_zero) { if(sign && do_write(s, &sign, 1)) return -1; if(xform && do_write(s, c->specifier->xform, xform)) return -1; @@ -294,11 +296,11 @@ static int output_integer(struct state *s, struct conversion *c) { if(prec && do_pad(s, '0', prec) < 0) return -1; if(ndigits && do_write(s, digits + dp, ndigits)) return -1; } else { + if(pad && do_pad(s, ' ', pad) < 0) return -1; if(sign && do_write(s, &sign, 1)) return -1; if(xform && do_write(s, c->specifier->xform, xform)) return -1; if(prec && do_pad(s, '0', prec) < 0) return -1; if(ndigits && do_write(s, digits + dp, ndigits)) return -1; - if(pad && do_pad(s, ' ', pad) < 0) return -1; } return 0; } @@ -321,11 +323,11 @@ static int output_string(struct state *s, struct conversion *c) { } else pad = 0; if(c->flags & f_left) { - if(pad && do_pad(s, ' ', pad) < 0) return -1; if(do_write(s, str, len) < 0) return -1; + if(pad && do_pad(s, ' ', pad) < 0) return -1; } else { - if(do_write(s, str, len) < 0) return -1; if(pad && do_pad(s, ' ', pad) < 0) return -1; + if(do_write(s, str, len) < 0) return -1; } return 0; @@ -342,11 +344,11 @@ static int output_char(struct state *s, struct conversion *c) { } else pad = 0; if(c->flags & f_left) { - if(pad && do_pad(s, ' ', pad) < 0) return -1; if(do_write(s, &ch, 1) < 0) return -1; + if(pad && do_pad(s, ' ', pad) < 0) return -1; } else { - if(do_write(s, &ch, 1) < 0) return -1; if(pad && do_pad(s, ' ', pad) < 0) return -1; + if(do_write(s, &ch, 1) < 0) return -1; } return 0; } @@ -413,7 +415,7 @@ static int parse_conversion(struct conversion *c, const char *ptr) { ++ptr; c->precision = -1; } else - return -1; + c->precision = 0; c->flags |= f_precision; } /* length modifier */