diff options
| author | David Lamparter <equinox@diac24.net> | 2019-05-12 21:10:04 +0200 |
|---|---|---|
| committer | David Lamparter <equinox@diac24.net> | 2019-06-03 16:44:51 +0200 |
| commit | 5c25bd87b5a0b722e7491e8467728ffff936a904 (patch) | |
| tree | 8591fc660caa31814e2d994189ef7e1e141b1ee2 /lib/printf/printfcommon.h | |
| parent | 8be3678a2331250b0559d07526e66b73d1794d8c (diff) | |
lib/printf: integrate
Signed-off-by: David Lamparter <equinox@diac24.net>
Diffstat (limited to 'lib/printf/printfcommon.h')
| -rw-r--r-- | lib/printf/printfcommon.h | 30 |
1 files changed, 16 insertions, 14 deletions
diff --git a/lib/printf/printfcommon.h b/lib/printf/printfcommon.h index 716177c57d..5c45520b4c 100644 --- a/lib/printf/printfcommon.h +++ b/lib/printf/printfcommon.h @@ -50,19 +50,15 @@ static CHAR *__ultoa(u_long, CHAR *, int, int, const char *); #define NIOV 8 struct io_state { - FILE *fp; - struct __suio uio; /* output information: summary */ - struct iovec iov[NIOV];/* ... and individual io vectors */ + struct fbuf *cb; + size_t avail; }; static inline void -io_init(struct io_state *iop, FILE *fp) +io_init(struct io_state *iop, struct fbuf *cb) { - - iop->uio.uio_iov = iop->iov; - iop->uio.uio_resid = 0; - iop->uio.uio_iovcnt = 0; - iop->fp = fp; + iop->cb = cb; + iop->avail = cb ? cb->len - (cb->pos - cb->buf) : 0; } /* @@ -70,13 +66,19 @@ io_init(struct io_state *iop, FILE *fp) * remain valid until io_flush() is called. */ static inline int -io_print(struct io_state *iop, const CHAR * __restrict ptr, int len) +io_print(struct io_state *iop, const CHAR * __restrict ptr, size_t len) { + size_t copylen = len; - iop->iov[iop->uio.uio_iovcnt].iov_base = (char *)ptr; - iop->iov[iop->uio.uio_iovcnt].iov_len = len; - iop->uio.uio_resid += len; - return (0); + if (!iop->cb) + return 0; + if (iop->avail < copylen) + copylen = iop->avail; + + memcpy(iop->cb->pos, ptr, copylen); + iop->avail -= copylen; + iop->cb->pos += copylen; + return 0; } /* |
