#include <u.h> | |
#include <libc.h> | |
#include <fcall.h> | |
#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; | |
fmtlocaleinit(f, nil, nil, nil); | |
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; | |
} | |