xref: /freebsd/crypto/heimdal/lib/roken/snprintf-test.c (revision 4137ff4cc173ea2e05227027e1c9e0ea42bcc0dc)
14137ff4cSJacques Vidrine /*
24137ff4cSJacques Vidrine  * Copyright (c) 2000 - 2001 Kungliga Tekniska H�gskolan
34137ff4cSJacques Vidrine  * (Royal Institute of Technology, Stockholm, Sweden).
44137ff4cSJacques Vidrine  * All rights reserved.
54137ff4cSJacques Vidrine  *
64137ff4cSJacques Vidrine  * Redistribution and use in source and binary forms, with or without
74137ff4cSJacques Vidrine  * modification, are permitted provided that the following conditions
84137ff4cSJacques Vidrine  * are met:
94137ff4cSJacques Vidrine  *
104137ff4cSJacques Vidrine  * 1. Redistributions of source code must retain the above copyright
114137ff4cSJacques Vidrine  *    notice, this list of conditions and the following disclaimer.
124137ff4cSJacques Vidrine  *
134137ff4cSJacques Vidrine  * 2. Redistributions in binary form must reproduce the above copyright
144137ff4cSJacques Vidrine  *    notice, this list of conditions and the following disclaimer in the
154137ff4cSJacques Vidrine  *    documentation and/or other materials provided with the distribution.
164137ff4cSJacques Vidrine  *
174137ff4cSJacques Vidrine  * 3. Neither the name of KTH nor the names of its contributors may be
184137ff4cSJacques Vidrine  *    used to endorse or promote products derived from this software without
194137ff4cSJacques Vidrine  *    specific prior written permission.
204137ff4cSJacques Vidrine  *
214137ff4cSJacques Vidrine  * THIS SOFTWARE IS PROVIDED BY KTH AND ITS CONTRIBUTORS ``AS IS'' AND ANY
224137ff4cSJacques Vidrine  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
234137ff4cSJacques Vidrine  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
244137ff4cSJacques Vidrine  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL KTH OR ITS CONTRIBUTORS BE
254137ff4cSJacques Vidrine  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
264137ff4cSJacques Vidrine  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
274137ff4cSJacques Vidrine  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
284137ff4cSJacques Vidrine  * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
294137ff4cSJacques Vidrine  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
304137ff4cSJacques Vidrine  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
314137ff4cSJacques Vidrine  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
324137ff4cSJacques Vidrine 
334137ff4cSJacques Vidrine #ifdef HAVE_CONFIG_H
344137ff4cSJacques Vidrine #include <config.h>
354137ff4cSJacques Vidrine #endif
364137ff4cSJacques Vidrine #include "roken.h"
374137ff4cSJacques Vidrine #include <limits.h>
384137ff4cSJacques Vidrine 
394137ff4cSJacques Vidrine #include "snprintf-test.h"
404137ff4cSJacques Vidrine 
414137ff4cSJacques Vidrine RCSID("$Id: snprintf-test.c,v 1.5 2001/09/13 01:01:16 assar Exp $");
424137ff4cSJacques Vidrine 
434137ff4cSJacques Vidrine static int
444137ff4cSJacques Vidrine try (const char *format, ...)
454137ff4cSJacques Vidrine {
464137ff4cSJacques Vidrine     int ret;
474137ff4cSJacques Vidrine     va_list ap;
484137ff4cSJacques Vidrine     char buf1[256], buf2[256];
494137ff4cSJacques Vidrine 
504137ff4cSJacques Vidrine     va_start (ap, format);
514137ff4cSJacques Vidrine     ret = vsnprintf (buf1, sizeof(buf1), format, ap);
524137ff4cSJacques Vidrine     if (ret >= sizeof(buf1))
534137ff4cSJacques Vidrine 	errx (1, "increase buf and try again");
544137ff4cSJacques Vidrine     vsprintf (buf2, format, ap);
554137ff4cSJacques Vidrine     ret = strcmp (buf1, buf2);
564137ff4cSJacques Vidrine     if (ret)
574137ff4cSJacques Vidrine 	printf ("failed: format = \"%s\", \"%s\" != \"%s\"\n",
584137ff4cSJacques Vidrine 		format, buf1, buf2);
594137ff4cSJacques Vidrine     va_end (ap);
604137ff4cSJacques Vidrine     return ret;
614137ff4cSJacques Vidrine }
624137ff4cSJacques Vidrine 
634137ff4cSJacques Vidrine static int
644137ff4cSJacques Vidrine cmp_with_sprintf_int (void)
654137ff4cSJacques Vidrine {
664137ff4cSJacques Vidrine     int tot = 0;
674137ff4cSJacques Vidrine     int int_values[] = {INT_MIN, -17, -1, 0, 1, 17, 4711, 65535, INT_MAX};
684137ff4cSJacques Vidrine     int i;
694137ff4cSJacques Vidrine 
704137ff4cSJacques Vidrine     for (i = 0; i < sizeof(int_values) / sizeof(int_values[0]); ++i) {
714137ff4cSJacques Vidrine 	tot += try ("%d", int_values[i]);
724137ff4cSJacques Vidrine 	tot += try ("%x", int_values[i]);
734137ff4cSJacques Vidrine 	tot += try ("%X", int_values[i]);
744137ff4cSJacques Vidrine 	tot += try ("%o", int_values[i]);
754137ff4cSJacques Vidrine 	tot += try ("%#x", int_values[i]);
764137ff4cSJacques Vidrine 	tot += try ("%#X", int_values[i]);
774137ff4cSJacques Vidrine 	tot += try ("%#o", int_values[i]);
784137ff4cSJacques Vidrine 	tot += try ("%10d", int_values[i]);
794137ff4cSJacques Vidrine 	tot += try ("%10x", int_values[i]);
804137ff4cSJacques Vidrine 	tot += try ("%10X", int_values[i]);
814137ff4cSJacques Vidrine 	tot += try ("%10o", int_values[i]);
824137ff4cSJacques Vidrine 	tot += try ("%#10x", int_values[i]);
834137ff4cSJacques Vidrine 	tot += try ("%#10X", int_values[i]);
844137ff4cSJacques Vidrine 	tot += try ("%#10o", int_values[i]);
854137ff4cSJacques Vidrine 	tot += try ("%-10d", int_values[i]);
864137ff4cSJacques Vidrine 	tot += try ("%-10x", int_values[i]);
874137ff4cSJacques Vidrine 	tot += try ("%-10X", int_values[i]);
884137ff4cSJacques Vidrine 	tot += try ("%-10o", int_values[i]);
894137ff4cSJacques Vidrine 	tot += try ("%-#10x", int_values[i]);
904137ff4cSJacques Vidrine 	tot += try ("%-#10X", int_values[i]);
914137ff4cSJacques Vidrine 	tot += try ("%-#10o", int_values[i]);
924137ff4cSJacques Vidrine     }
934137ff4cSJacques Vidrine     return tot;
944137ff4cSJacques Vidrine }
954137ff4cSJacques Vidrine 
964137ff4cSJacques Vidrine static int
974137ff4cSJacques Vidrine cmp_with_sprintf_long (void)
984137ff4cSJacques Vidrine {
994137ff4cSJacques Vidrine     int tot = 0;
1004137ff4cSJacques Vidrine     long long_values[] = {LONG_MIN, -17, -1, 0, 1, 17, 4711, 65535, LONG_MAX};
1014137ff4cSJacques Vidrine     int i;
1024137ff4cSJacques Vidrine 
1034137ff4cSJacques Vidrine     for (i = 0; i < sizeof(long_values) / sizeof(long_values[0]); ++i) {
1044137ff4cSJacques Vidrine 	tot += try ("%ld", long_values[i]);
1054137ff4cSJacques Vidrine 	tot += try ("%lx", long_values[i]);
1064137ff4cSJacques Vidrine 	tot += try ("%lX", long_values[i]);
1074137ff4cSJacques Vidrine 	tot += try ("%lo", long_values[i]);
1084137ff4cSJacques Vidrine 	tot += try ("%#lx", long_values[i]);
1094137ff4cSJacques Vidrine 	tot += try ("%#lX", long_values[i]);
1104137ff4cSJacques Vidrine 	tot += try ("%#lo", long_values[i]);
1114137ff4cSJacques Vidrine 	tot += try ("%10ld", long_values[i]);
1124137ff4cSJacques Vidrine 	tot += try ("%10lx", long_values[i]);
1134137ff4cSJacques Vidrine 	tot += try ("%10lX", long_values[i]);
1144137ff4cSJacques Vidrine 	tot += try ("%10lo", long_values[i]);
1154137ff4cSJacques Vidrine 	tot += try ("%#10lx", long_values[i]);
1164137ff4cSJacques Vidrine 	tot += try ("%#10lX", long_values[i]);
1174137ff4cSJacques Vidrine 	tot += try ("%#10lo", long_values[i]);
1184137ff4cSJacques Vidrine 	tot += try ("%-10ld", long_values[i]);
1194137ff4cSJacques Vidrine 	tot += try ("%-10lx", long_values[i]);
1204137ff4cSJacques Vidrine 	tot += try ("%-10lX", long_values[i]);
1214137ff4cSJacques Vidrine 	tot += try ("%-10lo", long_values[i]);
1224137ff4cSJacques Vidrine 	tot += try ("%-#10lx", long_values[i]);
1234137ff4cSJacques Vidrine 	tot += try ("%-#10lX", long_values[i]);
1244137ff4cSJacques Vidrine 	tot += try ("%-#10lo", long_values[i]);
1254137ff4cSJacques Vidrine     }
1264137ff4cSJacques Vidrine     return tot;
1274137ff4cSJacques Vidrine }
1284137ff4cSJacques Vidrine 
1294137ff4cSJacques Vidrine #ifdef HAVE_LONG_LONG
1304137ff4cSJacques Vidrine 
1314137ff4cSJacques Vidrine static int
1324137ff4cSJacques Vidrine cmp_with_sprintf_long_long (void)
1334137ff4cSJacques Vidrine {
1344137ff4cSJacques Vidrine     int tot = 0;
1354137ff4cSJacques Vidrine     long long long_long_values[] = {
1364137ff4cSJacques Vidrine 	((long long)LONG_MIN) -1, LONG_MIN, -17, -1,
1374137ff4cSJacques Vidrine 	0,
1384137ff4cSJacques Vidrine 	1, 17, 4711, 65535, LONG_MAX, ((long long)LONG_MAX) + 1};
1394137ff4cSJacques Vidrine     int i;
1404137ff4cSJacques Vidrine 
1414137ff4cSJacques Vidrine     for (i = 0; i < sizeof(long_long_values) / sizeof(long_long_values[0]); ++i) {
1424137ff4cSJacques Vidrine 	tot += try ("%lld", long_long_values[i]);
1434137ff4cSJacques Vidrine 	tot += try ("%llx", long_long_values[i]);
1444137ff4cSJacques Vidrine 	tot += try ("%llX", long_long_values[i]);
1454137ff4cSJacques Vidrine 	tot += try ("%llo", long_long_values[i]);
1464137ff4cSJacques Vidrine 	tot += try ("%#llx", long_long_values[i]);
1474137ff4cSJacques Vidrine 	tot += try ("%#llX", long_long_values[i]);
1484137ff4cSJacques Vidrine 	tot += try ("%#llo", long_long_values[i]);
1494137ff4cSJacques Vidrine 	tot += try ("%10lld", long_long_values[i]);
1504137ff4cSJacques Vidrine 	tot += try ("%10llx", long_long_values[i]);
1514137ff4cSJacques Vidrine 	tot += try ("%10llX", long_long_values[i]);
1524137ff4cSJacques Vidrine 	tot += try ("%10llo", long_long_values[i]);
1534137ff4cSJacques Vidrine 	tot += try ("%#10llx", long_long_values[i]);
1544137ff4cSJacques Vidrine 	tot += try ("%#10llX", long_long_values[i]);
1554137ff4cSJacques Vidrine 	tot += try ("%#10llo", long_long_values[i]);
1564137ff4cSJacques Vidrine 	tot += try ("%-10lld", long_long_values[i]);
1574137ff4cSJacques Vidrine 	tot += try ("%-10llx", long_long_values[i]);
1584137ff4cSJacques Vidrine 	tot += try ("%-10llX", long_long_values[i]);
1594137ff4cSJacques Vidrine 	tot += try ("%-10llo", long_long_values[i]);
1604137ff4cSJacques Vidrine 	tot += try ("%-#10llx", long_long_values[i]);
1614137ff4cSJacques Vidrine 	tot += try ("%-#10llX", long_long_values[i]);
1624137ff4cSJacques Vidrine 	tot += try ("%-#10llo", long_long_values[i]);
1634137ff4cSJacques Vidrine     }
1644137ff4cSJacques Vidrine     return tot;
1654137ff4cSJacques Vidrine }
1664137ff4cSJacques Vidrine 
1674137ff4cSJacques Vidrine #endif
1684137ff4cSJacques Vidrine 
1694137ff4cSJacques Vidrine #if 0
1704137ff4cSJacques Vidrine static int
1714137ff4cSJacques Vidrine cmp_with_sprintf_float (void)
1724137ff4cSJacques Vidrine {
1734137ff4cSJacques Vidrine     int tot = 0;
1744137ff4cSJacques Vidrine     double double_values[] = {-99999, -999, -17.4, -4.3, -3.0, -1.5, -1,
1754137ff4cSJacques Vidrine 			      0, 0.1, 0.2342374852, 0.2340007,
1764137ff4cSJacques Vidrine 			      3.1415926, 14.7845, 34.24758, 9999, 9999999};
1774137ff4cSJacques Vidrine     int i;
1784137ff4cSJacques Vidrine 
1794137ff4cSJacques Vidrine     for (i = 0; i < sizeof(double_values) / sizeof(double_values[0]); ++i) {
1804137ff4cSJacques Vidrine 	tot += try ("%f", double_values[i]);
1814137ff4cSJacques Vidrine 	tot += try ("%10f", double_values[i]);
1824137ff4cSJacques Vidrine 	tot += try ("%.2f", double_values[i]);
1834137ff4cSJacques Vidrine 	tot += try ("%7.0f", double_values[i]);
1844137ff4cSJacques Vidrine 	tot += try ("%5.2f", double_values[i]);
1854137ff4cSJacques Vidrine 	tot += try ("%0f", double_values[i]);
1864137ff4cSJacques Vidrine 	tot += try ("%#f", double_values[i]);
1874137ff4cSJacques Vidrine 	tot += try ("%e", double_values[i]);
1884137ff4cSJacques Vidrine 	tot += try ("%10e", double_values[i]);
1894137ff4cSJacques Vidrine 	tot += try ("%.2e", double_values[i]);
1904137ff4cSJacques Vidrine 	tot += try ("%7.0e", double_values[i]);
1914137ff4cSJacques Vidrine 	tot += try ("%5.2e", double_values[i]);
1924137ff4cSJacques Vidrine 	tot += try ("%0e", double_values[i]);
1934137ff4cSJacques Vidrine 	tot += try ("%#e", double_values[i]);
1944137ff4cSJacques Vidrine 	tot += try ("%E", double_values[i]);
1954137ff4cSJacques Vidrine 	tot += try ("%10E", double_values[i]);
1964137ff4cSJacques Vidrine 	tot += try ("%.2E", double_values[i]);
1974137ff4cSJacques Vidrine 	tot += try ("%7.0E", double_values[i]);
1984137ff4cSJacques Vidrine 	tot += try ("%5.2E", double_values[i]);
1994137ff4cSJacques Vidrine 	tot += try ("%0E", double_values[i]);
2004137ff4cSJacques Vidrine 	tot += try ("%#E", double_values[i]);
2014137ff4cSJacques Vidrine 	tot += try ("%g", double_values[i]);
2024137ff4cSJacques Vidrine 	tot += try ("%10g", double_values[i]);
2034137ff4cSJacques Vidrine 	tot += try ("%.2g", double_values[i]);
2044137ff4cSJacques Vidrine 	tot += try ("%7.0g", double_values[i]);
2054137ff4cSJacques Vidrine 	tot += try ("%5.2g", double_values[i]);
2064137ff4cSJacques Vidrine 	tot += try ("%0g", double_values[i]);
2074137ff4cSJacques Vidrine 	tot += try ("%#g", double_values[i]);
2084137ff4cSJacques Vidrine 	tot += try ("%G", double_values[i]);
2094137ff4cSJacques Vidrine 	tot += try ("%10G", double_values[i]);
2104137ff4cSJacques Vidrine 	tot += try ("%.2G", double_values[i]);
2114137ff4cSJacques Vidrine 	tot += try ("%7.0G", double_values[i]);
2124137ff4cSJacques Vidrine 	tot += try ("%5.2G", double_values[i]);
2134137ff4cSJacques Vidrine 	tot += try ("%0G", double_values[i]);
2144137ff4cSJacques Vidrine 	tot += try ("%#G", double_values[i]);
2154137ff4cSJacques Vidrine     }
2164137ff4cSJacques Vidrine     return tot;
2174137ff4cSJacques Vidrine }
2184137ff4cSJacques Vidrine #endif
2194137ff4cSJacques Vidrine 
2204137ff4cSJacques Vidrine static int
2214137ff4cSJacques Vidrine test_null (void)
2224137ff4cSJacques Vidrine {
2234137ff4cSJacques Vidrine     return snprintf (NULL, 0, "foo") != 3;
2244137ff4cSJacques Vidrine }
2254137ff4cSJacques Vidrine 
2264137ff4cSJacques Vidrine int
2274137ff4cSJacques Vidrine main (int argc, char **argv)
2284137ff4cSJacques Vidrine {
2294137ff4cSJacques Vidrine     int ret = 0;
2304137ff4cSJacques Vidrine 
2314137ff4cSJacques Vidrine     ret += cmp_with_sprintf_int ();
2324137ff4cSJacques Vidrine     ret += cmp_with_sprintf_long ();
2334137ff4cSJacques Vidrine #ifdef HAVE_LONG_LONG
2344137ff4cSJacques Vidrine     ret += cmp_with_sprintf_long_long ();
2354137ff4cSJacques Vidrine #endif
2364137ff4cSJacques Vidrine     ret += test_null ();
2374137ff4cSJacques Vidrine     return ret;
2384137ff4cSJacques Vidrine }
239