2006-02-08 21:21:01 +00:00
|
|
|
#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;
|
2006-05-27 05:20:01 +00:00
|
|
|
fmtlocaleinit(&f, nil, nil, nil);
|
2006-02-08 21:21:01 +00:00
|
|
|
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;
|
|
|
|
}
|
|
|
|
|