1 /* 2 * Copyright (c) 2000 - 2001 Kungliga Tekniska H�gskolan 3 * (Royal Institute of Technology, Stockholm, Sweden). 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 9 * 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 13 * 2. Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in the 15 * documentation and/or other materials provided with the distribution. 16 * 17 * 3. Neither the name of KTH nor the names of its contributors may be 18 * used to endorse or promote products derived from this software without 19 * specific prior written permission. 20 * 21 * THIS SOFTWARE IS PROVIDED BY KTH AND ITS CONTRIBUTORS ``AS IS'' AND ANY 22 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 24 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL KTH OR ITS CONTRIBUTORS BE 25 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 26 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 27 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 28 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 29 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 30 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 31 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ 32 33 #ifdef HAVE_CONFIG_H 34 #include <config.h> 35 #endif 36 #include "roken.h" 37 #include <limits.h> 38 39 #include "snprintf-test.h" 40 41 RCSID("$Id: snprintf-test.c,v 1.5 2001/09/13 01:01:16 assar Exp $"); 42 43 static int 44 try (const char *format, ...) 45 { 46 int ret; 47 va_list ap; 48 char buf1[256], buf2[256]; 49 50 va_start (ap, format); 51 ret = vsnprintf (buf1, sizeof(buf1), format, ap); 52 if (ret >= sizeof(buf1)) 53 errx (1, "increase buf and try again"); 54 vsprintf (buf2, format, ap); 55 ret = strcmp (buf1, buf2); 56 if (ret) 57 printf ("failed: format = \"%s\", \"%s\" != \"%s\"\n", 58 format, buf1, buf2); 59 va_end (ap); 60 return ret; 61 } 62 63 static int 64 cmp_with_sprintf_int (void) 65 { 66 int tot = 0; 67 int int_values[] = {INT_MIN, -17, -1, 0, 1, 17, 4711, 65535, INT_MAX}; 68 int i; 69 70 for (i = 0; i < sizeof(int_values) / sizeof(int_values[0]); ++i) { 71 tot += try ("%d", int_values[i]); 72 tot += try ("%x", int_values[i]); 73 tot += try ("%X", int_values[i]); 74 tot += try ("%o", int_values[i]); 75 tot += try ("%#x", int_values[i]); 76 tot += try ("%#X", int_values[i]); 77 tot += try ("%#o", int_values[i]); 78 tot += try ("%10d", int_values[i]); 79 tot += try ("%10x", int_values[i]); 80 tot += try ("%10X", int_values[i]); 81 tot += try ("%10o", int_values[i]); 82 tot += try ("%#10x", int_values[i]); 83 tot += try ("%#10X", int_values[i]); 84 tot += try ("%#10o", int_values[i]); 85 tot += try ("%-10d", int_values[i]); 86 tot += try ("%-10x", int_values[i]); 87 tot += try ("%-10X", int_values[i]); 88 tot += try ("%-10o", int_values[i]); 89 tot += try ("%-#10x", int_values[i]); 90 tot += try ("%-#10X", int_values[i]); 91 tot += try ("%-#10o", int_values[i]); 92 } 93 return tot; 94 } 95 96 static int 97 cmp_with_sprintf_long (void) 98 { 99 int tot = 0; 100 long long_values[] = {LONG_MIN, -17, -1, 0, 1, 17, 4711, 65535, LONG_MAX}; 101 int i; 102 103 for (i = 0; i < sizeof(long_values) / sizeof(long_values[0]); ++i) { 104 tot += try ("%ld", long_values[i]); 105 tot += try ("%lx", long_values[i]); 106 tot += try ("%lX", long_values[i]); 107 tot += try ("%lo", long_values[i]); 108 tot += try ("%#lx", long_values[i]); 109 tot += try ("%#lX", long_values[i]); 110 tot += try ("%#lo", long_values[i]); 111 tot += try ("%10ld", long_values[i]); 112 tot += try ("%10lx", long_values[i]); 113 tot += try ("%10lX", long_values[i]); 114 tot += try ("%10lo", long_values[i]); 115 tot += try ("%#10lx", long_values[i]); 116 tot += try ("%#10lX", long_values[i]); 117 tot += try ("%#10lo", long_values[i]); 118 tot += try ("%-10ld", long_values[i]); 119 tot += try ("%-10lx", long_values[i]); 120 tot += try ("%-10lX", long_values[i]); 121 tot += try ("%-10lo", long_values[i]); 122 tot += try ("%-#10lx", long_values[i]); 123 tot += try ("%-#10lX", long_values[i]); 124 tot += try ("%-#10lo", long_values[i]); 125 } 126 return tot; 127 } 128 129 #ifdef HAVE_LONG_LONG 130 131 static int 132 cmp_with_sprintf_long_long (void) 133 { 134 int tot = 0; 135 long long long_long_values[] = { 136 ((long long)LONG_MIN) -1, LONG_MIN, -17, -1, 137 0, 138 1, 17, 4711, 65535, LONG_MAX, ((long long)LONG_MAX) + 1}; 139 int i; 140 141 for (i = 0; i < sizeof(long_long_values) / sizeof(long_long_values[0]); ++i) { 142 tot += try ("%lld", long_long_values[i]); 143 tot += try ("%llx", long_long_values[i]); 144 tot += try ("%llX", long_long_values[i]); 145 tot += try ("%llo", long_long_values[i]); 146 tot += try ("%#llx", long_long_values[i]); 147 tot += try ("%#llX", long_long_values[i]); 148 tot += try ("%#llo", long_long_values[i]); 149 tot += try ("%10lld", long_long_values[i]); 150 tot += try ("%10llx", long_long_values[i]); 151 tot += try ("%10llX", long_long_values[i]); 152 tot += try ("%10llo", long_long_values[i]); 153 tot += try ("%#10llx", long_long_values[i]); 154 tot += try ("%#10llX", long_long_values[i]); 155 tot += try ("%#10llo", long_long_values[i]); 156 tot += try ("%-10lld", long_long_values[i]); 157 tot += try ("%-10llx", long_long_values[i]); 158 tot += try ("%-10llX", long_long_values[i]); 159 tot += try ("%-10llo", long_long_values[i]); 160 tot += try ("%-#10llx", long_long_values[i]); 161 tot += try ("%-#10llX", long_long_values[i]); 162 tot += try ("%-#10llo", long_long_values[i]); 163 } 164 return tot; 165 } 166 167 #endif 168 169 #if 0 170 static int 171 cmp_with_sprintf_float (void) 172 { 173 int tot = 0; 174 double double_values[] = {-99999, -999, -17.4, -4.3, -3.0, -1.5, -1, 175 0, 0.1, 0.2342374852, 0.2340007, 176 3.1415926, 14.7845, 34.24758, 9999, 9999999}; 177 int i; 178 179 for (i = 0; i < sizeof(double_values) / sizeof(double_values[0]); ++i) { 180 tot += try ("%f", double_values[i]); 181 tot += try ("%10f", double_values[i]); 182 tot += try ("%.2f", double_values[i]); 183 tot += try ("%7.0f", double_values[i]); 184 tot += try ("%5.2f", double_values[i]); 185 tot += try ("%0f", double_values[i]); 186 tot += try ("%#f", double_values[i]); 187 tot += try ("%e", double_values[i]); 188 tot += try ("%10e", double_values[i]); 189 tot += try ("%.2e", double_values[i]); 190 tot += try ("%7.0e", double_values[i]); 191 tot += try ("%5.2e", double_values[i]); 192 tot += try ("%0e", double_values[i]); 193 tot += try ("%#e", double_values[i]); 194 tot += try ("%E", double_values[i]); 195 tot += try ("%10E", double_values[i]); 196 tot += try ("%.2E", double_values[i]); 197 tot += try ("%7.0E", double_values[i]); 198 tot += try ("%5.2E", double_values[i]); 199 tot += try ("%0E", double_values[i]); 200 tot += try ("%#E", double_values[i]); 201 tot += try ("%g", double_values[i]); 202 tot += try ("%10g", double_values[i]); 203 tot += try ("%.2g", double_values[i]); 204 tot += try ("%7.0g", double_values[i]); 205 tot += try ("%5.2g", double_values[i]); 206 tot += try ("%0g", double_values[i]); 207 tot += try ("%#g", double_values[i]); 208 tot += try ("%G", double_values[i]); 209 tot += try ("%10G", double_values[i]); 210 tot += try ("%.2G", double_values[i]); 211 tot += try ("%7.0G", double_values[i]); 212 tot += try ("%5.2G", double_values[i]); 213 tot += try ("%0G", double_values[i]); 214 tot += try ("%#G", double_values[i]); 215 } 216 return tot; 217 } 218 #endif 219 220 static int 221 test_null (void) 222 { 223 return snprintf (NULL, 0, "foo") != 3; 224 } 225 226 int 227 main (int argc, char **argv) 228 { 229 int ret = 0; 230 231 ret += cmp_with_sprintf_int (); 232 ret += cmp_with_sprintf_long (); 233 #ifdef HAVE_LONG_LONG 234 ret += cmp_with_sprintf_long_long (); 235 #endif 236 ret += test_null (); 237 return ret; 238 } 239