xref: /plan9/sys/src/ape/lib/fmt/fmtdef.h (revision 781103c4074deb8af160e8a0da2742ba6b29dc2b)
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