| #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; |
| } |
| |