Blame


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