1 //===-- Unittests for sprintf ---------------------------------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #include "src/stdio/sprintf.h" 10 11 #include "src/__support/FPUtil/FPBits.h" 12 #include "src/__support/FPUtil/PlatformDefs.h" 13 #include "utils/UnitTest/Test.h" 14 15 // Subtract 1 from sizeof(expected_str) to account for the null byte. 16 #define ASSERT_STREQ_LEN(actual_written, actual_str, expected_str) \ 17 EXPECT_EQ(actual_written, static_cast<int>(sizeof(expected_str) - 1)); \ 18 EXPECT_STREQ(actual_str, expected_str); 19 20 TEST(LlvmLibcSPrintfTest, SimpleNoConv) { 21 char buff[64]; 22 int written; 23 24 written = __llvm_libc::sprintf(buff, "A simple string with no conversions."); 25 EXPECT_EQ(written, 36); 26 ASSERT_STREQ(buff, "A simple string with no conversions."); 27 } 28 29 TEST(LlvmLibcSPrintfTest, PercentConv) { 30 char buff[64]; 31 int written; 32 33 written = __llvm_libc::sprintf(buff, "%%"); 34 EXPECT_EQ(written, 1); 35 ASSERT_STREQ(buff, "%"); 36 37 written = __llvm_libc::sprintf(buff, "abc %% def"); 38 EXPECT_EQ(written, 9); 39 ASSERT_STREQ(buff, "abc % def"); 40 41 written = __llvm_libc::sprintf(buff, "%%%%%%"); 42 EXPECT_EQ(written, 3); 43 ASSERT_STREQ(buff, "%%%"); 44 } 45 46 TEST(LlvmLibcSPrintfTest, CharConv) { 47 char buff[64]; 48 int written; 49 50 written = __llvm_libc::sprintf(buff, "%c", 'a'); 51 EXPECT_EQ(written, 1); 52 ASSERT_STREQ(buff, "a"); 53 54 written = __llvm_libc::sprintf(buff, "%3c %-3c", '1', '2'); 55 EXPECT_EQ(written, 7); 56 ASSERT_STREQ(buff, " 1 2 "); 57 58 written = __llvm_libc::sprintf(buff, "%*c", 2, '3'); 59 EXPECT_EQ(written, 2); 60 ASSERT_STREQ(buff, " 3"); 61 } 62 63 TEST(LlvmLibcSPrintfTest, StringConv) { 64 char buff[64]; 65 int written; 66 67 written = __llvm_libc::sprintf(buff, "%s", "abcDEF123"); 68 EXPECT_EQ(written, 9); 69 ASSERT_STREQ(buff, "abcDEF123"); 70 71 written = __llvm_libc::sprintf(buff, "%10s %-10s", "centered", "title"); 72 EXPECT_EQ(written, 21); 73 ASSERT_STREQ(buff, " centered title "); 74 75 written = __llvm_libc::sprintf(buff, "%-5.4s%-4.4s", "words can describe", 76 "soups most delicious"); 77 EXPECT_EQ(written, 9); 78 ASSERT_STREQ(buff, "word soup"); 79 80 written = __llvm_libc::sprintf(buff, "%*s %.*s %*.*s", 10, "beginning", 2, 81 "isn't", 12, 10, "important. Ever."); 82 EXPECT_EQ(written, 26); 83 ASSERT_STREQ(buff, " beginning is important."); 84 } 85 86 TEST(LlvmLibcSPrintfTest, IntConv) { 87 char buff[64]; 88 int written; 89 90 // Basic Tests. 91 92 written = __llvm_libc::sprintf(buff, "%d", 123); 93 EXPECT_EQ(written, 3); 94 ASSERT_STREQ(buff, "123"); 95 96 written = __llvm_libc::sprintf(buff, "%i", -456); 97 EXPECT_EQ(written, 4); 98 ASSERT_STREQ(buff, "-456"); 99 100 // Length Modifier Tests. 101 102 written = __llvm_libc::sprintf(buff, "%hhu", 257); // 0x101 103 EXPECT_EQ(written, 1); 104 ASSERT_STREQ(buff, "1"); 105 106 written = __llvm_libc::sprintf(buff, "%llu", 18446744073709551615ull); 107 EXPECT_EQ(written, 20); 108 ASSERT_STREQ(buff, "18446744073709551615"); // ull max 109 110 written = __llvm_libc::sprintf(buff, "%tu", ~ptrdiff_t(0)); 111 if (sizeof(ptrdiff_t) == 8) { 112 EXPECT_EQ(written, 20); 113 ASSERT_STREQ(buff, "18446744073709551615"); 114 } else if (sizeof(ptrdiff_t) == 4) { 115 EXPECT_EQ(written, 10); 116 ASSERT_STREQ(buff, "4294967296"); 117 } 118 119 written = __llvm_libc::sprintf(buff, "%lld", -9223372036854775807ll - 1ll); 120 EXPECT_EQ(written, 20); 121 ASSERT_STREQ(buff, "-9223372036854775808"); // ll min 122 123 // Min Width Tests. 124 125 written = __llvm_libc::sprintf(buff, "%4d", 789); 126 EXPECT_EQ(written, 4); 127 ASSERT_STREQ(buff, " 789"); 128 129 written = __llvm_libc::sprintf(buff, "%2d", 987); 130 EXPECT_EQ(written, 3); 131 ASSERT_STREQ(buff, "987"); 132 133 // Precision Tests. 134 135 written = __llvm_libc::sprintf(buff, "%d", 0); 136 EXPECT_EQ(written, 1); 137 ASSERT_STREQ(buff, "0"); 138 139 written = __llvm_libc::sprintf(buff, "%.0d", 0); 140 EXPECT_EQ(written, 0); 141 ASSERT_STREQ(buff, ""); 142 143 written = __llvm_libc::sprintf(buff, "%.5d", 654); 144 EXPECT_EQ(written, 5); 145 ASSERT_STREQ(buff, "00654"); 146 147 written = __llvm_libc::sprintf(buff, "%.5d", -321); 148 EXPECT_EQ(written, 6); 149 ASSERT_STREQ(buff, "-00321"); 150 151 written = __llvm_libc::sprintf(buff, "%.2d", 135); 152 EXPECT_EQ(written, 3); 153 ASSERT_STREQ(buff, "135"); 154 155 // Flag Tests. 156 157 written = __llvm_libc::sprintf(buff, "%.5d", -321); 158 EXPECT_EQ(written, 6); 159 ASSERT_STREQ(buff, "-00321"); 160 161 written = __llvm_libc::sprintf(buff, "%-5d", 246); 162 EXPECT_EQ(written, 5); 163 ASSERT_STREQ(buff, "246 "); 164 165 written = __llvm_libc::sprintf(buff, "%-5d", -147); 166 EXPECT_EQ(written, 5); 167 ASSERT_STREQ(buff, "-147 "); 168 169 written = __llvm_libc::sprintf(buff, "%+d", 258); 170 EXPECT_EQ(written, 4); 171 ASSERT_STREQ(buff, "+258"); 172 173 written = __llvm_libc::sprintf(buff, "% d", 369); 174 EXPECT_EQ(written, 4); 175 ASSERT_STREQ(buff, " 369"); 176 177 written = __llvm_libc::sprintf(buff, "%05d", 470); 178 EXPECT_EQ(written, 5); 179 ASSERT_STREQ(buff, "00470"); 180 181 written = __llvm_libc::sprintf(buff, "%05d", -581); 182 EXPECT_EQ(written, 5); 183 ASSERT_STREQ(buff, "-0581"); 184 185 // Combined Tests. 186 187 written = __llvm_libc::sprintf(buff, "%+ u", 692); 188 EXPECT_EQ(written, 3); 189 ASSERT_STREQ(buff, "692"); 190 191 written = __llvm_libc::sprintf(buff, "%+ -05d", 703); 192 EXPECT_EQ(written, 5); 193 ASSERT_STREQ(buff, "+703 "); 194 195 written = __llvm_libc::sprintf(buff, "%7.5d", 814); 196 EXPECT_EQ(written, 7); 197 ASSERT_STREQ(buff, " 00814"); 198 199 written = __llvm_libc::sprintf(buff, "%7.5d", -925); 200 EXPECT_EQ(written, 7); 201 ASSERT_STREQ(buff, " -00925"); 202 203 written = __llvm_libc::sprintf(buff, "%7.5d", 159); 204 EXPECT_EQ(written, 7); 205 ASSERT_STREQ(buff, " 00159"); 206 207 written = __llvm_libc::sprintf(buff, "% -7.5d", 260); 208 EXPECT_EQ(written, 7); 209 ASSERT_STREQ(buff, " 00260 "); 210 211 written = __llvm_libc::sprintf(buff, "%5.4d", 10000); 212 EXPECT_EQ(written, 5); 213 ASSERT_STREQ(buff, "10000"); 214 215 // Multiple Conversion Tests. 216 217 written = __llvm_libc::sprintf(buff, "%10d %-10d", 456, -789); 218 EXPECT_EQ(written, 21); 219 ASSERT_STREQ(buff, " 456 -789 "); 220 221 written = __llvm_libc::sprintf(buff, "%-5.4d%+.4u", 75, 25); 222 EXPECT_EQ(written, 9); 223 ASSERT_STREQ(buff, "0075 0025"); 224 225 written = __llvm_libc::sprintf(buff, "% 05hhi %+-0.5llu %-+ 06.3zd", 226 256 + 127, 68719476736ll, size_t(2)); 227 EXPECT_EQ(written, 24); 228 ASSERT_STREQ(buff, " 0127 68719476736 +002 "); 229 } 230 231 TEST(LlvmLibcSPrintfTest, HexConv) { 232 char buff[64]; 233 int written; 234 235 // Basic Tests. 236 237 written = __llvm_libc::sprintf(buff, "%x", 0x123a); 238 EXPECT_EQ(written, 4); 239 ASSERT_STREQ(buff, "123a"); 240 241 written = __llvm_libc::sprintf(buff, "%X", 0x456b); 242 EXPECT_EQ(written, 4); 243 ASSERT_STREQ(buff, "456B"); 244 245 // Length Modifier Tests. 246 247 written = __llvm_libc::sprintf(buff, "%hhx", 0x10001); 248 EXPECT_EQ(written, 1); 249 ASSERT_STREQ(buff, "1"); 250 251 written = __llvm_libc::sprintf(buff, "%llx", 0xffffffffffffffffull); 252 EXPECT_EQ(written, 16); 253 ASSERT_STREQ(buff, "ffffffffffffffff"); // ull max 254 255 written = __llvm_libc::sprintf(buff, "%tX", ~ptrdiff_t(0)); 256 if (sizeof(ptrdiff_t) == 8) { 257 EXPECT_EQ(written, 16); 258 ASSERT_STREQ(buff, "FFFFFFFFFFFFFFFF"); 259 } else if (sizeof(ptrdiff_t) == 4) { 260 EXPECT_EQ(written, 8); 261 ASSERT_STREQ(buff, "FFFFFFFF"); 262 } 263 264 // Min Width Tests. 265 266 written = __llvm_libc::sprintf(buff, "%4x", 0x789); 267 EXPECT_EQ(written, 4); 268 ASSERT_STREQ(buff, " 789"); 269 270 written = __llvm_libc::sprintf(buff, "%2X", 0x987); 271 EXPECT_EQ(written, 3); 272 ASSERT_STREQ(buff, "987"); 273 274 // Precision Tests. 275 276 written = __llvm_libc::sprintf(buff, "%x", 0); 277 EXPECT_EQ(written, 1); 278 ASSERT_STREQ(buff, "0"); 279 280 written = __llvm_libc::sprintf(buff, "%.0x", 0); 281 EXPECT_EQ(written, 0); 282 ASSERT_STREQ(buff, ""); 283 284 written = __llvm_libc::sprintf(buff, "%.5x", 0x1F3); 285 EXPECT_EQ(written, 5); 286 ASSERT_STREQ(buff, "001f3"); 287 288 written = __llvm_libc::sprintf(buff, "%.2x", 0x135); 289 EXPECT_EQ(written, 3); 290 ASSERT_STREQ(buff, "135"); 291 292 // Flag Tests. 293 294 written = __llvm_libc::sprintf(buff, "%-5x", 0x246); 295 EXPECT_EQ(written, 5); 296 ASSERT_STREQ(buff, "246 "); 297 298 written = __llvm_libc::sprintf(buff, "%#x", 0xd3f); 299 EXPECT_EQ(written, 5); 300 ASSERT_STREQ(buff, "0xd3f"); 301 302 written = __llvm_libc::sprintf(buff, "%#X", 0xE40); 303 EXPECT_EQ(written, 5); 304 ASSERT_STREQ(buff, "0XE40"); 305 306 written = __llvm_libc::sprintf(buff, "%05x", 0x470); 307 EXPECT_EQ(written, 5); 308 ASSERT_STREQ(buff, "00470"); 309 310 written = __llvm_libc::sprintf(buff, "%0#6x", 0x8c3); 311 EXPECT_EQ(written, 6); 312 ASSERT_STREQ(buff, "0x08c3"); 313 314 written = __llvm_libc::sprintf(buff, "%-#6x", 0x5f0); 315 EXPECT_EQ(written, 6); 316 ASSERT_STREQ(buff, "0x5f0 "); 317 318 // Combined Tests. 319 320 written = __llvm_libc::sprintf(buff, "%#-07x", 0x703); 321 EXPECT_EQ(written, 7); 322 ASSERT_STREQ(buff, "0x703 "); 323 324 written = __llvm_libc::sprintf(buff, "%7.5x", 0x814); 325 EXPECT_EQ(written, 7); 326 ASSERT_STREQ(buff, " 00814"); 327 328 written = __llvm_libc::sprintf(buff, "%#9.5X", 0x9d4); 329 EXPECT_EQ(written, 9); 330 ASSERT_STREQ(buff, " 0X009D4"); 331 332 written = __llvm_libc::sprintf(buff, "%-7.5x", 0x260); 333 EXPECT_EQ(written, 7); 334 ASSERT_STREQ(buff, "00260 "); 335 336 written = __llvm_libc::sprintf(buff, "%5.4x", 0x10000); 337 EXPECT_EQ(written, 5); 338 ASSERT_STREQ(buff, "10000"); 339 340 // Multiple Conversion Tests. 341 342 written = __llvm_libc::sprintf(buff, "%10X %-#10x", 0x45b, 0x789); 343 EXPECT_EQ(written, 21); 344 ASSERT_STREQ(buff, " 45B 0x789 "); 345 346 written = __llvm_libc::sprintf(buff, "%-5.4x%#.4x", 0x75, 0x25); 347 EXPECT_EQ(written, 11); 348 ASSERT_STREQ(buff, "0075 0x0025"); 349 350 written = __llvm_libc::sprintf(buff, "%04hhX %#.5llx %-6.3zX", 256 + 0x7f, 351 0x1000000000ll, size_t(2)); 352 EXPECT_EQ(written, 24); 353 ASSERT_STREQ(buff, "007F 0x1000000000 002 "); 354 } 355 356 TEST(LlvmLibcSPrintfTest, PointerConv) { 357 char buff[64]; 358 int written; 359 360 written = __llvm_libc::sprintf(buff, "%p", nullptr); 361 EXPECT_EQ(written, 9); 362 ASSERT_STREQ(buff, "(nullptr)"); 363 364 written = __llvm_libc::sprintf(buff, "%p", 0x1a2b3c4d); 365 EXPECT_EQ(written, 10); 366 ASSERT_STREQ(buff, "0x1a2b3c4d"); 367 368 written = __llvm_libc::sprintf(buff, "%p", buff); 369 EXPECT_GT(written, 0); 370 } 371 372 TEST(LlvmLibcSPrintfTest, OctConv) { 373 char buff[64]; 374 int written; 375 376 // Basic Tests. 377 378 written = __llvm_libc::sprintf(buff, "%o", 01234); 379 EXPECT_EQ(written, 4); 380 ASSERT_STREQ(buff, "1234"); 381 382 written = __llvm_libc::sprintf(buff, "%o", 04567); 383 EXPECT_EQ(written, 4); 384 ASSERT_STREQ(buff, "4567"); 385 386 // Length Modifier Tests. 387 388 written = __llvm_libc::sprintf(buff, "%hho", 0401); 389 EXPECT_EQ(written, 1); 390 ASSERT_STREQ(buff, "1"); 391 392 written = __llvm_libc::sprintf(buff, "%llo", 01777777777777777777777ull); 393 EXPECT_EQ(written, 22); 394 ASSERT_STREQ(buff, "1777777777777777777777"); // ull max 395 396 written = __llvm_libc::sprintf(buff, "%to", ~ptrdiff_t(0)); 397 if (sizeof(ptrdiff_t) == 8) { 398 EXPECT_EQ(written, 22); 399 ASSERT_STREQ(buff, "1777777777777777777777"); 400 } else if (sizeof(ptrdiff_t) == 4) { 401 EXPECT_EQ(written, 11); 402 ASSERT_STREQ(buff, "37777777777"); 403 } 404 405 // Min Width Tests. 406 407 written = __llvm_libc::sprintf(buff, "%4o", 0701); 408 EXPECT_EQ(written, 4); 409 ASSERT_STREQ(buff, " 701"); 410 411 written = __llvm_libc::sprintf(buff, "%2o", 0107); 412 EXPECT_EQ(written, 3); 413 ASSERT_STREQ(buff, "107"); 414 415 // Precision Tests. 416 417 written = __llvm_libc::sprintf(buff, "%o", 0); 418 EXPECT_EQ(written, 1); 419 ASSERT_STREQ(buff, "0"); 420 421 written = __llvm_libc::sprintf(buff, "%.0o", 0); 422 EXPECT_EQ(written, 0); 423 ASSERT_STREQ(buff, ""); 424 425 written = __llvm_libc::sprintf(buff, "%.5o", 0153); 426 EXPECT_EQ(written, 5); 427 ASSERT_STREQ(buff, "00153"); 428 429 written = __llvm_libc::sprintf(buff, "%.2o", 0135); 430 EXPECT_EQ(written, 3); 431 ASSERT_STREQ(buff, "135"); 432 433 // Flag Tests. 434 435 written = __llvm_libc::sprintf(buff, "%-5o", 0246); 436 EXPECT_EQ(written, 5); 437 ASSERT_STREQ(buff, "246 "); 438 439 written = __llvm_libc::sprintf(buff, "%#o", 0234); 440 EXPECT_EQ(written, 4); 441 ASSERT_STREQ(buff, "0234"); 442 443 written = __llvm_libc::sprintf(buff, "%05o", 0470); 444 EXPECT_EQ(written, 5); 445 ASSERT_STREQ(buff, "00470"); 446 447 written = __llvm_libc::sprintf(buff, "%0#6o", 0753); 448 EXPECT_EQ(written, 6); 449 ASSERT_STREQ(buff, "000753"); 450 451 written = __llvm_libc::sprintf(buff, "%-#6o", 0642); 452 EXPECT_EQ(written, 6); 453 ASSERT_STREQ(buff, "0642 "); 454 455 // Combined Tests. 456 457 written = __llvm_libc::sprintf(buff, "%#-07o", 0703); 458 EXPECT_EQ(written, 7); 459 ASSERT_STREQ(buff, "0703 "); 460 461 written = __llvm_libc::sprintf(buff, "%7.5o", 0314); 462 EXPECT_EQ(written, 7); 463 ASSERT_STREQ(buff, " 00314"); 464 465 written = __llvm_libc::sprintf(buff, "%#9.5o", 0234); 466 EXPECT_EQ(written, 9); 467 ASSERT_STREQ(buff, " 00234"); 468 469 written = __llvm_libc::sprintf(buff, "%-7.5o", 0260); 470 EXPECT_EQ(written, 7); 471 ASSERT_STREQ(buff, "00260 "); 472 473 written = __llvm_libc::sprintf(buff, "%5.4o", 010000); 474 EXPECT_EQ(written, 5); 475 ASSERT_STREQ(buff, "10000"); 476 477 // Multiple Conversion Tests. 478 479 written = __llvm_libc::sprintf(buff, "%10o %-#10o", 0456, 0123); 480 EXPECT_EQ(written, 21); 481 ASSERT_STREQ(buff, " 456 0123 "); 482 483 written = __llvm_libc::sprintf(buff, "%-5.4o%#.4o", 075, 025); 484 EXPECT_EQ(written, 9); 485 ASSERT_STREQ(buff, "0075 0025"); 486 487 written = __llvm_libc::sprintf(buff, "%04hho %#.5llo %-6.3zo", 256 + 077, 488 01000000000000ll, size_t(2)); 489 EXPECT_EQ(written, 26); 490 ASSERT_STREQ(buff, "0077 01000000000000 002 "); 491 } 492 493 #ifndef LLVM_LIBC_PRINTF_DISABLE_FLOAT 494 TEST(LlvmLibcSPrintfTest, FloatHexExpConv) { 495 char buff[64]; 496 int written; 497 double inf = __llvm_libc::fputil::FPBits<double>::inf().get_val(); 498 double nan = __llvm_libc::fputil::FPBits<double>::build_nan(1); 499 500 written = __llvm_libc::sprintf(buff, "%a", 1.0); 501 ASSERT_STREQ_LEN(written, buff, "0x1p+0"); 502 503 written = __llvm_libc::sprintf(buff, "%A", -1.0); 504 ASSERT_STREQ_LEN(written, buff, "-0X1P+0"); 505 506 written = __llvm_libc::sprintf(buff, "%a", -0x1.abcdef12345p0); 507 ASSERT_STREQ_LEN(written, buff, "-0x1.abcdef12345p+0"); 508 509 written = __llvm_libc::sprintf(buff, "%A", 0x1.abcdef12345p0); 510 ASSERT_STREQ_LEN(written, buff, "0X1.ABCDEF12345P+0"); 511 512 written = __llvm_libc::sprintf(buff, "%a", 0.0); 513 ASSERT_STREQ_LEN(written, buff, "0x0p+0"); 514 515 written = __llvm_libc::sprintf(buff, "%a", 1.0e100); 516 ASSERT_STREQ_LEN(written, buff, "0x1.249ad2594c37dp+332"); 517 518 written = __llvm_libc::sprintf(buff, "%a", 0.1); 519 ASSERT_STREQ_LEN(written, buff, "0x1.999999999999ap-4"); 520 521 // Subnormal Tests. 522 523 written = __llvm_libc::sprintf(buff, "%a", 0x1.0p-1027); 524 ASSERT_STREQ_LEN(written, buff, "0x0.08p-1022"); 525 526 written = __llvm_libc::sprintf(buff, "%a", 0x1.0p-1025); 527 ASSERT_STREQ_LEN(written, buff, "0x0.2p-1022"); 528 529 written = __llvm_libc::sprintf(buff, "%a", 0x1.0p-1023); 530 ASSERT_STREQ_LEN(written, buff, "0x0.8p-1022"); 531 532 written = __llvm_libc::sprintf(buff, "%a", 0x1.0p-1022); 533 ASSERT_STREQ_LEN(written, buff, "0x1p-1022"); 534 535 written = __llvm_libc::sprintf(buff, "%a", 0x1.0p-1074); 536 ASSERT_STREQ_LEN(written, buff, "0x0.0000000000001p-1022"); 537 538 // Inf/Nan Tests. 539 540 written = __llvm_libc::sprintf(buff, "%a", inf); 541 ASSERT_STREQ_LEN(written, buff, "inf"); 542 543 written = __llvm_libc::sprintf(buff, "%A", -inf); 544 ASSERT_STREQ_LEN(written, buff, "-INF"); 545 546 written = __llvm_libc::sprintf(buff, "%a", nan); 547 ASSERT_STREQ_LEN(written, buff, "nan"); 548 549 written = __llvm_libc::sprintf(buff, "%A", -nan); 550 ASSERT_STREQ_LEN(written, buff, "-NAN"); 551 552 // Length Modifier Tests. 553 554 written = __llvm_libc::sprintf(buff, "%La", 0.1L); 555 #if defined(SPECIAL_X86_LONG_DOUBLE) 556 ASSERT_STREQ_LEN(written, buff, "0xc.ccccccccccccccdp-7"); 557 #elif defined(LONG_DOUBLE_IS_DOUBLE) 558 ASSERT_STREQ_LEN(written, buff, "0x1.999999999999ap-4"); 559 #else // 128 bit long double 560 ASSERT_STREQ_LEN(written, buff, "0x1.999999999999999999999999999ap-4"); 561 #endif 562 563 written = __llvm_libc::sprintf(buff, "%La", 1.0e1000L); 564 #if defined(SPECIAL_X86_LONG_DOUBLE) 565 ASSERT_STREQ_LEN(written, buff, "0xf.38db1f9dd3dac05p+3318"); 566 #elif defined(LONG_DOUBLE_IS_DOUBLE) 567 ASSERT_STREQ_LEN(written, buff, "inf"); 568 #else // 128 bit long double 569 ASSERT_STREQ_LEN(written, buff, "0x1.e71b63f3ba7b580af1a52d2a7379p+3321"); 570 #endif 571 572 written = __llvm_libc::sprintf(buff, "%La", 1.0e-1000L); 573 #if defined(SPECIAL_X86_LONG_DOUBLE) 574 ASSERT_STREQ_LEN(written, buff, "0x8.68a9188a89e1467p-3325"); 575 #elif defined(LONG_DOUBLE_IS_DOUBLE) 576 ASSERT_STREQ_LEN(written, buff, "0x0p+0"); 577 #else // 128 bit long double 578 ASSERT_STREQ_LEN(written, buff, "0x1.0d152311513c28ce202627c06ec2p-3322"); 579 #endif 580 581 // Min Width Tests. 582 583 written = __llvm_libc::sprintf(buff, "%15a", 1.0); 584 ASSERT_STREQ_LEN(written, buff, " 0x1p+0"); 585 586 written = __llvm_libc::sprintf(buff, "%15a", -1.0); 587 ASSERT_STREQ_LEN(written, buff, " -0x1p+0"); 588 589 written = __llvm_libc::sprintf(buff, "%15a", 1.0e10); 590 ASSERT_STREQ_LEN(written, buff, " 0x1.2a05f2p+33"); 591 592 written = __llvm_libc::sprintf(buff, "%15a", -1.0e10); 593 ASSERT_STREQ_LEN(written, buff, "-0x1.2a05f2p+33"); 594 595 written = __llvm_libc::sprintf(buff, "%10a", 1.0e10); 596 ASSERT_STREQ_LEN(written, buff, "0x1.2a05f2p+33"); 597 598 written = __llvm_libc::sprintf(buff, "%5a", inf); 599 ASSERT_STREQ_LEN(written, buff, " inf"); 600 601 written = __llvm_libc::sprintf(buff, "%5a", -nan); 602 ASSERT_STREQ_LEN(written, buff, " -nan"); 603 604 // Precision Tests. 605 606 written = __llvm_libc::sprintf(buff, "%.1a", 1.0); 607 ASSERT_STREQ_LEN(written, buff, "0x1.0p+0"); 608 609 written = __llvm_libc::sprintf(buff, "%.1a", 0.0); 610 ASSERT_STREQ_LEN(written, buff, "0x0.0p+0"); 611 612 written = __llvm_libc::sprintf(buff, "%.1a", 0.1); 613 ASSERT_STREQ_LEN(written, buff, "0x1.ap-4"); 614 615 written = __llvm_libc::sprintf(buff, "%.1a", 0x1.0fp0); 616 ASSERT_STREQ_LEN(written, buff, "0x1.1p+0"); 617 618 written = __llvm_libc::sprintf(buff, "%.1a", 0x1.07p0); 619 ASSERT_STREQ_LEN(written, buff, "0x1.0p+0"); 620 621 written = __llvm_libc::sprintf(buff, "%.1a", 0x1.08p0); 622 ASSERT_STREQ_LEN(written, buff, "0x1.0p+0"); 623 624 written = __llvm_libc::sprintf(buff, "%.1a", 0x1.18p0); 625 ASSERT_STREQ_LEN(written, buff, "0x1.2p+0"); 626 627 written = __llvm_libc::sprintf(buff, "%.1a", 0x1.ffp0); 628 ASSERT_STREQ_LEN(written, buff, "0x2.0p+0"); 629 630 written = __llvm_libc::sprintf(buff, "%.5a", 1.25); 631 ASSERT_STREQ_LEN(written, buff, "0x1.40000p+0"); 632 633 written = __llvm_libc::sprintf(buff, "%.0a", 1.25); 634 ASSERT_STREQ_LEN(written, buff, "0x1p+0"); 635 636 written = __llvm_libc::sprintf(buff, "%.0a", 1.75); 637 ASSERT_STREQ_LEN(written, buff, "0x2p+0"); 638 639 written = __llvm_libc::sprintf(buff, "%.1a", 0x1.0p-1023); 640 ASSERT_STREQ_LEN(written, buff, "0x0.8p-1022"); 641 642 written = __llvm_libc::sprintf(buff, "%.1a", 0x1.8p-1023); 643 ASSERT_STREQ_LEN(written, buff, "0x0.cp-1022"); 644 645 written = __llvm_libc::sprintf(buff, "%.1a", 0x1.0p-1024); 646 ASSERT_STREQ_LEN(written, buff, "0x0.4p-1022"); 647 648 written = __llvm_libc::sprintf(buff, "%.0a", 0x1.0p-1023); 649 ASSERT_STREQ_LEN(written, buff, "0x0p-1022"); 650 651 written = __llvm_libc::sprintf(buff, "%.0a", 0x1.8p-1023); 652 ASSERT_STREQ_LEN(written, buff, "0x1p-1022"); 653 654 written = __llvm_libc::sprintf(buff, "%.0a", 0x1.0p-1024); 655 ASSERT_STREQ_LEN(written, buff, "0x0p-1022"); 656 657 written = __llvm_libc::sprintf(buff, "%.2a", 0x1.0p-1027); 658 ASSERT_STREQ_LEN(written, buff, "0x0.08p-1022"); 659 660 written = __llvm_libc::sprintf(buff, "%.1a", 0x1.0p-1027); 661 ASSERT_STREQ_LEN(written, buff, "0x0.0p-1022"); 662 663 written = __llvm_libc::sprintf(buff, "%.5a", 0.0); 664 ASSERT_STREQ_LEN(written, buff, "0x0.00000p+0"); 665 666 written = __llvm_libc::sprintf(buff, "%.5a", 0x1.008p0); 667 ASSERT_STREQ_LEN(written, buff, "0x1.00800p+0"); 668 669 written = __llvm_libc::sprintf(buff, "%.5a", 0x1.008p10); 670 ASSERT_STREQ_LEN(written, buff, "0x1.00800p+10"); 671 672 written = __llvm_libc::sprintf(buff, "%.5a", nan); 673 ASSERT_STREQ_LEN(written, buff, "nan"); 674 675 written = __llvm_libc::sprintf(buff, "%.1La", 0.1L); 676 #if defined(SPECIAL_X86_LONG_DOUBLE) 677 ASSERT_STREQ_LEN(written, buff, "0xc.dp-7"); 678 #elif defined(LONG_DOUBLE_IS_DOUBLE) 679 ASSERT_STREQ_LEN(written, buff, "0x1.ap-4"); 680 #else // 128 bit long double 681 ASSERT_STREQ_LEN(written, buff, "0x1.ap-4"); 682 #endif 683 684 written = __llvm_libc::sprintf(buff, "%.1La", 0xf.fffffffffffffffp16380L); 685 #if defined(SPECIAL_X86_LONG_DOUBLE) 686 ASSERT_STREQ_LEN(written, buff, "0x1.0p+16384"); 687 #elif defined(LONG_DOUBLE_IS_DOUBLE) 688 ASSERT_STREQ_LEN(written, buff, "inf"); 689 #else // 128 bit long double 690 ASSERT_STREQ_LEN(written, buff, "0x2.0p+16383"); 691 #endif 692 693 // Flag Tests. 694 695 written = __llvm_libc::sprintf(buff, "%+a", nan); 696 ASSERT_STREQ_LEN(written, buff, "+nan"); 697 698 written = __llvm_libc::sprintf(buff, "% A", inf); 699 ASSERT_STREQ_LEN(written, buff, " INF"); 700 701 written = __llvm_libc::sprintf(buff, "%-5a", inf); 702 ASSERT_STREQ_LEN(written, buff, "inf "); 703 704 written = __llvm_libc::sprintf(buff, "%+-5A", nan); 705 ASSERT_STREQ_LEN(written, buff, "+NAN "); 706 707 written = __llvm_libc::sprintf(buff, "%+a", 1.0); 708 ASSERT_STREQ_LEN(written, buff, "+0x1p+0"); 709 710 written = __llvm_libc::sprintf(buff, "% a", 0.0); 711 ASSERT_STREQ_LEN(written, buff, " 0x0p+0"); 712 713 written = __llvm_libc::sprintf(buff, "%-10a", 1.5); 714 ASSERT_STREQ_LEN(written, buff, "0x1.8p+0 "); 715 716 written = __llvm_libc::sprintf(buff, "%#a", 1.0); 717 ASSERT_STREQ_LEN(written, buff, "0x1.p+0"); 718 719 written = __llvm_libc::sprintf(buff, "%#.0a", 1.5); 720 ASSERT_STREQ_LEN(written, buff, "0x2.p+0"); 721 722 written = __llvm_libc::sprintf(buff, "%010a", 1.5); 723 ASSERT_STREQ_LEN(written, buff, "0x001.8p+0"); 724 725 written = __llvm_libc::sprintf(buff, "%+- #0a", 0.0); 726 ASSERT_STREQ_LEN(written, buff, "+0x0.p+0"); 727 728 // Combined Tests. 729 730 written = __llvm_libc::sprintf(buff, "%12.3a %-12.3A", 0.1, 256.0); 731 ASSERT_STREQ_LEN(written, buff, " 0x1.99ap-4 0X1.000P+8 "); 732 733 written = __llvm_libc::sprintf(buff, "%+-#12.3a % 012.3a", 0.1256, 1256.0); 734 ASSERT_STREQ_LEN(written, buff, "+0x1.014p-3 0x1.3a0p+10"); 735 } 736 #endif // LLVM_LIBC_PRINTF_DISABLE_FLOAT 737 738 #ifndef LLVM_LIBC_PRINTF_DISABLE_WRITE_INT 739 TEST(LlvmLibcSPrintfTest, WriteIntConv) { 740 char buff[64]; 741 int written; 742 int test_val = -1; 743 744 test_val = -1; 745 written = __llvm_libc::sprintf(buff, "12345%n67890", &test_val); 746 EXPECT_EQ(written, 10); 747 EXPECT_EQ(test_val, 5); 748 ASSERT_STREQ(buff, "1234567890"); 749 750 test_val = -1; 751 written = __llvm_libc::sprintf(buff, "%n", &test_val); 752 EXPECT_EQ(written, 0); 753 EXPECT_EQ(test_val, 0); 754 ASSERT_STREQ(buff, ""); 755 756 test_val = 0x100; 757 written = __llvm_libc::sprintf(buff, "ABC%hhnDEF", &test_val); 758 EXPECT_EQ(written, 6); 759 EXPECT_EQ(test_val, 0x103); 760 ASSERT_STREQ(buff, "ABCDEF"); 761 762 test_val = -1; 763 written = __llvm_libc::sprintf(buff, "%s%n", "87654321", &test_val); 764 EXPECT_EQ(written, 8); 765 EXPECT_EQ(test_val, 8); 766 ASSERT_STREQ(buff, "87654321"); 767 768 written = __llvm_libc::sprintf(buff, "abc123%n", nullptr); 769 EXPECT_LT(written, 0); 770 } 771 #endif // LLVM_LIBC_PRINTF_DISABLE_WRITE_INT 772 773 #ifndef LLVM_LIBC_PRINTF_DISABLE_INDEX_MODE 774 TEST(LlvmLibcSPrintfTest, IndexModeParsing) { 775 char buff[64]; 776 int written; 777 778 written = __llvm_libc::sprintf(buff, "%1$s", "abcDEF123"); 779 EXPECT_EQ(written, 9); 780 ASSERT_STREQ(buff, "abcDEF123"); 781 782 written = __llvm_libc::sprintf(buff, "%1$s %%", "abcDEF123"); 783 EXPECT_EQ(written, 11); 784 ASSERT_STREQ(buff, "abcDEF123 %"); 785 786 written = 787 __llvm_libc::sprintf(buff, "%3$s %1$s %2$s", "is", "hard", "ordering"); 788 EXPECT_EQ(written, 16); 789 ASSERT_STREQ(buff, "ordering is hard"); 790 791 written = __llvm_libc::sprintf( 792 buff, "%10$s %9$s %8$c %7$s %6$s, %6$s %5$s %4$-*1$s %3$.*11$s %2$s. %%", 793 6, "pain", "alphabetical", "such", "is", "this", "do", 'u', "would", 794 "why", 1); 795 EXPECT_EQ(written, 45); 796 ASSERT_STREQ(buff, "why would u do this, this is such a pain. %"); 797 } 798 #endif // LLVM_LIBC_PRINTF_DISABLE_INDEX_MODE 799