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