tadd print - plan9port - [fork] Plan 9 from user space
 (HTM) git clone git://src.adamsgaard.dk/plan9port
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 5a1e9de7b160033e85a77ad4c60193186364a2fb
 (DIR) parent 4ca53ff0e0398171fe9afb1e989b97b30d3d584f
 (HTM) Author: rsc <devnull@localhost>
       Date:   Wed,  8 Feb 2006 21:21:01 +0000
       
       add print
       
       Diffstat:
         M include/9pclient.h                  |       3 +++
         M src/lib9pclient/mkfile              |       1 +
         A src/lib9pclient/print.c             |      67 +++++++++++++++++++++++++++++++
       
       3 files changed, 71 insertions(+), 0 deletions(-)
       ---
 (DIR) diff --git a/include/9pclient.h b/include/9pclient.h
       t@@ -44,6 +44,9 @@ CFid *nsopen(char*, char*, char*, int);
        int        fsfremove(CFid*);
        int        fsremove(CFsys*, char*);
        CFid *fscreate(CFsys*, char*, int, ulong);
       +int fsaccess(CFsys*, char*, int);
       +int        fsvprint(CFid*, char*, va_list);
       +int        fsprint(CFid*, char*, ...);
        
        extern int chatty9pclient;
        
 (DIR) diff --git a/src/lib9pclient/mkfile b/src/lib9pclient/mkfile
       t@@ -12,6 +12,7 @@ OFILES=\
                ns.$O\
                open.$O\
                openfd.$O\
       +        print.$O\
                read.$O\
                remove.$O\
                seek.$O\
 (DIR) diff --git a/src/lib9pclient/print.c b/src/lib9pclient/print.c
       t@@ -0,0 +1,67 @@
       +#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;
       +        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;
       +}
       +