140ef9009SDavid du Colombier /* 240ef9009SDavid du Colombier * The authors of this software are Rob Pike and Ken Thompson. 340ef9009SDavid du Colombier * Copyright (c) 2002 by Lucent Technologies. 440ef9009SDavid du Colombier * Permission to use, copy, modify, and distribute this software for any 540ef9009SDavid du Colombier * purpose without fee is hereby granted, provided that this entire notice 640ef9009SDavid du Colombier * is included in all copies of any software which is or includes a copy 740ef9009SDavid du Colombier * or modification of this software and in all copies of the supporting 840ef9009SDavid du Colombier * documentation for such software. 940ef9009SDavid du Colombier * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED 1040ef9009SDavid du Colombier * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE ANY 1140ef9009SDavid du Colombier * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY 1240ef9009SDavid du Colombier * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE. 1340ef9009SDavid du Colombier */ 1440ef9009SDavid du Colombier /* 1540ef9009SDavid du Colombier * dofmt -- format to a buffer 1640ef9009SDavid du Colombier * the number of characters formatted is returned, 1740ef9009SDavid du Colombier * or -1 if there was an error. 1840ef9009SDavid du Colombier * if the buffer is ever filled, flush is called. 1940ef9009SDavid du Colombier * it should reset the buffer and return whether formatting should continue. 2040ef9009SDavid du Colombier */ 2140ef9009SDavid du Colombier #define uchar _fmtuchar 2240ef9009SDavid du Colombier #define ushort _fmtushort 2340ef9009SDavid du Colombier #define uint _fmtuint 2440ef9009SDavid du Colombier #define ulong _fmtulong 2540ef9009SDavid du Colombier #define vlong _fmtvlong 2640ef9009SDavid du Colombier #define uvlong _fmtuvlong 2740ef9009SDavid du Colombier 28*781103c4SDavid du Colombier // #define USED(x) if(x);else 2940ef9009SDavid du Colombier 3040ef9009SDavid du Colombier typedef unsigned char uchar; 3140ef9009SDavid du Colombier typedef unsigned short ushort; 3240ef9009SDavid du Colombier typedef unsigned int uint; 3340ef9009SDavid du Colombier typedef unsigned long ulong; 3440ef9009SDavid du Colombier 3540ef9009SDavid du Colombier #ifndef NOVLONGS 3640ef9009SDavid du Colombier typedef unsigned long long uvlong; 3740ef9009SDavid du Colombier typedef long long vlong; 3840ef9009SDavid du Colombier #endif 3940ef9009SDavid du Colombier 40363b328dSDavid du Colombier /* #define nil 0 /* cannot be ((void*)0) because used for function pointers */ 4140ef9009SDavid du Colombier 4240ef9009SDavid du Colombier typedef int (*Fmts)(Fmt*); 4340ef9009SDavid du Colombier 4440ef9009SDavid du Colombier typedef struct Quoteinfo Quoteinfo; 4540ef9009SDavid du Colombier struct Quoteinfo 4640ef9009SDavid du Colombier { 4740ef9009SDavid du Colombier int quoted; /* if set, string must be quoted */ 4840ef9009SDavid du Colombier int nrunesin; /* number of input runes that can be accepted */ 4940ef9009SDavid du Colombier int nbytesin; /* number of input bytes that can be accepted */ 5040ef9009SDavid du Colombier int nrunesout; /* number of runes that will be generated */ 5140ef9009SDavid du Colombier int nbytesout; /* number of bytes that will be generated */ 5240ef9009SDavid du Colombier }; 5340ef9009SDavid du Colombier 5440ef9009SDavid du Colombier void *__fmtflush(Fmt*, void*, int); 5540ef9009SDavid du Colombier void *__fmtdispatch(Fmt*, void*, int); 5640ef9009SDavid du Colombier int __floatfmt(Fmt*, double); 5740ef9009SDavid du Colombier int __fmtpad(Fmt*, int); 5840ef9009SDavid du Colombier int __rfmtpad(Fmt*, int); 5940ef9009SDavid du Colombier int __fmtFdFlush(Fmt*); 6040ef9009SDavid du Colombier 6140ef9009SDavid du Colombier int __efgfmt(Fmt*); 6240ef9009SDavid du Colombier int __charfmt(Fmt*); 6340ef9009SDavid du Colombier int __runefmt(Fmt*); 6440ef9009SDavid du Colombier int __runesfmt(Fmt*); 6540ef9009SDavid du Colombier int __countfmt(Fmt*); 6640ef9009SDavid du Colombier int __flagfmt(Fmt*); 6740ef9009SDavid du Colombier int __percentfmt(Fmt*); 6840ef9009SDavid du Colombier int __ifmt(Fmt*); 6940ef9009SDavid du Colombier int __strfmt(Fmt*); 7040ef9009SDavid du Colombier int __badfmt(Fmt*); 7140ef9009SDavid du Colombier int __fmtcpy(Fmt*, const void*, int, int); 7240ef9009SDavid du Colombier int __fmtrcpy(Fmt*, const void*, int n); 7340ef9009SDavid du Colombier int __errfmt(Fmt *f); 7440ef9009SDavid du Colombier 7540ef9009SDavid du Colombier double __fmtpow10(int); 7640ef9009SDavid du Colombier 7740ef9009SDavid du Colombier void __fmtlock(void); 7840ef9009SDavid du Colombier void __fmtunlock(void); 7940ef9009SDavid du Colombier 8040ef9009SDavid du Colombier #define FMTCHAR(f, t, s, c)\ 8140ef9009SDavid du Colombier do{\ 8240ef9009SDavid du Colombier if(t + 1 > (char*)s){\ 8340ef9009SDavid du Colombier t = __fmtflush(f, t, 1);\ 8440ef9009SDavid du Colombier if(t != nil)\ 8540ef9009SDavid du Colombier s = f->stop;\ 8640ef9009SDavid du Colombier else\ 8740ef9009SDavid du Colombier return -1;\ 8840ef9009SDavid du Colombier }\ 8940ef9009SDavid du Colombier *t++ = c;\ 9040ef9009SDavid du Colombier }while(0) 9140ef9009SDavid du Colombier 9240ef9009SDavid du Colombier #define FMTRCHAR(f, t, s, c)\ 9340ef9009SDavid du Colombier do{\ 9440ef9009SDavid du Colombier if(t + 1 > (Rune*)s){\ 9540ef9009SDavid du Colombier t = __fmtflush(f, t, sizeof(Rune));\ 9640ef9009SDavid du Colombier if(t != nil)\ 9740ef9009SDavid du Colombier s = f->stop;\ 9840ef9009SDavid du Colombier else\ 9940ef9009SDavid du Colombier return -1;\ 10040ef9009SDavid du Colombier }\ 10140ef9009SDavid du Colombier *t++ = c;\ 10240ef9009SDavid du Colombier }while(0) 10340ef9009SDavid du Colombier 10440ef9009SDavid du Colombier #define FMTRUNE(f, t, s, r)\ 10540ef9009SDavid du Colombier do{\ 10640ef9009SDavid du Colombier Rune _rune;\ 10740ef9009SDavid du Colombier int _runelen;\ 10840ef9009SDavid du Colombier if(t + UTFmax > (char*)s && t + (_runelen = runelen(r)) > (char*)s){\ 10940ef9009SDavid du Colombier t = __fmtflush(f, t, _runelen);\ 11040ef9009SDavid du Colombier if(t != nil)\ 11140ef9009SDavid du Colombier s = f->stop;\ 11240ef9009SDavid du Colombier else\ 11340ef9009SDavid du Colombier return -1;\ 11440ef9009SDavid du Colombier }\ 11540ef9009SDavid du Colombier if(r < Runeself)\ 11640ef9009SDavid du Colombier *t++ = r;\ 11740ef9009SDavid du Colombier else{\ 11840ef9009SDavid du Colombier _rune = r;\ 11940ef9009SDavid du Colombier t += runetochar(t, &_rune);\ 12040ef9009SDavid du Colombier }\ 12140ef9009SDavid du Colombier }while(0) 122