137da2899SCharles.Forsyth /* 237da2899SCharles.Forsyth * The authors of this software are Rob Pike and Ken Thompson. 337da2899SCharles.Forsyth * Copyright (c) 2002 by Lucent Technologies. 437da2899SCharles.Forsyth * Permission to use, copy, modify, and distribute this software for any 537da2899SCharles.Forsyth * purpose without fee is hereby granted, provided that this entire notice 637da2899SCharles.Forsyth * is included in all copies of any software which is or includes a copy 737da2899SCharles.Forsyth * or modification of this software and in all copies of the supporting 837da2899SCharles.Forsyth * documentation for such software. 937da2899SCharles.Forsyth * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED 1037da2899SCharles.Forsyth * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE ANY 1137da2899SCharles.Forsyth * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY 1237da2899SCharles.Forsyth * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE. 1337da2899SCharles.Forsyth */ 1437da2899SCharles.Forsyth /* 1537da2899SCharles.Forsyth * dofmt -- format to a buffer 1637da2899SCharles.Forsyth * the number of characters formatted is returned, 1737da2899SCharles.Forsyth * or -1 if there was an error. 1837da2899SCharles.Forsyth * if the buffer is ever filled, flush is called. 1937da2899SCharles.Forsyth * it should reset the buffer and return whether formatting should continue. 2037da2899SCharles.Forsyth */ 2137da2899SCharles.Forsyth 2237da2899SCharles.Forsyth typedef int (*Fmts)(Fmt*); 2337da2899SCharles.Forsyth 2437da2899SCharles.Forsyth typedef struct Quoteinfo Quoteinfo; 2537da2899SCharles.Forsyth struct Quoteinfo 2637da2899SCharles.Forsyth { 2737da2899SCharles.Forsyth int quoted; /* if set, string must be quoted */ 2837da2899SCharles.Forsyth int nrunesin; /* number of input runes that can be accepted */ 2937da2899SCharles.Forsyth int nbytesin; /* number of input bytes that can be accepted */ 3037da2899SCharles.Forsyth int nrunesout; /* number of runes that will be generated */ 3137da2899SCharles.Forsyth int nbytesout; /* number of bytes that will be generated */ 3237da2899SCharles.Forsyth }; 3337da2899SCharles.Forsyth 3437da2899SCharles.Forsyth void *_fmtflush(Fmt*, void*, int); 3537da2899SCharles.Forsyth void *_fmtdispatch(Fmt*, void*, int); 3637da2899SCharles.Forsyth int _floatfmt(Fmt*, double); 3737da2899SCharles.Forsyth int _fmtpad(Fmt*, int); 3837da2899SCharles.Forsyth int _rfmtpad(Fmt*, int); 3937da2899SCharles.Forsyth int _fmtFdFlush(Fmt*); 4037da2899SCharles.Forsyth 4137da2899SCharles.Forsyth int _efgfmt(Fmt*); 4237da2899SCharles.Forsyth int _charfmt(Fmt*); 4337da2899SCharles.Forsyth int _countfmt(Fmt*); 4437da2899SCharles.Forsyth int _flagfmt(Fmt*); 4537da2899SCharles.Forsyth int _percentfmt(Fmt*); 4637da2899SCharles.Forsyth int _ifmt(Fmt*); 4737da2899SCharles.Forsyth int _runefmt(Fmt*); 4837da2899SCharles.Forsyth int _runesfmt(Fmt*); 4937da2899SCharles.Forsyth int _strfmt(Fmt*); 5037da2899SCharles.Forsyth int _badfmt(Fmt*); 5137da2899SCharles.Forsyth int _fmtcpy(Fmt*, void*, int, int); 5237da2899SCharles.Forsyth int _fmtrcpy(Fmt*, void*, int n); 5337da2899SCharles.Forsyth 5437da2899SCharles.Forsyth void _fmtlock(void); 5537da2899SCharles.Forsyth void _fmtunlock(void); 5637da2899SCharles.Forsyth 5737da2899SCharles.Forsyth #define FMTCHAR(f, t, s, c)\ 5837da2899SCharles.Forsyth do{\ 5937da2899SCharles.Forsyth if(t + 1 > (char*)s){\ 6037da2899SCharles.Forsyth t = _fmtflush(f, t, 1);\ 6137da2899SCharles.Forsyth if(t != nil)\ 6237da2899SCharles.Forsyth s = f->stop;\ 6337da2899SCharles.Forsyth else\ 6437da2899SCharles.Forsyth return -1;\ 6537da2899SCharles.Forsyth }\ 6637da2899SCharles.Forsyth *t++ = c;\ 6737da2899SCharles.Forsyth }while(0) 6837da2899SCharles.Forsyth 6937da2899SCharles.Forsyth #define FMTRCHAR(f, t, s, c)\ 7037da2899SCharles.Forsyth do{\ 7137da2899SCharles.Forsyth if(t + 1 > (Rune*)s){\ 7237da2899SCharles.Forsyth t = _fmtflush(f, t, sizeof(Rune));\ 7337da2899SCharles.Forsyth if(t != nil)\ 7437da2899SCharles.Forsyth s = f->stop;\ 7537da2899SCharles.Forsyth else\ 7637da2899SCharles.Forsyth return -1;\ 7737da2899SCharles.Forsyth }\ 7837da2899SCharles.Forsyth *t++ = c;\ 7937da2899SCharles.Forsyth }while(0) 8037da2899SCharles.Forsyth 8137da2899SCharles.Forsyth #define FMTRUNE(f, t, s, r)\ 8237da2899SCharles.Forsyth do{\ 8337da2899SCharles.Forsyth Rune _rune;\ 8437da2899SCharles.Forsyth int _runelen;\ 8537da2899SCharles.Forsyth if(t + UTFmax > (char*)s && t + (_runelen = runelen(r)) > (char*)s){\ 8637da2899SCharles.Forsyth t = _fmtflush(f, t, _runelen);\ 8737da2899SCharles.Forsyth if(t != nil)\ 8837da2899SCharles.Forsyth s = f->stop;\ 8937da2899SCharles.Forsyth else\ 9037da2899SCharles.Forsyth return -1;\ 9137da2899SCharles.Forsyth }\ 9237da2899SCharles.Forsyth if(r < Runeself)\ 9337da2899SCharles.Forsyth *t++ = r;\ 9437da2899SCharles.Forsyth else{\ 9537da2899SCharles.Forsyth _rune = r;\ 9637da2899SCharles.Forsyth t += runetochar(t, &_rune);\ 9737da2899SCharles.Forsyth }\ 9837da2899SCharles.Forsyth }while(0) 99*1f44c82aSCharles.Forsyth 100*1f44c82aSCharles.Forsyth #ifndef va_copy 101*1f44c82aSCharles.Forsyth #define va_copy(a, b) ((a) = (b)) 102*1f44c82aSCharles.Forsyth #endif 103