xref: /plan9/sys/src/libc/fmt/fmtdef.h (revision 9a747e4fd48b9f4522c70c07e8f882a15030f964)
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