18ccd4a63SDavid du Colombier /* 28ccd4a63SDavid du Colombier * dofmt -- format to a buffer 38ccd4a63SDavid du Colombier * the number of characters formatted is returned, 48ccd4a63SDavid du Colombier * or -1 if there was an error. 58ccd4a63SDavid du Colombier * if the buffer is ever filled, flush is called. 68ccd4a63SDavid du Colombier * it should reset the buffer and return whether formatting should continue. 78ccd4a63SDavid du Colombier */ 88ccd4a63SDavid du Colombier 98ccd4a63SDavid du Colombier typedef int (*Fmts)(Fmt*); 108ccd4a63SDavid du Colombier 118ccd4a63SDavid du Colombier typedef struct Quoteinfo Quoteinfo; 128ccd4a63SDavid du Colombier struct Quoteinfo 138ccd4a63SDavid du Colombier { 148ccd4a63SDavid du Colombier int quoted; /* if set, string must be quoted */ 158ccd4a63SDavid du Colombier int nrunesin; /* number of input runes that can be accepted */ 168ccd4a63SDavid du Colombier int nbytesin; /* number of input bytes that can be accepted */ 178ccd4a63SDavid du Colombier int nrunesout; /* number of runes that will be generated */ 188ccd4a63SDavid du Colombier int nbytesout; /* number of bytes that will be generated */ 198ccd4a63SDavid du Colombier }; 208ccd4a63SDavid du Colombier 21*0d601874SDavid du Colombier /* Edit .+1,/^$/ |cfn |grep -v static | grep __ */ 22*0d601874SDavid du Colombier double __Inf(int sign); 23*0d601874SDavid du Colombier double __NaN(void); 24*0d601874SDavid du Colombier int __badfmt(Fmt *f); 25*0d601874SDavid du Colombier int __charfmt(Fmt *f); 26*0d601874SDavid du Colombier int __countfmt(Fmt *f); 27*0d601874SDavid du Colombier int __efgfmt(Fmt *fmt); 28*0d601874SDavid du Colombier int __errfmt(Fmt *f); 29*0d601874SDavid du Colombier int __flagfmt(Fmt *f); 30*0d601874SDavid du Colombier int __fmtFdFlush(Fmt *f); 31*0d601874SDavid du Colombier int __fmtcpy(Fmt *f, const void *vm, int n, int sz); 32*0d601874SDavid du Colombier void* __fmtdispatch(Fmt *f, void *fmt, int isrunes); 33*0d601874SDavid du Colombier void * __fmtflush(Fmt *f, void *t, int len); 34*0d601874SDavid du Colombier void __fmtlock(void); 35*0d601874SDavid du Colombier int __fmtpad(Fmt *f, int n); 36*0d601874SDavid du Colombier double __fmtpow10(int n); 37*0d601874SDavid du Colombier int __fmtrcpy(Fmt *f, const void *vm, int n); 38*0d601874SDavid du Colombier void __fmtunlock(void); 39*0d601874SDavid du Colombier int __ifmt(Fmt *f); 40*0d601874SDavid du Colombier int __isInf(double d, int sign); 41*0d601874SDavid du Colombier int __isNaN(double d); 42*0d601874SDavid du Colombier int __needsquotes(char *s, int *quotelenp); 43*0d601874SDavid du Colombier int __percentfmt(Fmt *f); 44*0d601874SDavid du Colombier void __quotesetup(char *s, Rune *r, int nin, int nout, Quoteinfo *q, int sharp, int runesout); 45*0d601874SDavid du Colombier int __quotestrfmt(int runesin, Fmt *f); 46*0d601874SDavid du Colombier int __rfmtpad(Fmt *f, int n); 47*0d601874SDavid du Colombier int __runefmt(Fmt *f); 48*0d601874SDavid du Colombier int __runeneedsquotes(Rune *r, int *quotelenp); 49*0d601874SDavid du Colombier int __runesfmt(Fmt *f); 50*0d601874SDavid du Colombier int __strfmt(Fmt *f); 518ccd4a63SDavid du Colombier 528ccd4a63SDavid du Colombier #define FMTCHAR(f, t, s, c)\ 538ccd4a63SDavid du Colombier do{\ 548ccd4a63SDavid du Colombier if(t + 1 > (char*)s){\ 55*0d601874SDavid du Colombier t = __fmtflush(f, t, 1);\ 568ccd4a63SDavid du Colombier if(t != nil)\ 578ccd4a63SDavid du Colombier s = f->stop;\ 588ccd4a63SDavid du Colombier else\ 598ccd4a63SDavid du Colombier return -1;\ 608ccd4a63SDavid du Colombier }\ 618ccd4a63SDavid du Colombier *t++ = c;\ 628ccd4a63SDavid du Colombier }while(0) 638ccd4a63SDavid du Colombier 648ccd4a63SDavid du Colombier #define FMTRCHAR(f, t, s, c)\ 658ccd4a63SDavid du Colombier do{\ 668ccd4a63SDavid du Colombier if(t + 1 > (Rune*)s){\ 67*0d601874SDavid du Colombier t = __fmtflush(f, t, sizeof(Rune));\ 688ccd4a63SDavid du Colombier if(t != nil)\ 698ccd4a63SDavid du Colombier s = f->stop;\ 708ccd4a63SDavid du Colombier else\ 718ccd4a63SDavid du Colombier return -1;\ 728ccd4a63SDavid du Colombier }\ 738ccd4a63SDavid du Colombier *t++ = c;\ 748ccd4a63SDavid du Colombier }while(0) 758ccd4a63SDavid du Colombier 768ccd4a63SDavid du Colombier #define FMTRUNE(f, t, s, r)\ 778ccd4a63SDavid du Colombier do{\ 788ccd4a63SDavid du Colombier Rune _rune;\ 798ccd4a63SDavid du Colombier int _runelen;\ 808ccd4a63SDavid du Colombier if(t + UTFmax > (char*)s && t + (_runelen = runelen(r)) > (char*)s){\ 81*0d601874SDavid du Colombier t = __fmtflush(f, t, _runelen);\ 828ccd4a63SDavid du Colombier if(t != nil)\ 838ccd4a63SDavid du Colombier s = f->stop;\ 848ccd4a63SDavid du Colombier else\ 858ccd4a63SDavid du Colombier return -1;\ 868ccd4a63SDavid du Colombier }\ 878ccd4a63SDavid du Colombier if(r < Runeself)\ 888ccd4a63SDavid du Colombier *t++ = r;\ 898ccd4a63SDavid du Colombier else{\ 908ccd4a63SDavid du Colombier _rune = r;\ 918ccd4a63SDavid du Colombier t += runetochar(t, &_rune);\ 928ccd4a63SDavid du Colombier }\ 938ccd4a63SDavid du Colombier }while(0) 94*0d601874SDavid du Colombier 95*0d601874SDavid du Colombier #ifdef va_copy 96*0d601874SDavid du Colombier # define VA_COPY(a,b) va_copy(a,b) 97*0d601874SDavid du Colombier # define VA_END(a) va_end(a) 98*0d601874SDavid du Colombier #else 99*0d601874SDavid du Colombier # define VA_COPY(a,b) (a) = (b) 100*0d601874SDavid du Colombier # define VA_END(a) 101*0d601874SDavid du Colombier #endif 102*0d601874SDavid du Colombier 103*0d601874SDavid du Colombier #define PLAN9PORT 104