From 5a1e9de7b160033e85a77ad4c60193186364a2fb Mon Sep 17 00:00:00 2001 From: rsc Date: Wed, 8 Feb 2006 21:21:01 +0000 Subject: add print --- src/lib9pclient/mkfile | 1 + src/lib9pclient/print.c | 67 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+) create mode 100644 src/lib9pclient/print.c (limited to 'src/lib9pclient') diff --git a/src/lib9pclient/mkfile b/src/lib9pclient/mkfile index 55882cae..b86a4828 100644 --- a/src/lib9pclient/mkfile +++ b/src/lib9pclient/mkfile @@ -12,6 +12,7 @@ OFILES=\ ns.$O\ open.$O\ openfd.$O\ + print.$O\ read.$O\ remove.$O\ seek.$O\ diff --git a/src/lib9pclient/print.c b/src/lib9pclient/print.c new file mode 100644 index 00000000..d02afb40 --- /dev/null +++ b/src/lib9pclient/print.c @@ -0,0 +1,67 @@ +#include +#include +#include +#include <9pclient.h> + +/* C99 nonsense */ +#ifdef va_copy +# define VA_COPY(a,b) va_copy(a,b) +# define VA_END(a) va_end(a) +#else +# define VA_COPY(a,b) (a) = (b) +# define VA_END(a) +#endif + +static int +fidflush(Fmt *f) +{ + int n; + + n = (char*)f->to - (char*)f->start; + if(n && fswrite(f->farg, f->start, n) != n) + return 0; + f->to = f->start; + return 1; +} + +static int +fsfmtfidinit(Fmt *f, CFid *fid, char *buf, int size) +{ + f->runes = 0; + f->start = buf; + f->to = buf; + f->stop = buf + size; + f->flush = fidflush; + f->farg = fid; + f->nfmt = 0; + return 0; +} + +int +fsprint(CFid *fd, char *fmt, ...) +{ + int n; + va_list args; + + va_start(args, fmt); + n = fsvprint(fd, fmt, args); + va_end(args); + return n; +} + +int +fsvprint(CFid *fd, char *fmt, va_list args) +{ + Fmt f; + char buf[256]; + int n; + + fsfmtfidinit(&f, fd, buf, sizeof(buf)); + VA_COPY(f.args,args); + n = dofmt(&f, fmt); + VA_END(f.args); + if(n > 0 && fidflush(&f) == 0) + return -1; + return n; +} + -- cgit v1.2.3