19a747e4fSDavid du Colombier #include <u.h>
29a747e4fSDavid du Colombier #include <libc.h>
39a747e4fSDavid du Colombier #include "fmtdef.h"
49a747e4fSDavid du Colombier
59a747e4fSDavid du Colombier /*
69a747e4fSDavid du Colombier * generic routine for flushing a formatting buffer
79a747e4fSDavid du Colombier * to a file descriptor
89a747e4fSDavid du Colombier */
99a747e4fSDavid du Colombier int
_fmtFdFlush(Fmt * f)109a747e4fSDavid du Colombier _fmtFdFlush(Fmt *f)
119a747e4fSDavid du Colombier {
129a747e4fSDavid du Colombier int n;
139a747e4fSDavid du Colombier
149a747e4fSDavid du Colombier n = (char*)f->to - (char*)f->start;
15*74f16c81SDavid du Colombier if(n && write((int)(uintptr)f->farg, f->start, n) != n)
169a747e4fSDavid du Colombier return 0;
179a747e4fSDavid du Colombier f->to = f->start;
189a747e4fSDavid du Colombier return 1;
199a747e4fSDavid du Colombier }
209a747e4fSDavid du Colombier
219a747e4fSDavid du Colombier int
vfprint(int fd,char * fmt,va_list args)229a747e4fSDavid du Colombier vfprint(int fd, char *fmt, va_list args)
239a747e4fSDavid du Colombier {
249a747e4fSDavid du Colombier Fmt f;
259a747e4fSDavid du Colombier char buf[256];
269a747e4fSDavid du Colombier int n;
279a747e4fSDavid du Colombier
289a747e4fSDavid du Colombier fmtfdinit(&f, fd, buf, sizeof(buf));
299a747e4fSDavid du Colombier f.args = args;
309a747e4fSDavid du Colombier n = dofmt(&f, fmt);
319a747e4fSDavid du Colombier if(n > 0 && _fmtFdFlush(&f) == 0)
329a747e4fSDavid du Colombier return -1;
339a747e4fSDavid du Colombier return n;
349a747e4fSDavid du Colombier }
35