xref: /plan9/sys/src/libc/fmt/vfprint.c (revision 74f16c8187aab477889167f2422d0597b1b7d0ff)
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