1*9a747e4fSDavid du Colombier /* 2*9a747e4fSDavid du Colombier * dofmt -- format to a buffer 3*9a747e4fSDavid du Colombier * the number of characters formatted is returned, 4*9a747e4fSDavid du Colombier * or -1 if there was an error. 5*9a747e4fSDavid du Colombier * if the buffer is ever filled, flush is called. 6*9a747e4fSDavid du Colombier * it should reset the buffer and return whether formatting should continue. 7*9a747e4fSDavid du Colombier */ 8*9a747e4fSDavid du Colombier 9*9a747e4fSDavid du Colombier typedef int (*Fmts)(Fmt*); 10*9a747e4fSDavid du Colombier 11*9a747e4fSDavid du Colombier typedef struct Quoteinfo Quoteinfo; 12*9a747e4fSDavid du Colombier struct Quoteinfo 13*9a747e4fSDavid du Colombier { 14*9a747e4fSDavid du Colombier int quoted; /* if set, string must be quoted */ 15*9a747e4fSDavid du Colombier int nrunesin; /* number of input runes that can be accepted */ 16*9a747e4fSDavid du Colombier int nbytesin; /* number of input bytes that can be accepted */ 17*9a747e4fSDavid du Colombier int nrunesout; /* number of runes that will be generated */ 18*9a747e4fSDavid du Colombier int nbytesout; /* number of bytes that will be generated */ 19*9a747e4fSDavid du Colombier }; 20*9a747e4fSDavid du Colombier 21*9a747e4fSDavid du Colombier void *_fmtflush(Fmt*, void*, int); 22*9a747e4fSDavid du Colombier void *_fmtdispatch(Fmt*, void*, int); 23*9a747e4fSDavid du Colombier int _floatfmt(Fmt*, double); 24*9a747e4fSDavid du Colombier int _fmtpad(Fmt*, int); 25*9a747e4fSDavid du Colombier int _rfmtpad(Fmt*, int); 26*9a747e4fSDavid du Colombier int _fmtFdFlush(Fmt*); 27*9a747e4fSDavid du Colombier 28*9a747e4fSDavid du Colombier int _efgfmt(Fmt*); 29*9a747e4fSDavid du Colombier int _charfmt(Fmt*); 30*9a747e4fSDavid du Colombier int _countfmt(Fmt*); 31*9a747e4fSDavid du Colombier int _flagfmt(Fmt*); 32*9a747e4fSDavid du Colombier int _percentfmt(Fmt*); 33*9a747e4fSDavid du Colombier int _ifmt(Fmt*); 34*9a747e4fSDavid du Colombier int _runefmt(Fmt*); 35*9a747e4fSDavid du Colombier int _runesfmt(Fmt*); 36*9a747e4fSDavid du Colombier int _strfmt(Fmt*); 37*9a747e4fSDavid du Colombier int _badfmt(Fmt*); 38*9a747e4fSDavid du Colombier int _fmtcpy(Fmt*, void*, int, int); 39*9a747e4fSDavid du Colombier int _fmtrcpy(Fmt*, void*, int n); 40*9a747e4fSDavid du Colombier 41*9a747e4fSDavid du Colombier void _fmtlock(void); 42*9a747e4fSDavid du Colombier void _fmtunlock(void); 43*9a747e4fSDavid du Colombier 44*9a747e4fSDavid du Colombier #define FMTCHAR(f, t, s, c)\ 45*9a747e4fSDavid du Colombier do{\ 46*9a747e4fSDavid du Colombier if(t + 1 > (char*)s){\ 47*9a747e4fSDavid du Colombier t = _fmtflush(f, t, 1);\ 48*9a747e4fSDavid du Colombier if(t != nil)\ 49*9a747e4fSDavid du Colombier s = f->stop;\ 50*9a747e4fSDavid du Colombier else\ 51*9a747e4fSDavid du Colombier return -1;\ 52*9a747e4fSDavid du Colombier }\ 53*9a747e4fSDavid du Colombier *t++ = c;\ 54*9a747e4fSDavid du Colombier }while(0) 55*9a747e4fSDavid du Colombier 56*9a747e4fSDavid du Colombier #define FMTRCHAR(f, t, s, c)\ 57*9a747e4fSDavid du Colombier do{\ 58*9a747e4fSDavid du Colombier if(t + 1 > (Rune*)s){\ 59*9a747e4fSDavid du Colombier t = _fmtflush(f, t, sizeof(Rune));\ 60*9a747e4fSDavid du Colombier if(t != nil)\ 61*9a747e4fSDavid du Colombier s = f->stop;\ 62*9a747e4fSDavid du Colombier else\ 63*9a747e4fSDavid du Colombier return -1;\ 64*9a747e4fSDavid du Colombier }\ 65*9a747e4fSDavid du Colombier *t++ = c;\ 66*9a747e4fSDavid du Colombier }while(0) 67*9a747e4fSDavid du Colombier 68*9a747e4fSDavid du Colombier #define FMTRUNE(f, t, s, r)\ 69*9a747e4fSDavid du Colombier do{\ 70*9a747e4fSDavid du Colombier Rune _rune;\ 71*9a747e4fSDavid du Colombier int _runelen;\ 72*9a747e4fSDavid du Colombier if(t + UTFmax > (char*)s && t + (_runelen = runelen(r)) > (char*)s){\ 73*9a747e4fSDavid du Colombier t = _fmtflush(f, t, _runelen);\ 74*9a747e4fSDavid du Colombier if(t != nil)\ 75*9a747e4fSDavid du Colombier s = f->stop;\ 76*9a747e4fSDavid du Colombier else\ 77*9a747e4fSDavid du Colombier return -1;\ 78*9a747e4fSDavid du Colombier }\ 79*9a747e4fSDavid du Colombier if(r < Runeself)\ 80*9a747e4fSDavid du Colombier *t++ = r;\ 81*9a747e4fSDavid du Colombier else{\ 82*9a747e4fSDavid du Colombier _rune = r;\ 83*9a747e4fSDavid du Colombier t += runetochar(t, &_rune);\ 84*9a747e4fSDavid du Colombier }\ 85*9a747e4fSDavid du Colombier }while(0) 86