Blob
1 #include <u.h>2 #include <libc.h>3 #include <fcall.h>4 #include <9pclient.h>6 /* C99 nonsense */7 #ifdef va_copy8 # define VA_COPY(a,b) va_copy(a,b)9 # define VA_END(a) va_end(a)10 #else11 # define VA_COPY(a,b) (a) = (b)12 # define VA_END(a)13 #endif15 static int16 fidflush(Fmt *f)17 {18 int n;20 n = (char*)f->to - (char*)f->start;21 if(n && fswrite(f->farg, f->start, n) != n)22 return 0;23 f->to = f->start;24 return 1;25 }27 static int28 fsfmtfidinit(Fmt *f, CFid *fid, char *buf, int size)29 {30 f->runes = 0;31 f->start = buf;32 f->to = buf;33 f->stop = buf + size;34 f->flush = fidflush;35 f->farg = fid;36 f->nfmt = 0;37 fmtlocaleinit(f, nil, nil, nil);38 return 0;39 }41 int42 fsprint(CFid *fd, char *fmt, ...)43 {44 int n;45 va_list args;47 va_start(args, fmt);48 n = fsvprint(fd, fmt, args);49 va_end(args);50 return n;51 }53 int54 fsvprint(CFid *fd, char *fmt, va_list args)55 {56 Fmt f;57 char buf[256];58 int n;60 fsfmtfidinit(&f, fd, buf, sizeof(buf));61 VA_COPY(f.args,args);62 n = dofmt(&f, fmt);63 VA_END(f.args);64 if(n > 0 && fidflush(&f) == 0)65 return -1;66 return n;67 }