xref: /inferno-os/lib9/fmtdef.h (revision 1f44c82a26ff60e012a2ff697cb036a25c0c7f97)
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