]>
git.saurik.com Git - apple/libc.git/blob - gen/FreeBSD/fmtcheck.c
2 * Copyright (c) 2000 The NetBSD Foundation, Inc.
5 * This code was contributed to The NetBSD Foundation by Allen Briggs.
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * 3. All advertising materials mentioning features or use of this software
16 * must display the following acknowledgement:
17 * This product includes software developed by the NetBSD
18 * Foundation, Inc. and its contributors.
19 * 4. Neither the name of The NetBSD Foundation nor the names of its
20 * contributors may be used to endorse or promote products derived
21 * from this software without specific prior written permission.
23 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
24 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
25 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
26 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
27 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
28 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
29 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
30 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
31 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
32 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
33 * POSSIBILITY OF SUCH DAMAGE.
36 /* $NetBSD: fmtcheck.c,v 1.2 2000/11/01 01:17:20 briggs Exp $ */
37 #include <sys/cdefs.h>
38 __FBSDID("$FreeBSD: src/lib/libc/gen/fmtcheck.c,v 1.7 2004/05/02 10:55:05 das Exp $");
44 __weak_reference(__fmtcheck
, fmtcheck
);
46 enum __e_fmtcheck_types
{
54 FMTCHECK_SHORTPOINTER
,
58 FMTCHECK_PTRDIFFTPOINTER
,
59 FMTCHECK_SIZETPOINTER
,
60 #ifndef NO_FLOATING_POINT
70 typedef enum __e_fmtcheck_types EFT
;
72 #define RETURN(pf,f,r) do { \
75 } /*NOTREACHED*/ /*CONSTCOND*/ while (0)
78 get_next_format_from_precision(const char **pf
)
80 int sh
, lg
, quad
, longdouble
, ptrdifft
, sizet
;
83 sh
= lg
= quad
= longdouble
= ptrdifft
= sizet
= 0;
93 if (!*f
) RETURN(pf
,f
,FMTCHECK_UNKNOWN
);
120 if (!*f
) RETURN(pf
,f
,FMTCHECK_UNKNOWN
);
121 if (strchr("diouxX", *f
)) {
123 RETURN(pf
,f
,FMTCHECK_UNKNOWN
);
125 RETURN(pf
,f
,FMTCHECK_LONG
);
127 RETURN(pf
,f
,FMTCHECK_QUAD
);
129 RETURN(pf
,f
,FMTCHECK_PTRDIFFT
);
131 RETURN(pf
,f
,FMTCHECK_SIZET
);
132 RETURN(pf
,f
,FMTCHECK_INT
);
136 RETURN(pf
,f
,FMTCHECK_UNKNOWN
);
138 RETURN(pf
,f
,FMTCHECK_SHORTPOINTER
);
140 RETURN(pf
,f
,FMTCHECK_LONGPOINTER
);
142 RETURN(pf
,f
,FMTCHECK_QUADPOINTER
);
144 RETURN(pf
,f
,FMTCHECK_PTRDIFFTPOINTER
);
146 RETURN(pf
,f
,FMTCHECK_SIZETPOINTER
);
147 RETURN(pf
,f
,FMTCHECK_INTPOINTER
);
149 if (strchr("DOU", *f
)) {
150 if (sh
+ lg
+ quad
+ longdouble
+ ptrdifft
+ sizet
)
151 RETURN(pf
,f
,FMTCHECK_UNKNOWN
);
152 RETURN(pf
,f
,FMTCHECK_LONG
);
154 #ifndef NO_FLOATING_POINT
155 if (strchr("aAeEfFgG", *f
)) {
157 RETURN(pf
,f
,FMTCHECK_LONGDOUBLE
);
158 if (sh
+ lg
+ quad
+ ptrdifft
+ sizet
)
159 RETURN(pf
,f
,FMTCHECK_UNKNOWN
);
160 RETURN(pf
,f
,FMTCHECK_DOUBLE
);
164 if (sh
+ lg
+ quad
+ longdouble
+ ptrdifft
+ sizet
)
165 RETURN(pf
,f
,FMTCHECK_UNKNOWN
);
166 RETURN(pf
,f
,FMTCHECK_INT
);
169 if (sh
+ lg
+ quad
+ longdouble
+ ptrdifft
+ sizet
)
170 RETURN(pf
,f
,FMTCHECK_UNKNOWN
);
171 RETURN(pf
,f
,FMTCHECK_STRING
);
174 if (sh
+ lg
+ quad
+ longdouble
+ ptrdifft
+ sizet
)
175 RETURN(pf
,f
,FMTCHECK_UNKNOWN
);
176 RETURN(pf
,f
,FMTCHECK_LONG
);
178 RETURN(pf
,f
,FMTCHECK_UNKNOWN
);
183 get_next_format_from_width(const char **pf
)
191 RETURN(pf
,f
,FMTCHECK_PRECISION
);
193 /* eat any precision (empty is allowed) */
194 while (isdigit(*f
)) f
++;
195 if (!*f
) RETURN(pf
,f
,FMTCHECK_UNKNOWN
);
197 RETURN(pf
,f
,get_next_format_from_precision(pf
));
202 get_next_format(const char **pf
, EFT eft
)
207 if (eft
== FMTCHECK_WIDTH
) {
209 return get_next_format_from_width(pf
);
210 } else if (eft
== FMTCHECK_PRECISION
) {
212 return get_next_format_from_precision(pf
);
220 RETURN(pf
,f
,FMTCHECK_DONE
);
223 RETURN(pf
,f
,FMTCHECK_UNKNOWN
);
230 /* Eat any of the flags */
231 while (*f
&& (strchr("#0- +", *f
)))
235 RETURN(pf
,f
,FMTCHECK_WIDTH
);
238 while (isdigit(*f
)) f
++;
240 RETURN(pf
,f
,FMTCHECK_UNKNOWN
);
243 RETURN(pf
,f
,get_next_format_from_width(pf
));
248 __fmtcheck(const char *f1
, const char *f2
)
250 const char *f1p
, *f2p
;
256 f1t
= FMTCHECK_START
;
258 f2t
= FMTCHECK_START
;
259 while ((f1t
= get_next_format(&f1p
, f1t
)) != FMTCHECK_DONE
) {
260 if (f1t
== FMTCHECK_UNKNOWN
)
262 f2t
= get_next_format(&f2p
, f2t
);