Blob


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
28 #define USED(x) if(x);else
30 typedef unsigned char uchar;
31 typedef unsigned short ushort;
32 typedef unsigned int uint;
33 typedef unsigned long ulong;
35 #ifndef NOVLONGS
36 typedef unsigned long long uvlong;
37 typedef long long vlong;
38 #endif
40 #define nil 0 /* cannot be ((void*)0) because used for function pointers */
42 typedef int (*Fmts)(Fmt*);
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 };
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*);
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);
75 double __fmtpow10(int);
77 void __fmtlock(void);
78 void __fmtunlock(void);
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)
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)
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)