Subversion Repositories planix.SVN

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 1
/*
2
 * The authors of this software are Rob Pike and Ken Thompson.
3
 *              Copyright (c) 2002 by Lucent Technologies.
4
 * Permission to use, copy, modify, and distribute this software for any
5
 * purpose without fee is hereby granted, provided that this entire notice
6
 * is included in all copies of any software which is or includes a copy
7
 * or modification of this software and in all copies of the supporting
8
 * documentation for such software.
9
 * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
10
 * WARRANTY.  IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE ANY
11
 * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
12
 * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
13
 */
14
/*
15
 * dofmt -- format to a buffer
16
 * the number of characters formatted is returned,
17
 * or -1 if there was an error.
18
 * if the buffer is ever filled, flush is called.
19
 * it should reset the buffer and return whether formatting should continue.
20
 */
21
#define uchar _fmtuchar
22
#define ushort _fmtushort
23
#define uint _fmtuint
24
#define ulong _fmtulong
25
#define vlong _fmtvlong
26
#define uvlong _fmtuvlong
27
 
28
// #define USED(x) if(x);else
29
 
30
typedef unsigned char		uchar;
31
typedef unsigned short		ushort;
32
typedef unsigned int		uint;
33
typedef unsigned long		ulong;
34
 
35
#ifndef NOVLONGS
36
typedef unsigned long long	uvlong;
37
typedef long long		vlong;
38
#endif
39
 
40
/* #define nil		0	/* cannot be ((void*)0) because used for function pointers */
41
 
42
typedef int (*Fmts)(Fmt*);
43
 
44
typedef struct Quoteinfo Quoteinfo;
45
struct Quoteinfo
46
{
47
	int	quoted;		/* if set, string must be quoted */
48
	int	nrunesin;	/* number of input runes that can be accepted */
49
	int	nbytesin;	/* number of input bytes that can be accepted */
50
	int	nrunesout;	/* number of runes that will be generated */
51
	int	nbytesout;	/* number of bytes that will be generated */
52
};
53
 
54
void	*__fmtflush(Fmt*, void*, int);
55
void	*__fmtdispatch(Fmt*, void*, int);
56
int	__floatfmt(Fmt*, double);
57
int	__fmtpad(Fmt*, int);
58
int	__rfmtpad(Fmt*, int);
59
int	__fmtFdFlush(Fmt*);
60
 
61
int	__efgfmt(Fmt*);
62
int	__charfmt(Fmt*);
63
int	__runefmt(Fmt*);
64
int	__runesfmt(Fmt*);
65
int	__countfmt(Fmt*);
66
int	__flagfmt(Fmt*);
67
int	__percentfmt(Fmt*);
68
int	__ifmt(Fmt*);
69
int	__strfmt(Fmt*);
70
int	__badfmt(Fmt*);
71
int	__fmtcpy(Fmt*, const void*, int, int);
72
int	__fmtrcpy(Fmt*, const void*, int n);
73
int	__errfmt(Fmt *f);
74
 
75
double	__fmtpow10(int);
76
 
77
void	__fmtlock(void);
78
void	__fmtunlock(void);
79
 
80
#define FMTCHAR(f, t, s, c)\
81
	do{\
82
	if(t + 1 > (char*)s){\
83
		t = __fmtflush(f, t, 1);\
84
		if(t != nil)\
85
			s = f->stop;\
86
		else\
87
			return -1;\
88
	}\
89
	*t++ = c;\
90
	}while(0)
91
 
92
#define FMTRCHAR(f, t, s, c)\
93
	do{\
94
	if(t + 1 > (Rune*)s){\
95
		t = __fmtflush(f, t, sizeof(Rune));\
96
		if(t != nil)\
97
			s = f->stop;\
98
		else\
99
			return -1;\
100
	}\
101
	*t++ = c;\
102
	}while(0)
103
 
104
#define FMTRUNE(f, t, s, r)\
105
	do{\
106
	Rune _rune;\
107
	int _runelen;\
108
	if(t + UTFmax > (char*)s && t + (_runelen = runelen(r)) > (char*)s){\
109
		t = __fmtflush(f, t, _runelen);\
110
		if(t != nil)\
111
			s = f->stop;\
112
		else\
113
			return -1;\
114
	}\
115
	if(r < Runeself)\
116
		*t++ = r;\
117
	else{\
118
		_rune = r;\
119
		t += runetochar(t, &_rune);\
120
	}\
121
	}while(0)