Subversion Repositories planix.SVN

Rev

Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 1
/*
2
 * dofmt -- format to a buffer
3
 * the number of characters formatted is returned,
4
 * or -1 if there was an error.
5
 * if the buffer is ever filled, flush is called.
6
 * it should reset the buffer and return whether formatting should continue.
7
 */
8
 
9
typedef int (*Fmts)(Fmt*);
10
 
11
typedef struct Quoteinfo Quoteinfo;
12
struct Quoteinfo
13
{
14
	int	quoted;		/* if set, string must be quoted */
15
	int	nrunesin;	/* number of input runes that can be accepted */
16
	int	nbytesin;	/* number of input bytes that can be accepted */
17
	int	nrunesout;	/* number of runes that will be generated */
18
	int	nbytesout;	/* number of bytes that will be generated */
19
};
20
 
21
void	*_fmtflush(Fmt*, void*, int);
22
void	*_fmtdispatch(Fmt*, void*, int);
23
int	_floatfmt(Fmt*, double);
24
int	_fmtpad(Fmt*, int);
25
int	_rfmtpad(Fmt*, int);
26
int	_fmtFdFlush(Fmt*);
27
 
28
int	_efgfmt(Fmt*);
29
int	_charfmt(Fmt*);
30
int	_countfmt(Fmt*);
31
int	_flagfmt(Fmt*);
32
int	_percentfmt(Fmt*);
33
int	_ifmt(Fmt*);
34
int	_runefmt(Fmt*);
35
int	_runesfmt(Fmt*);
36
int	_strfmt(Fmt*);
37
int	_badfmt(Fmt*);
38
int	_fmtcpy(Fmt*, void*, int, int);
39
int	_fmtrcpy(Fmt*, void*, int n);
40
 
41
void	_fmtlock(void);
42
void	_fmtunlock(void);
43
 
44
#define FMTCHAR(f, t, s, c)\
45
	do{\
46
	if(t + 1 > (char*)s){\
47
		t = _fmtflush(f, t, 1);\
48
		if(t != nil)\
49
			s = f->stop;\
50
		else\
51
			return -1;\
52
	}\
53
	*t++ = c;\
54
	}while(0)
55
 
56
#define FMTRCHAR(f, t, s, c)\
57
	do{\
58
	if(t + 1 > (Rune*)s){\
59
		t = _fmtflush(f, t, sizeof(Rune));\
60
		if(t != nil)\
61
			s = f->stop;\
62
		else\
63
			return -1;\
64
	}\
65
	*t++ = c;\
66
	}while(0)
67
 
68
#define FMTRUNE(f, t, s, r)\
69
	do{\
70
	Rune _rune;\
71
	int _runelen;\
72
	if(t + UTFmax > (char*)s && t + (_runelen = runelen(r)) > (char*)s){\
73
		t = _fmtflush(f, t, _runelen);\
74
		if(t != nil)\
75
			s = f->stop;\
76
		else\
77
			return -1;\
78
	}\
79
	if(r < Runeself)\
80
		*t++ = r;\
81
	else{\
82
		_rune = r;\
83
		t += runetochar(t, &_rune);\
84
	}\
85
	}while(0)