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