Blob


1 #include <u.h>
2 #include <libc.h>
3 #include <fcall.h>
4 #include <9pclient.h>
6 /* C99 nonsense */
7 #ifdef va_copy
8 # define VA_COPY(a,b) va_copy(a,b)
9 # define VA_END(a) va_end(a)
10 #else
11 # define VA_COPY(a,b) (a) = (b)
12 # define VA_END(a)
13 #endif
15 static int
16 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 int
28 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 int
42 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 int
54 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 }