xref: /plan9/sys/src/cmd/unix/drawterm/libc/fmtdef.h (revision 2282df4ee19682a10ae95200202320ff2912f104)
18ccd4a63SDavid du Colombier /*
28ccd4a63SDavid du Colombier  * dofmt -- format to a buffer
38ccd4a63SDavid du Colombier  * the number of characters formatted is returned,
48ccd4a63SDavid du Colombier  * or -1 if there was an error.
58ccd4a63SDavid du Colombier  * if the buffer is ever filled, flush is called.
68ccd4a63SDavid du Colombier  * it should reset the buffer and return whether formatting should continue.
78ccd4a63SDavid du Colombier  */
88ccd4a63SDavid du Colombier 
98ccd4a63SDavid du Colombier typedef int (*Fmts)(Fmt*);
108ccd4a63SDavid du Colombier 
118ccd4a63SDavid du Colombier typedef struct Quoteinfo Quoteinfo;
128ccd4a63SDavid du Colombier struct Quoteinfo
138ccd4a63SDavid du Colombier {
148ccd4a63SDavid du Colombier 	int	quoted;		/* if set, string must be quoted */
158ccd4a63SDavid du Colombier 	int	nrunesin;	/* number of input runes that can be accepted */
168ccd4a63SDavid du Colombier 	int	nbytesin;	/* number of input bytes that can be accepted */
178ccd4a63SDavid du Colombier 	int	nrunesout;	/* number of runes that will be generated */
188ccd4a63SDavid du Colombier 	int	nbytesout;	/* number of bytes that will be generated */
198ccd4a63SDavid du Colombier };
208ccd4a63SDavid du Colombier 
21*0d601874SDavid du Colombier /* Edit .+1,/^$/ |cfn |grep -v static | grep __ */
22*0d601874SDavid du Colombier double       __Inf(int sign);
23*0d601874SDavid du Colombier double       __NaN(void);
24*0d601874SDavid du Colombier int          __badfmt(Fmt *f);
25*0d601874SDavid du Colombier int          __charfmt(Fmt *f);
26*0d601874SDavid du Colombier int          __countfmt(Fmt *f);
27*0d601874SDavid du Colombier int          __efgfmt(Fmt *fmt);
28*0d601874SDavid du Colombier int          __errfmt(Fmt *f);
29*0d601874SDavid du Colombier int          __flagfmt(Fmt *f);
30*0d601874SDavid du Colombier int          __fmtFdFlush(Fmt *f);
31*0d601874SDavid du Colombier int          __fmtcpy(Fmt *f, const void *vm, int n, int sz);
32*0d601874SDavid du Colombier void*        __fmtdispatch(Fmt *f, void *fmt, int isrunes);
33*0d601874SDavid du Colombier void *       __fmtflush(Fmt *f, void *t, int len);
34*0d601874SDavid du Colombier void         __fmtlock(void);
35*0d601874SDavid du Colombier int          __fmtpad(Fmt *f, int n);
36*0d601874SDavid du Colombier double       __fmtpow10(int n);
37*0d601874SDavid du Colombier int          __fmtrcpy(Fmt *f, const void *vm, int n);
38*0d601874SDavid du Colombier void         __fmtunlock(void);
39*0d601874SDavid du Colombier int          __ifmt(Fmt *f);
40*0d601874SDavid du Colombier int          __isInf(double d, int sign);
41*0d601874SDavid du Colombier int          __isNaN(double d);
42*0d601874SDavid du Colombier int          __needsquotes(char *s, int *quotelenp);
43*0d601874SDavid du Colombier int          __percentfmt(Fmt *f);
44*0d601874SDavid du Colombier void         __quotesetup(char *s, Rune *r, int nin, int nout, Quoteinfo *q, int sharp, int runesout);
45*0d601874SDavid du Colombier int          __quotestrfmt(int runesin, Fmt *f);
46*0d601874SDavid du Colombier int          __rfmtpad(Fmt *f, int n);
47*0d601874SDavid du Colombier int          __runefmt(Fmt *f);
48*0d601874SDavid du Colombier int          __runeneedsquotes(Rune *r, int *quotelenp);
49*0d601874SDavid du Colombier int          __runesfmt(Fmt *f);
50*0d601874SDavid du Colombier int          __strfmt(Fmt *f);
518ccd4a63SDavid du Colombier 
528ccd4a63SDavid du Colombier #define FMTCHAR(f, t, s, c)\
538ccd4a63SDavid du Colombier 	do{\
548ccd4a63SDavid du Colombier 	if(t + 1 > (char*)s){\
55*0d601874SDavid du Colombier 		t = __fmtflush(f, t, 1);\
568ccd4a63SDavid du Colombier 		if(t != nil)\
578ccd4a63SDavid du Colombier 			s = f->stop;\
588ccd4a63SDavid du Colombier 		else\
598ccd4a63SDavid du Colombier 			return -1;\
608ccd4a63SDavid du Colombier 	}\
618ccd4a63SDavid du Colombier 	*t++ = c;\
628ccd4a63SDavid du Colombier 	}while(0)
638ccd4a63SDavid du Colombier 
648ccd4a63SDavid du Colombier #define FMTRCHAR(f, t, s, c)\
658ccd4a63SDavid du Colombier 	do{\
668ccd4a63SDavid du Colombier 	if(t + 1 > (Rune*)s){\
67*0d601874SDavid du Colombier 		t = __fmtflush(f, t, sizeof(Rune));\
688ccd4a63SDavid du Colombier 		if(t != nil)\
698ccd4a63SDavid du Colombier 			s = f->stop;\
708ccd4a63SDavid du Colombier 		else\
718ccd4a63SDavid du Colombier 			return -1;\
728ccd4a63SDavid du Colombier 	}\
738ccd4a63SDavid du Colombier 	*t++ = c;\
748ccd4a63SDavid du Colombier 	}while(0)
758ccd4a63SDavid du Colombier 
768ccd4a63SDavid du Colombier #define FMTRUNE(f, t, s, r)\
778ccd4a63SDavid du Colombier 	do{\
788ccd4a63SDavid du Colombier 	Rune _rune;\
798ccd4a63SDavid du Colombier 	int _runelen;\
808ccd4a63SDavid du Colombier 	if(t + UTFmax > (char*)s && t + (_runelen = runelen(r)) > (char*)s){\
81*0d601874SDavid du Colombier 		t = __fmtflush(f, t, _runelen);\
828ccd4a63SDavid du Colombier 		if(t != nil)\
838ccd4a63SDavid du Colombier 			s = f->stop;\
848ccd4a63SDavid du Colombier 		else\
858ccd4a63SDavid du Colombier 			return -1;\
868ccd4a63SDavid du Colombier 	}\
878ccd4a63SDavid du Colombier 	if(r < Runeself)\
888ccd4a63SDavid du Colombier 		*t++ = r;\
898ccd4a63SDavid du Colombier 	else{\
908ccd4a63SDavid du Colombier 		_rune = r;\
918ccd4a63SDavid du Colombier 		t += runetochar(t, &_rune);\
928ccd4a63SDavid du Colombier 	}\
938ccd4a63SDavid du Colombier 	}while(0)
94*0d601874SDavid du Colombier 
95*0d601874SDavid du Colombier #ifdef va_copy
96*0d601874SDavid du Colombier #	define VA_COPY(a,b) va_copy(a,b)
97*0d601874SDavid du Colombier #	define VA_END(a) va_end(a)
98*0d601874SDavid du Colombier #else
99*0d601874SDavid du Colombier #	define VA_COPY(a,b) (a) = (b)
100*0d601874SDavid du Colombier #	define VA_END(a)
101*0d601874SDavid du Colombier #endif
102*0d601874SDavid du Colombier 
103*0d601874SDavid du Colombier #define PLAN9PORT
104