Blob


1 /* Copyright (c) 2002-2006 Lucent Technologies; see LICENSE */
3 /*
4 * dofmt -- format to a buffer
5 * the number of characters formatted is returned,
6 * or -1 if there was an error.
7 * if the buffer is ever filled, flush is called.
8 * it should reset the buffer and return whether formatting should continue.
9 */
11 typedef int (*Fmts)(Fmt*);
13 typedef struct Quoteinfo Quoteinfo;
14 struct Quoteinfo
15 {
16 int quoted; /* if set, string must be quoted */
17 int nrunesin; /* number of input runes that can be accepted */
18 int nbytesin; /* number of input bytes that can be accepted */
19 int nrunesout; /* number of runes that will be generated */
20 int nbytesout; /* number of bytes that will be generated */
21 };
23 /* Edit .+1,/^$/ |cfn |grep -v static | grep __ */
24 double __Inf(int sign);
25 double __NaN(void);
26 int __badfmt(Fmt *f);
27 int __charfmt(Fmt *f);
28 int __countfmt(Fmt *f);
29 int __efgfmt(Fmt *fmt);
30 int __errfmt(Fmt *f);
31 int __flagfmt(Fmt *f);
32 int __fmtFdFlush(Fmt *f);
33 int __fmtcpy(Fmt *f, const void *vm, int n, int sz);
34 void* __fmtdispatch(Fmt *f, void *fmt, int isrunes);
35 void * __fmtflush(Fmt *f, void *t, int len);
36 void __fmtlock(void);
37 int __fmtpad(Fmt *f, int n);
38 double __fmtpow10(int n);
39 int __fmtrcpy(Fmt *f, const void *vm, int n);
40 void __fmtunlock(void);
41 int __ifmt(Fmt *f);
42 int __isInf(double d, int sign);
43 int __isNaN(double d);
44 int __needsep(int*, char**);
45 int __needsquotes(char *s, int *quotelenp);
46 int __percentfmt(Fmt *f);
47 void __quotesetup(char *s, Rune *r, int nin, int nout, Quoteinfo *q, int sharp, int runesout);
48 int __quotestrfmt(int runesin, Fmt *f);
49 int __rfmtpad(Fmt *f, int n);
50 int __runefmt(Fmt *f);
51 int __runeneedsquotes(Rune *r, int *quotelenp);
52 int __runesfmt(Fmt *f);
53 int __strfmt(Fmt *f);
55 #define FMTCHAR(f, t, s, c)\
56 do{\
57 if(t + 1 > (char*)s){\
58 t = (char*)__fmtflush(f, t, 1);\
59 if(t != nil)\
60 s = (char*)f->stop;\
61 else\
62 return -1;\
63 }\
64 *t++ = c;\
65 }while(0)
67 #define FMTRCHAR(f, t, s, c)\
68 do{\
69 if(t + 1 > (Rune*)s){\
70 t = (Rune*)__fmtflush(f, t, sizeof(Rune));\
71 if(t != nil)\
72 s = (Rune*)f->stop;\
73 else\
74 return -1;\
75 }\
76 *t++ = c;\
77 }while(0)
79 #define FMTRUNE(f, t, s, r)\
80 do{\
81 Rune _rune;\
82 int _runelen;\
83 if(t + UTFmax > (char*)s && t + (_runelen = runelen(r)) > (char*)s){\
84 t = (char*)__fmtflush(f, t, _runelen);\
85 if(t != nil)\
86 s = (char*)f->stop;\
87 else\
88 return -1;\
89 }\
90 if(r < Runeself)\
91 *t++ = r;\
92 else{\
93 _rune = r;\
94 t += runetochar(t, &_rune);\
95 }\
96 }while(0)
98 #ifdef va_copy
99 # define VA_COPY(a,b) va_copy(a,b)
100 # define VA_END(a) va_end(a)
101 #else
102 # define VA_COPY(a,b) (a) = (b)
103 # define VA_END(a)
104 #endif