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/__support/macros/config.h" 10 #include "src/stdio/sprintf.h" 11 12 #include "src/__support/FPUtil/FPBits.h" 13 #include "src/errno/libc_errno.h" 14 #include "test/UnitTest/RoundingModeUtils.h" 15 #include "test/UnitTest/Test.h" 16 #include <inttypes.h> 17 18 // TODO: Add a comment here explaining the printf format string. 19 20 // #include <stdio.h> 21 // namespace LIBC_NAMESPACE_DECL { 22 // using ::sprintf; 23 // } 24 25 using LIBC_NAMESPACE::fputil::testing::ForceRoundingMode; 26 using LIBC_NAMESPACE::fputil::testing::RoundingMode; 27 28 // Subtract 1 from sizeof(expected_str) to account for the null byte. 29 #define ASSERT_STREQ_LEN(actual_written, actual_str, expected_str) \ 30 EXPECT_EQ(actual_written, static_cast<int>(sizeof(expected_str) - 1)); \ 31 EXPECT_STREQ(actual_str, expected_str); 32 33 #define macro_test(FMT, X, expected) \ 34 do { \ 35 for (char &c : buff) { \ 36 c = 0; \ 37 } \ 38 written = LIBC_NAMESPACE::sprintf(buff, "%" FMT, X); \ 39 ASSERT_STREQ_LEN(written, buff, expected); \ 40 } while (0) 41 42 TEST(LlvmLibcSPrintfTest, Macros) { 43 char buff[128]; 44 int written; 45 macro_test(PRIu8, 1, "1"); 46 macro_test(PRIX16, 0xAA, "AA"); 47 macro_test(PRId32, -123, "-123"); 48 macro_test(PRIX32, 0xFFFFFF85, "FFFFFF85"); 49 macro_test(PRIo8, 0xFF, "377"); 50 macro_test(PRIo64, 0123456712345671234567ll, "123456712345671234567"); 51 } 52 53 TEST(LlvmLibcSPrintfTest, SimpleNoConv) { 54 char buff[64]; 55 int written; 56 57 written = 58 LIBC_NAMESPACE::sprintf(buff, "A simple string with no conversions."); 59 ASSERT_STREQ_LEN(written, buff, "A simple string with no conversions."); 60 } 61 62 TEST(LlvmLibcSPrintfTest, PercentConv) { 63 char buff[64]; 64 int written; 65 66 written = LIBC_NAMESPACE::sprintf(buff, "%%"); 67 ASSERT_STREQ_LEN(written, buff, "%"); 68 69 written = LIBC_NAMESPACE::sprintf(buff, "abc %% def"); 70 ASSERT_STREQ_LEN(written, buff, "abc % def"); 71 72 written = LIBC_NAMESPACE::sprintf(buff, "%%%%%%"); 73 ASSERT_STREQ_LEN(written, buff, "%%%"); 74 } 75 76 TEST(LlvmLibcSPrintfTest, CharConv) { 77 char buff[64]; 78 int written; 79 80 written = LIBC_NAMESPACE::sprintf(buff, "%c", 'a'); 81 ASSERT_STREQ_LEN(written, buff, "a"); 82 83 written = LIBC_NAMESPACE::sprintf(buff, "%3c %-3c", '1', '2'); 84 ASSERT_STREQ_LEN(written, buff, " 1 2 "); 85 86 written = LIBC_NAMESPACE::sprintf(buff, "%*c", 2, '3'); 87 ASSERT_STREQ_LEN(written, buff, " 3"); 88 } 89 90 TEST(LlvmLibcSPrintfTest, StringConv) { 91 char buff[64]; 92 int written; 93 94 written = LIBC_NAMESPACE::sprintf(buff, "%s", "abcDEF123"); 95 ASSERT_STREQ_LEN(written, buff, "abcDEF123"); 96 97 written = LIBC_NAMESPACE::sprintf(buff, "%10s %-10s", "centered", "title"); 98 ASSERT_STREQ_LEN(written, buff, " centered title "); 99 100 written = LIBC_NAMESPACE::sprintf(buff, "%-5.4s%-4.4s", "words can describe", 101 "soups most delicious"); 102 ASSERT_STREQ_LEN(written, buff, "word soup"); 103 104 written = LIBC_NAMESPACE::sprintf(buff, "%*s %.*s %*.*s", 10, "beginning", 2, 105 "isn't", 12, 10, "important. Ever."); 106 ASSERT_STREQ_LEN(written, buff, " beginning is important."); 107 108 #ifndef LIBC_COPT_PRINTF_NO_NULLPTR_CHECKS 109 written = LIBC_NAMESPACE::sprintf(buff, "%s", nullptr); 110 ASSERT_STREQ_LEN(written, buff, "(null)"); 111 #endif // LIBC_COPT_PRINTF_NO_NULLPTR_CHECKS 112 } 113 114 TEST(LlvmLibcSPrintfTest, IntConv) { 115 char buff[64]; 116 int written; 117 118 // Basic Tests. 119 120 written = LIBC_NAMESPACE::sprintf(buff, "%d", 123); 121 ASSERT_STREQ_LEN(written, buff, "123"); 122 123 written = LIBC_NAMESPACE::sprintf(buff, "%i", -456); 124 ASSERT_STREQ_LEN(written, buff, "-456"); 125 126 // Length Modifier Tests. 127 128 written = LIBC_NAMESPACE::sprintf(buff, "%hhu", 257); // 0x101 129 ASSERT_STREQ_LEN(written, buff, "1"); 130 131 written = LIBC_NAMESPACE::sprintf(buff, "%llu", 18446744073709551615ull); 132 ASSERT_STREQ_LEN(written, buff, "18446744073709551615"); // ull max 133 134 written = LIBC_NAMESPACE::sprintf(buff, "%u", ~0); 135 if (sizeof(int) == 4) { 136 ASSERT_STREQ_LEN(written, buff, "4294967295"); 137 } 138 139 written = LIBC_NAMESPACE::sprintf(buff, "%tu", ~ptrdiff_t(0)); 140 if (sizeof(ptrdiff_t) == 8) { 141 ASSERT_STREQ_LEN(written, buff, "18446744073709551615"); 142 } else if (sizeof(ptrdiff_t) == 4) { 143 ASSERT_STREQ_LEN(written, buff, "4294967295"); 144 } 145 146 written = LIBC_NAMESPACE::sprintf(buff, "%lld", -9223372036854775807ll - 1ll); 147 ASSERT_STREQ_LEN(written, buff, "-9223372036854775808"); // ll min 148 149 written = LIBC_NAMESPACE::sprintf(buff, "%w3d", 5807); 150 ASSERT_STREQ_LEN(written, buff, "7"); 151 152 written = LIBC_NAMESPACE::sprintf(buff, "%w3d", 1); 153 ASSERT_STREQ_LEN(written, buff, "1"); 154 155 written = LIBC_NAMESPACE::sprintf(buff, "%w64d", 9223372036854775807ll); 156 ASSERT_STREQ_LEN(written, buff, "9223372036854775807"); 157 158 written = LIBC_NAMESPACE::sprintf(buff, "%w-1d", 5807); 159 ASSERT_STREQ_LEN(written, buff, "%w-1d"); 160 161 written = LIBC_NAMESPACE::sprintf(buff, "%w0d", 5807); 162 ASSERT_STREQ_LEN(written, buff, "%w0d"); 163 164 written = LIBC_NAMESPACE::sprintf(buff, "%w999d", 9223372036854775807ll); 165 ASSERT_STREQ_LEN(written, buff, "9223372036854775807"); 166 167 written = LIBC_NAMESPACE::sprintf(buff, "%winvalid%w1d", 5807, 5807); 168 ASSERT_STREQ_LEN(written, buff, "%winvalid1"); 169 170 written = LIBC_NAMESPACE::sprintf(buff, "%w-1d%w1d", 5807, 5807); 171 ASSERT_STREQ_LEN(written, buff, "%w-1d1"); 172 173 char format[64]; 174 char uintmax[128]; 175 LIBC_NAMESPACE::sprintf(format, "%%w%du", sizeof(uintmax_t) * CHAR_BIT); 176 const int uintmax_len = 177 LIBC_NAMESPACE::sprintf(uintmax, "%ju", sizeof(uintmax_t) * CHAR_BIT); 178 written = LIBC_NAMESPACE::sprintf(buff, format, sizeof(uintmax_t) * CHAR_BIT); 179 EXPECT_EQ(written, uintmax_len); 180 ASSERT_STREQ(buff, uintmax); 181 182 written = LIBC_NAMESPACE::sprintf(buff, "%w64u", 18446744073709551615ull); 183 ASSERT_STREQ_LEN(written, buff, "18446744073709551615"); // ull max 184 185 written = 186 LIBC_NAMESPACE::sprintf(buff, "%w64d", -9223372036854775807ll - 1ll); 187 ASSERT_STREQ_LEN(written, buff, "-9223372036854775808"); // ll min 188 189 written = LIBC_NAMESPACE::sprintf(buff, "%wf3d", 5807); 190 ASSERT_STREQ_LEN(written, buff, "7"); 191 192 written = LIBC_NAMESPACE::sprintf(buff, "%wf3d", 1); 193 ASSERT_STREQ_LEN(written, buff, "1"); 194 195 written = LIBC_NAMESPACE::sprintf(buff, "%wf64u", 18446744073709551615ull); 196 ASSERT_STREQ_LEN(written, buff, "18446744073709551615"); // ull max 197 198 written = 199 LIBC_NAMESPACE::sprintf(buff, "%wf64d", -9223372036854775807ll - 1ll); 200 ASSERT_STREQ_LEN(written, buff, "-9223372036854775808"); // ll min 201 202 written = LIBC_NAMESPACE::sprintf(buff, "%wf0d", 5807); 203 ASSERT_STREQ_LEN(written, buff, "%wf0d"); 204 205 written = LIBC_NAMESPACE::sprintf(buff, "%wf-1d", 5807); 206 ASSERT_STREQ_LEN(written, buff, "%wf-1d"); 207 208 written = LIBC_NAMESPACE::sprintf(buff, "%wfinvalid%wf1d", 5807, 5807); 209 ASSERT_STREQ_LEN(written, buff, "%wfinvalid1"); 210 211 written = LIBC_NAMESPACE::sprintf(buff, "%wf-1d%wf1d", 5807, 5807); 212 ASSERT_STREQ_LEN(written, buff, "%wf-1d1"); 213 214 written = LIBC_NAMESPACE::sprintf(buff, "%wf999d", 9223372036854775807ll); 215 ASSERT_STREQ_LEN(written, buff, "9223372036854775807"); 216 217 // Min Width Tests. 218 219 written = LIBC_NAMESPACE::sprintf(buff, "%4d", 789); 220 ASSERT_STREQ_LEN(written, buff, " 789"); 221 222 written = LIBC_NAMESPACE::sprintf(buff, "%2d", 987); 223 ASSERT_STREQ_LEN(written, buff, "987"); 224 225 // Precision Tests. 226 227 written = LIBC_NAMESPACE::sprintf(buff, "%d", 0); 228 ASSERT_STREQ_LEN(written, buff, "0"); 229 230 written = LIBC_NAMESPACE::sprintf(buff, "%.0d", 0); 231 ASSERT_STREQ_LEN(written, buff, ""); 232 233 written = LIBC_NAMESPACE::sprintf(buff, "%.5d", 654); 234 ASSERT_STREQ_LEN(written, buff, "00654"); 235 236 written = LIBC_NAMESPACE::sprintf(buff, "%.5d", -321); 237 ASSERT_STREQ_LEN(written, buff, "-00321"); 238 239 written = LIBC_NAMESPACE::sprintf(buff, "%.2d", 135); 240 ASSERT_STREQ_LEN(written, buff, "135"); 241 242 // Flag Tests. 243 244 written = LIBC_NAMESPACE::sprintf(buff, "%.5d", -321); 245 ASSERT_STREQ_LEN(written, buff, "-00321"); 246 247 written = LIBC_NAMESPACE::sprintf(buff, "%-5d", 246); 248 ASSERT_STREQ_LEN(written, buff, "246 "); 249 250 written = LIBC_NAMESPACE::sprintf(buff, "%-5d", -147); 251 ASSERT_STREQ_LEN(written, buff, "-147 "); 252 253 written = LIBC_NAMESPACE::sprintf(buff, "%+d", 258); 254 ASSERT_STREQ_LEN(written, buff, "+258"); 255 256 written = LIBC_NAMESPACE::sprintf(buff, "% d", 369); 257 ASSERT_STREQ_LEN(written, buff, " 369"); 258 259 written = LIBC_NAMESPACE::sprintf(buff, "%05d", 470); 260 ASSERT_STREQ_LEN(written, buff, "00470"); 261 262 written = LIBC_NAMESPACE::sprintf(buff, "%05d", -581); 263 ASSERT_STREQ_LEN(written, buff, "-0581"); 264 265 // Combined Tests. 266 267 written = LIBC_NAMESPACE::sprintf(buff, "%+ u", 692); 268 ASSERT_STREQ_LEN(written, buff, "692"); 269 270 written = LIBC_NAMESPACE::sprintf(buff, "%+ -05d", 703); 271 ASSERT_STREQ_LEN(written, buff, "+703 "); 272 273 written = LIBC_NAMESPACE::sprintf(buff, "%7.5d", 814); 274 ASSERT_STREQ_LEN(written, buff, " 00814"); 275 276 written = LIBC_NAMESPACE::sprintf(buff, "%7.5d", -925); 277 ASSERT_STREQ_LEN(written, buff, " -00925"); 278 279 written = LIBC_NAMESPACE::sprintf(buff, "%7.5d", 159); 280 ASSERT_STREQ_LEN(written, buff, " 00159"); 281 282 written = LIBC_NAMESPACE::sprintf(buff, "% -7.5d", 260); 283 ASSERT_STREQ_LEN(written, buff, " 00260 "); 284 285 written = LIBC_NAMESPACE::sprintf(buff, "%5.4d", 10000); 286 ASSERT_STREQ_LEN(written, buff, "10000"); 287 288 // Multiple Conversion Tests. 289 290 written = LIBC_NAMESPACE::sprintf(buff, "%10d %-10d", 456, -789); 291 ASSERT_STREQ_LEN(written, buff, " 456 -789 "); 292 293 written = LIBC_NAMESPACE::sprintf(buff, "%-5.4d%+.4u", 75, 25); 294 ASSERT_STREQ_LEN(written, buff, "0075 0025"); 295 296 written = LIBC_NAMESPACE::sprintf(buff, "% 05hhi %+-0.5llu %-+ 06.3zd", 297 256 + 127, 68719476736ll, size_t(2)); 298 ASSERT_STREQ_LEN(written, buff, " 0127 68719476736 +002 "); 299 } 300 301 TEST(LlvmLibcSPrintfTest, HexConv) { 302 char buff[64]; 303 int written; 304 305 // Basic Tests. 306 307 written = LIBC_NAMESPACE::sprintf(buff, "%x", 0x123a); 308 ASSERT_STREQ_LEN(written, buff, "123a"); 309 310 written = LIBC_NAMESPACE::sprintf(buff, "%X", 0x456b); 311 ASSERT_STREQ_LEN(written, buff, "456B"); 312 313 // Length Modifier Tests. 314 315 written = LIBC_NAMESPACE::sprintf(buff, "%hhx", 0x10001); 316 ASSERT_STREQ_LEN(written, buff, "1"); 317 318 written = LIBC_NAMESPACE::sprintf(buff, "%llx", 0xffffffffffffffffull); 319 ASSERT_STREQ_LEN(written, buff, "ffffffffffffffff"); // ull max 320 321 written = LIBC_NAMESPACE::sprintf(buff, "%tX", ~ptrdiff_t(0)); 322 if (sizeof(ptrdiff_t) == 8) { 323 ASSERT_STREQ_LEN(written, buff, "FFFFFFFFFFFFFFFF"); 324 } else if (sizeof(ptrdiff_t) == 4) { 325 ASSERT_STREQ_LEN(written, buff, "FFFFFFFF"); 326 } 327 328 // Min Width Tests. 329 330 written = LIBC_NAMESPACE::sprintf(buff, "%4x", 0x789); 331 ASSERT_STREQ_LEN(written, buff, " 789"); 332 333 written = LIBC_NAMESPACE::sprintf(buff, "%2X", 0x987); 334 ASSERT_STREQ_LEN(written, buff, "987"); 335 336 // Precision Tests. 337 338 written = LIBC_NAMESPACE::sprintf(buff, "%x", 0); 339 ASSERT_STREQ_LEN(written, buff, "0"); 340 341 written = LIBC_NAMESPACE::sprintf(buff, "%.0x", 0); 342 ASSERT_STREQ_LEN(written, buff, ""); 343 344 written = LIBC_NAMESPACE::sprintf(buff, "%.5x", 0x1F3); 345 ASSERT_STREQ_LEN(written, buff, "001f3"); 346 347 written = LIBC_NAMESPACE::sprintf(buff, "%.2x", 0x135); 348 ASSERT_STREQ_LEN(written, buff, "135"); 349 350 // Flag Tests. 351 352 written = LIBC_NAMESPACE::sprintf(buff, "%-5x", 0x246); 353 ASSERT_STREQ_LEN(written, buff, "246 "); 354 355 written = LIBC_NAMESPACE::sprintf(buff, "%#x", 0xd3f); 356 ASSERT_STREQ_LEN(written, buff, "0xd3f"); 357 358 written = LIBC_NAMESPACE::sprintf(buff, "%#x", 0); 359 ASSERT_STREQ_LEN(written, buff, "0"); 360 361 written = LIBC_NAMESPACE::sprintf(buff, "%#X", 0xE40); 362 ASSERT_STREQ_LEN(written, buff, "0XE40"); 363 364 written = LIBC_NAMESPACE::sprintf(buff, "%05x", 0x470); 365 ASSERT_STREQ_LEN(written, buff, "00470"); 366 367 written = LIBC_NAMESPACE::sprintf(buff, "%0#6x", 0x8c3); 368 ASSERT_STREQ_LEN(written, buff, "0x08c3"); 369 370 written = LIBC_NAMESPACE::sprintf(buff, "%-#6x", 0x5f0); 371 ASSERT_STREQ_LEN(written, buff, "0x5f0 "); 372 373 // Combined Tests. 374 375 written = LIBC_NAMESPACE::sprintf(buff, "%#-07x", 0x703); 376 ASSERT_STREQ_LEN(written, buff, "0x703 "); 377 378 written = LIBC_NAMESPACE::sprintf(buff, "%7.5x", 0x814); 379 ASSERT_STREQ_LEN(written, buff, " 00814"); 380 381 written = LIBC_NAMESPACE::sprintf(buff, "%#9.5X", 0x9d4); 382 ASSERT_STREQ_LEN(written, buff, " 0X009D4"); 383 384 written = LIBC_NAMESPACE::sprintf(buff, "%#.x", 0); 385 ASSERT_STREQ_LEN(written, buff, ""); 386 387 written = LIBC_NAMESPACE::sprintf(buff, "%-7.5x", 0x260); 388 ASSERT_STREQ_LEN(written, buff, "00260 "); 389 390 written = LIBC_NAMESPACE::sprintf(buff, "%5.4x", 0x10000); 391 ASSERT_STREQ_LEN(written, buff, "10000"); 392 393 // Multiple Conversion Tests. 394 395 written = LIBC_NAMESPACE::sprintf(buff, "%10X %-#10x", 0x45b, 0x789); 396 ASSERT_STREQ_LEN(written, buff, " 45B 0x789 "); 397 398 written = LIBC_NAMESPACE::sprintf(buff, "%-5.4x%#.4x", 0x75, 0x25); 399 ASSERT_STREQ_LEN(written, buff, "0075 0x0025"); 400 401 written = LIBC_NAMESPACE::sprintf(buff, "%04hhX %#.5llx %-6.3zX", 256 + 0x7f, 402 0x1000000000ll, size_t(2)); 403 ASSERT_STREQ_LEN(written, buff, "007F 0x1000000000 002 "); 404 } 405 406 TEST(LlvmLibcSPrintfTest, BinConv) { 407 char buff[64]; 408 int written; 409 410 // Basic Tests. 411 412 written = LIBC_NAMESPACE::sprintf(buff, "%b", 42); 413 ASSERT_STREQ_LEN(written, buff, "101010"); 414 415 written = LIBC_NAMESPACE::sprintf(buff, "%B", 12081991); 416 ASSERT_STREQ_LEN(written, buff, "101110000101101101000111"); 417 418 // Min Width Tests. 419 420 written = LIBC_NAMESPACE::sprintf(buff, "%10b", 0b101010); 421 ASSERT_STREQ_LEN(written, buff, " 101010"); 422 423 written = LIBC_NAMESPACE::sprintf(buff, "%2B", 0b101010); 424 ASSERT_STREQ_LEN(written, buff, "101010"); 425 426 // Precision Tests. 427 428 written = LIBC_NAMESPACE::sprintf(buff, "%b", 0); 429 ASSERT_STREQ_LEN(written, buff, "0"); 430 431 written = LIBC_NAMESPACE::sprintf(buff, "%.0b", 0); 432 ASSERT_STREQ_LEN(written, buff, ""); 433 434 written = LIBC_NAMESPACE::sprintf(buff, "%.5b", 0b111); 435 ASSERT_STREQ_LEN(written, buff, "00111"); 436 437 written = LIBC_NAMESPACE::sprintf(buff, "%.2b", 0b111); 438 ASSERT_STREQ_LEN(written, buff, "111"); 439 440 written = LIBC_NAMESPACE::sprintf(buff, "%3b", 0b111); 441 ASSERT_STREQ_LEN(written, buff, "111"); 442 443 // Flag Tests. 444 445 written = LIBC_NAMESPACE::sprintf(buff, "%-5b", 0b111); 446 ASSERT_STREQ_LEN(written, buff, "111 "); 447 448 written = LIBC_NAMESPACE::sprintf(buff, "%#b", 0b111); 449 ASSERT_STREQ_LEN(written, buff, "0b111"); 450 451 written = LIBC_NAMESPACE::sprintf(buff, "%#b", 0); 452 ASSERT_STREQ_LEN(written, buff, "0"); 453 454 written = LIBC_NAMESPACE::sprintf(buff, "%#B", 0b111); 455 ASSERT_STREQ_LEN(written, buff, "0B111"); 456 457 written = LIBC_NAMESPACE::sprintf(buff, "%05b", 0b111); 458 ASSERT_STREQ_LEN(written, buff, "00111"); 459 460 written = LIBC_NAMESPACE::sprintf(buff, "%0#6b", 0b111); 461 ASSERT_STREQ_LEN(written, buff, "0b0111"); 462 463 written = LIBC_NAMESPACE::sprintf(buff, "%-#6b", 0b111); 464 ASSERT_STREQ_LEN(written, buff, "0b111 "); 465 466 // Combined Tests. 467 468 written = LIBC_NAMESPACE::sprintf(buff, "%#-07b", 0b111); 469 ASSERT_STREQ_LEN(written, buff, "0b111 "); 470 471 written = LIBC_NAMESPACE::sprintf(buff, "%7.5b", 0b111); 472 ASSERT_STREQ_LEN(written, buff, " 00111"); 473 474 written = LIBC_NAMESPACE::sprintf(buff, "%#9.5B", 0b111); 475 ASSERT_STREQ_LEN(written, buff, " 0B00111"); 476 477 written = LIBC_NAMESPACE::sprintf(buff, "%#.b", 0); 478 ASSERT_STREQ_LEN(written, buff, ""); 479 480 written = LIBC_NAMESPACE::sprintf(buff, "%-7.5b", 0b111); 481 ASSERT_STREQ_LEN(written, buff, "00111 "); 482 483 written = LIBC_NAMESPACE::sprintf(buff, "%5.4b", 0b1111); 484 ASSERT_STREQ_LEN(written, buff, " 1111"); 485 486 // Multiple Conversion Tests. 487 488 written = LIBC_NAMESPACE::sprintf(buff, "%10B %-#10b", 0b101, 0b110); 489 ASSERT_STREQ_LEN(written, buff, " 101 0b110 "); 490 491 written = LIBC_NAMESPACE::sprintf(buff, "%-5.4b%#.4b", 0b101, 0b110); 492 ASSERT_STREQ_LEN(written, buff, "0101 0b0110"); 493 } 494 495 TEST(LlvmLibcSPrintfTest, PointerConv) { 496 char buff[64]; 497 int written; 498 499 written = LIBC_NAMESPACE::sprintf(buff, "%p", nullptr); 500 ASSERT_STREQ_LEN(written, buff, "(nullptr)"); 501 502 written = LIBC_NAMESPACE::sprintf(buff, "%p", 0x1a2b3c4d); 503 ASSERT_STREQ_LEN(written, buff, "0x1a2b3c4d"); 504 505 if constexpr (sizeof(void *) > 4) { 506 written = LIBC_NAMESPACE::sprintf(buff, "%p", 0x1a2b3c4d5e6f7081); 507 ASSERT_STREQ_LEN(written, buff, "0x1a2b3c4d5e6f7081"); 508 } 509 510 written = LIBC_NAMESPACE::sprintf(buff, "%p", &written); 511 EXPECT_GT(written, 0); 512 513 // Width tests: 514 515 written = LIBC_NAMESPACE::sprintf(buff, "%20p", nullptr); 516 ASSERT_STREQ_LEN(written, buff, " (nullptr)"); 517 518 written = LIBC_NAMESPACE::sprintf(buff, "%20p", 0x1a2b3c4d); 519 ASSERT_STREQ_LEN(written, buff, " 0x1a2b3c4d"); 520 521 // Flag tests: 522 523 written = LIBC_NAMESPACE::sprintf(buff, "%-20p", nullptr); 524 ASSERT_STREQ_LEN(written, buff, "(nullptr) "); 525 526 written = LIBC_NAMESPACE::sprintf(buff, "%-20p", 0x1a2b3c4d); 527 ASSERT_STREQ_LEN(written, buff, "0x1a2b3c4d "); 528 529 // Using the 0 flag is technically undefined, but here we're following the 530 // convention of matching the behavior of %#x. 531 written = LIBC_NAMESPACE::sprintf(buff, "%020p", 0x1a2b3c4d); 532 ASSERT_STREQ_LEN(written, buff, "0x00000000001a2b3c4d"); 533 534 // Precision tests: 535 // These are all undefined behavior. The precision option is undefined for %p. 536 537 // Precision specifies the number of characters for a string conversion. 538 written = LIBC_NAMESPACE::sprintf(buff, "%.5p", nullptr); 539 ASSERT_STREQ_LEN(written, buff, "(null"); 540 541 // Precision specifies the number of digits to be written for %x conversions, 542 // and the "0x" doesn't count as part of the digits. 543 written = LIBC_NAMESPACE::sprintf(buff, "%.20p", 0x1a2b3c4d); 544 ASSERT_STREQ_LEN(written, buff, "0x0000000000001a2b3c4d"); 545 } 546 547 TEST(LlvmLibcSPrintfTest, OctConv) { 548 char buff[64]; 549 int written; 550 551 // Basic Tests. 552 553 written = LIBC_NAMESPACE::sprintf(buff, "%o", 01234); 554 ASSERT_STREQ_LEN(written, buff, "1234"); 555 556 written = LIBC_NAMESPACE::sprintf(buff, "%o", 04567); 557 ASSERT_STREQ_LEN(written, buff, "4567"); 558 559 // Length Modifier Tests. 560 561 written = LIBC_NAMESPACE::sprintf(buff, "%hho", 0401); 562 ASSERT_STREQ_LEN(written, buff, "1"); 563 564 written = LIBC_NAMESPACE::sprintf(buff, "%llo", 01777777777777777777777ull); 565 ASSERT_STREQ_LEN(written, buff, "1777777777777777777777"); // ull max 566 567 written = LIBC_NAMESPACE::sprintf(buff, "%to", ~ptrdiff_t(0)); 568 if (sizeof(ptrdiff_t) == 8) { 569 ASSERT_STREQ_LEN(written, buff, "1777777777777777777777"); 570 } else if (sizeof(ptrdiff_t) == 4) { 571 ASSERT_STREQ_LEN(written, buff, "37777777777"); 572 } 573 574 // Min Width Tests. 575 576 written = LIBC_NAMESPACE::sprintf(buff, "%4o", 0701); 577 ASSERT_STREQ_LEN(written, buff, " 701"); 578 579 written = LIBC_NAMESPACE::sprintf(buff, "%2o", 0107); 580 ASSERT_STREQ_LEN(written, buff, "107"); 581 582 // Precision Tests. 583 584 written = LIBC_NAMESPACE::sprintf(buff, "%o", 0); 585 ASSERT_STREQ_LEN(written, buff, "0"); 586 587 written = LIBC_NAMESPACE::sprintf(buff, "%.0o", 0); 588 ASSERT_STREQ_LEN(written, buff, ""); 589 590 written = LIBC_NAMESPACE::sprintf(buff, "%.5o", 0153); 591 ASSERT_STREQ_LEN(written, buff, "00153"); 592 593 written = LIBC_NAMESPACE::sprintf(buff, "%.2o", 0135); 594 ASSERT_STREQ_LEN(written, buff, "135"); 595 596 // Flag Tests. 597 598 written = LIBC_NAMESPACE::sprintf(buff, "%-5o", 0246); 599 ASSERT_STREQ_LEN(written, buff, "246 "); 600 601 written = LIBC_NAMESPACE::sprintf(buff, "%#o", 0234); 602 ASSERT_STREQ_LEN(written, buff, "0234"); 603 604 written = LIBC_NAMESPACE::sprintf(buff, "%#o", 0); 605 ASSERT_STREQ_LEN(written, buff, "0"); 606 607 written = LIBC_NAMESPACE::sprintf(buff, "%05o", 0470); 608 ASSERT_STREQ_LEN(written, buff, "00470"); 609 610 written = LIBC_NAMESPACE::sprintf(buff, "%0#6o", 0753); 611 ASSERT_STREQ_LEN(written, buff, "000753"); 612 613 written = LIBC_NAMESPACE::sprintf(buff, "%-#6o", 0642); 614 ASSERT_STREQ_LEN(written, buff, "0642 "); 615 616 // Combined Tests. 617 618 written = LIBC_NAMESPACE::sprintf(buff, "%#-07o", 0703); 619 ASSERT_STREQ_LEN(written, buff, "0703 "); 620 621 written = LIBC_NAMESPACE::sprintf(buff, "%#.o", 0); 622 ASSERT_STREQ_LEN(written, buff, "0"); 623 624 written = LIBC_NAMESPACE::sprintf(buff, "%7.5o", 0314); 625 ASSERT_STREQ_LEN(written, buff, " 00314"); 626 627 written = LIBC_NAMESPACE::sprintf(buff, "%#9.5o", 0234); 628 ASSERT_STREQ_LEN(written, buff, " 00234"); 629 630 written = LIBC_NAMESPACE::sprintf(buff, "%-7.5o", 0260); 631 ASSERT_STREQ_LEN(written, buff, "00260 "); 632 633 written = LIBC_NAMESPACE::sprintf(buff, "%5.4o", 010000); 634 ASSERT_STREQ_LEN(written, buff, "10000"); 635 636 // Multiple Conversion Tests. 637 638 written = LIBC_NAMESPACE::sprintf(buff, "%10o %-#10o", 0456, 0123); 639 ASSERT_STREQ_LEN(written, buff, " 456 0123 "); 640 641 written = LIBC_NAMESPACE::sprintf(buff, "%-5.4o%#.4o", 075, 025); 642 ASSERT_STREQ_LEN(written, buff, "0075 0025"); 643 644 written = LIBC_NAMESPACE::sprintf(buff, "%04hho %#.5llo %-6.3zo", 256 + 077, 645 01000000000000ll, size_t(2)); 646 ASSERT_STREQ_LEN(written, buff, "0077 01000000000000 002 "); 647 } 648 649 #ifndef LIBC_COPT_PRINTF_DISABLE_FLOAT 650 651 TEST(LlvmLibcSPrintfTest, FloatHexExpConv) { 652 char buff[128]; 653 int written; 654 655 ForceRoundingMode r(RoundingMode::Nearest); 656 double inf = LIBC_NAMESPACE::fputil::FPBits<double>::inf().get_val(); 657 double nan = LIBC_NAMESPACE::fputil::FPBits<double>::quiet_nan().get_val(); 658 written = LIBC_NAMESPACE::sprintf(buff, "%a", 1.0); 659 ASSERT_STREQ_LEN(written, buff, "0x1p+0"); 660 661 written = LIBC_NAMESPACE::sprintf(buff, "%A", -1.0); 662 ASSERT_STREQ_LEN(written, buff, "-0X1P+0"); 663 664 written = LIBC_NAMESPACE::sprintf(buff, "%a", -0x1.abcdef12345p0); 665 ASSERT_STREQ_LEN(written, buff, "-0x1.abcdef12345p+0"); 666 667 written = LIBC_NAMESPACE::sprintf(buff, "%A", 0x1.abcdef12345p0); 668 ASSERT_STREQ_LEN(written, buff, "0X1.ABCDEF12345P+0"); 669 670 written = LIBC_NAMESPACE::sprintf(buff, "%a", 0.0); 671 ASSERT_STREQ_LEN(written, buff, "0x0p+0"); 672 673 written = LIBC_NAMESPACE::sprintf(buff, "%a", 1.0e100); 674 ASSERT_STREQ_LEN(written, buff, "0x1.249ad2594c37dp+332"); 675 676 written = LIBC_NAMESPACE::sprintf(buff, "%a", 0.1); 677 ASSERT_STREQ_LEN(written, buff, "0x1.999999999999ap-4"); 678 679 // Subnormal Tests. 680 681 written = LIBC_NAMESPACE::sprintf(buff, "%a", 0x1.0p-1027); 682 ASSERT_STREQ_LEN(written, buff, "0x0.08p-1022"); 683 684 written = LIBC_NAMESPACE::sprintf(buff, "%a", 0x1.0p-1025); 685 ASSERT_STREQ_LEN(written, buff, "0x0.2p-1022"); 686 687 written = LIBC_NAMESPACE::sprintf(buff, "%a", 0x1.0p-1023); 688 ASSERT_STREQ_LEN(written, buff, "0x0.8p-1022"); 689 690 written = LIBC_NAMESPACE::sprintf(buff, "%a", 0x1.0p-1022); 691 ASSERT_STREQ_LEN(written, buff, "0x1p-1022"); 692 693 written = LIBC_NAMESPACE::sprintf(buff, "%a", 0x1.0p-1074); 694 ASSERT_STREQ_LEN(written, buff, "0x0.0000000000001p-1022"); 695 696 // Inf/Nan Tests. 697 698 written = LIBC_NAMESPACE::sprintf(buff, "%a", inf); 699 ASSERT_STREQ_LEN(written, buff, "inf"); 700 701 written = LIBC_NAMESPACE::sprintf(buff, "%A", -inf); 702 ASSERT_STREQ_LEN(written, buff, "-INF"); 703 704 written = LIBC_NAMESPACE::sprintf(buff, "%a", nan); 705 ASSERT_STREQ_LEN(written, buff, "nan"); 706 707 written = LIBC_NAMESPACE::sprintf(buff, "%A", -nan); 708 ASSERT_STREQ_LEN(written, buff, "-NAN"); 709 710 // Length Modifier Tests. 711 712 written = LIBC_NAMESPACE::sprintf(buff, "%La", 0.1L); 713 #if defined(LIBC_TYPES_LONG_DOUBLE_IS_X86_FLOAT80) 714 ASSERT_STREQ_LEN(written, buff, "0xc.ccccccccccccccdp-7"); 715 #elif defined(LIBC_TYPES_LONG_DOUBLE_IS_FLOAT64) 716 ASSERT_STREQ_LEN(written, buff, "0x1.999999999999ap-4"); 717 #elif defined(LIBC_TYPES_LONG_DOUBLE_IS_FLOAT128) 718 ASSERT_STREQ_LEN(written, buff, "0x1.999999999999999999999999999ap-4"); 719 #endif 720 721 written = LIBC_NAMESPACE::sprintf(buff, "%La", 1.0e1000L); 722 #if defined(LIBC_TYPES_LONG_DOUBLE_IS_X86_FLOAT80) 723 ASSERT_STREQ_LEN(written, buff, "0xf.38db1f9dd3dac05p+3318"); 724 #elif defined(LIBC_TYPES_LONG_DOUBLE_IS_FLOAT64) 725 ASSERT_STREQ_LEN(written, buff, "inf"); 726 #elif defined(LIBC_TYPES_LONG_DOUBLE_IS_FLOAT128) 727 ASSERT_STREQ_LEN(written, buff, "0x1.e71b63f3ba7b580af1a52d2a7379p+3321"); 728 #endif 729 730 written = LIBC_NAMESPACE::sprintf(buff, "%La", 1.0e-1000L); 731 #if defined(LIBC_TYPES_LONG_DOUBLE_IS_X86_FLOAT80) 732 ASSERT_STREQ_LEN(written, buff, "0x8.68a9188a89e1467p-3325"); 733 #elif defined(LIBC_TYPES_LONG_DOUBLE_IS_FLOAT64) 734 ASSERT_STREQ_LEN(written, buff, "0x0p+0"); 735 #elif defined(LIBC_TYPES_LONG_DOUBLE_IS_FLOAT128) 736 ASSERT_STREQ_LEN(written, buff, "0x1.0d152311513c28ce202627c06ec2p-3322"); 737 #endif 738 739 // Min Width Tests. 740 741 written = LIBC_NAMESPACE::sprintf(buff, "%15a", 1.0); 742 ASSERT_STREQ_LEN(written, buff, " 0x1p+0"); 743 744 written = LIBC_NAMESPACE::sprintf(buff, "%15a", -1.0); 745 ASSERT_STREQ_LEN(written, buff, " -0x1p+0"); 746 747 written = LIBC_NAMESPACE::sprintf(buff, "%15a", 1.0e10); 748 ASSERT_STREQ_LEN(written, buff, " 0x1.2a05f2p+33"); 749 750 written = LIBC_NAMESPACE::sprintf(buff, "%15a", -1.0e10); 751 ASSERT_STREQ_LEN(written, buff, "-0x1.2a05f2p+33"); 752 753 written = LIBC_NAMESPACE::sprintf(buff, "%10a", 1.0e10); 754 ASSERT_STREQ_LEN(written, buff, "0x1.2a05f2p+33"); 755 756 written = LIBC_NAMESPACE::sprintf(buff, "%5a", inf); 757 ASSERT_STREQ_LEN(written, buff, " inf"); 758 759 written = LIBC_NAMESPACE::sprintf(buff, "%5a", -nan); 760 ASSERT_STREQ_LEN(written, buff, " -nan"); 761 762 // Precision Tests. 763 764 written = LIBC_NAMESPACE::sprintf(buff, "%.1a", 1.0); 765 ASSERT_STREQ_LEN(written, buff, "0x1.0p+0"); 766 767 written = LIBC_NAMESPACE::sprintf(buff, "%.1a", 0.0); 768 ASSERT_STREQ_LEN(written, buff, "0x0.0p+0"); 769 770 written = LIBC_NAMESPACE::sprintf(buff, "%.1a", 0.1); 771 ASSERT_STREQ_LEN(written, buff, "0x1.ap-4"); 772 773 written = LIBC_NAMESPACE::sprintf(buff, "%.1a", 0x1.0fp0); 774 ASSERT_STREQ_LEN(written, buff, "0x1.1p+0"); 775 776 written = LIBC_NAMESPACE::sprintf(buff, "%.1a", 0x1.07p0); 777 ASSERT_STREQ_LEN(written, buff, "0x1.0p+0"); 778 779 written = LIBC_NAMESPACE::sprintf(buff, "%.1a", 0x1.08p0); 780 ASSERT_STREQ_LEN(written, buff, "0x1.0p+0"); 781 782 written = LIBC_NAMESPACE::sprintf(buff, "%.1a", 0x1.18p0); 783 ASSERT_STREQ_LEN(written, buff, "0x1.2p+0"); 784 785 written = LIBC_NAMESPACE::sprintf(buff, "%.1a", 0x1.ffp0); 786 ASSERT_STREQ_LEN(written, buff, "0x2.0p+0"); 787 788 written = LIBC_NAMESPACE::sprintf(buff, "%.5a", 1.25); 789 ASSERT_STREQ_LEN(written, buff, "0x1.40000p+0"); 790 791 written = LIBC_NAMESPACE::sprintf(buff, "%.0a", 1.25); 792 ASSERT_STREQ_LEN(written, buff, "0x1p+0"); 793 794 written = LIBC_NAMESPACE::sprintf(buff, "%.0a", 1.75); 795 ASSERT_STREQ_LEN(written, buff, "0x2p+0"); 796 797 written = LIBC_NAMESPACE::sprintf(buff, "%.1a", 0x1.0p-1023); 798 ASSERT_STREQ_LEN(written, buff, "0x0.8p-1022"); 799 800 written = LIBC_NAMESPACE::sprintf(buff, "%.1a", 0x1.8p-1023); 801 ASSERT_STREQ_LEN(written, buff, "0x0.cp-1022"); 802 803 written = LIBC_NAMESPACE::sprintf(buff, "%.1a", 0x1.0p-1024); 804 ASSERT_STREQ_LEN(written, buff, "0x0.4p-1022"); 805 806 written = LIBC_NAMESPACE::sprintf(buff, "%.0a", 0x1.0p-1023); 807 ASSERT_STREQ_LEN(written, buff, "0x0p-1022"); 808 809 written = LIBC_NAMESPACE::sprintf(buff, "%.0a", 0x1.8p-1023); 810 ASSERT_STREQ_LEN(written, buff, "0x1p-1022"); 811 812 written = LIBC_NAMESPACE::sprintf(buff, "%.0a", 0x1.0p-1024); 813 ASSERT_STREQ_LEN(written, buff, "0x0p-1022"); 814 815 written = LIBC_NAMESPACE::sprintf(buff, "%.2a", 0x1.0p-1027); 816 ASSERT_STREQ_LEN(written, buff, "0x0.08p-1022"); 817 818 written = LIBC_NAMESPACE::sprintf(buff, "%.1a", 0x1.0p-1027); 819 ASSERT_STREQ_LEN(written, buff, "0x0.0p-1022"); 820 821 written = LIBC_NAMESPACE::sprintf(buff, "%.5a", 0.0); 822 ASSERT_STREQ_LEN(written, buff, "0x0.00000p+0"); 823 824 written = LIBC_NAMESPACE::sprintf(buff, "%.5a", 0x1.008p0); 825 ASSERT_STREQ_LEN(written, buff, "0x1.00800p+0"); 826 827 written = LIBC_NAMESPACE::sprintf(buff, "%.5a", 0x1.008p10); 828 ASSERT_STREQ_LEN(written, buff, "0x1.00800p+10"); 829 830 written = LIBC_NAMESPACE::sprintf(buff, "%.5a", nan); 831 ASSERT_STREQ_LEN(written, buff, "nan"); 832 833 written = LIBC_NAMESPACE::sprintf(buff, "%La", 0.0L); 834 ASSERT_STREQ_LEN(written, buff, "0x0p+0"); 835 836 written = LIBC_NAMESPACE::sprintf(buff, "%.1La", 0.1L); 837 #if defined(LIBC_TYPES_LONG_DOUBLE_IS_X86_FLOAT80) 838 ASSERT_STREQ_LEN(written, buff, "0xc.dp-7"); 839 #elif defined(LIBC_TYPES_LONG_DOUBLE_IS_FLOAT64) 840 ASSERT_STREQ_LEN(written, buff, "0x1.ap-4"); 841 #elif defined(LIBC_TYPES_LONG_DOUBLE_IS_FLOAT128) 842 ASSERT_STREQ_LEN(written, buff, "0x1.ap-4"); 843 #endif 844 845 written = LIBC_NAMESPACE::sprintf(buff, "%.1La", 0xf.fffffffffffffffp16380L); 846 #if defined(LIBC_TYPES_LONG_DOUBLE_IS_X86_FLOAT80) 847 ASSERT_STREQ_LEN(written, buff, "0x1.0p+16384"); 848 #elif defined(LIBC_TYPES_LONG_DOUBLE_IS_FLOAT64) 849 ASSERT_STREQ_LEN(written, buff, "inf"); 850 #elif defined(LIBC_TYPES_LONG_DOUBLE_IS_FLOAT128) 851 ASSERT_STREQ_LEN(written, buff, "0x2.0p+16383"); 852 #endif 853 854 // Rounding Mode Tests. 855 856 if (ForceRoundingMode r(RoundingMode::Nearest); r.success) { 857 written = LIBC_NAMESPACE::sprintf(buff, "%.1a", 0x1.08p0); 858 ASSERT_STREQ_LEN(written, buff, "0x1.0p+0"); 859 860 written = LIBC_NAMESPACE::sprintf(buff, "%.1a", 0x1.18p0); 861 ASSERT_STREQ_LEN(written, buff, "0x1.2p+0"); 862 863 written = LIBC_NAMESPACE::sprintf(buff, "%.1a", 0x1.04p0); 864 ASSERT_STREQ_LEN(written, buff, "0x1.0p+0"); 865 866 written = LIBC_NAMESPACE::sprintf(buff, "%.1a", 0x1.14p0); 867 ASSERT_STREQ_LEN(written, buff, "0x1.1p+0"); 868 869 written = LIBC_NAMESPACE::sprintf(buff, "%.1a", -0x1.08p0); 870 ASSERT_STREQ_LEN(written, buff, "-0x1.0p+0"); 871 872 written = LIBC_NAMESPACE::sprintf(buff, "%.1a", -0x1.18p0); 873 ASSERT_STREQ_LEN(written, buff, "-0x1.2p+0"); 874 875 written = LIBC_NAMESPACE::sprintf(buff, "%.1a", -0x1.04p0); 876 ASSERT_STREQ_LEN(written, buff, "-0x1.0p+0"); 877 878 written = LIBC_NAMESPACE::sprintf(buff, "%.1a", -0x1.14p0); 879 ASSERT_STREQ_LEN(written, buff, "-0x1.1p+0"); 880 } 881 882 if (ForceRoundingMode r(RoundingMode::Upward); r.success) { 883 written = LIBC_NAMESPACE::sprintf(buff, "%.1a", 0x1.08p0); 884 ASSERT_STREQ_LEN(written, buff, "0x1.1p+0"); 885 886 written = LIBC_NAMESPACE::sprintf(buff, "%.1a", 0x1.18p0); 887 ASSERT_STREQ_LEN(written, buff, "0x1.2p+0"); 888 889 written = LIBC_NAMESPACE::sprintf(buff, "%.1a", 0x1.04p0); 890 ASSERT_STREQ_LEN(written, buff, "0x1.1p+0"); 891 892 written = LIBC_NAMESPACE::sprintf(buff, "%.1a", 0x1.14p0); 893 ASSERT_STREQ_LEN(written, buff, "0x1.2p+0"); 894 895 written = LIBC_NAMESPACE::sprintf(buff, "%.1a", -0x1.08p0); 896 ASSERT_STREQ_LEN(written, buff, "-0x1.0p+0"); 897 898 written = LIBC_NAMESPACE::sprintf(buff, "%.1a", -0x1.18p0); 899 ASSERT_STREQ_LEN(written, buff, "-0x1.1p+0"); 900 901 written = LIBC_NAMESPACE::sprintf(buff, "%.1a", -0x1.04p0); 902 ASSERT_STREQ_LEN(written, buff, "-0x1.0p+0"); 903 904 written = LIBC_NAMESPACE::sprintf(buff, "%.1a", -0x1.14p0); 905 ASSERT_STREQ_LEN(written, buff, "-0x1.1p+0"); 906 } 907 908 if (ForceRoundingMode r(RoundingMode::Downward); r.success) { 909 written = LIBC_NAMESPACE::sprintf(buff, "%.1a", 0x1.08p0); 910 ASSERT_STREQ_LEN(written, buff, "0x1.0p+0"); 911 912 written = LIBC_NAMESPACE::sprintf(buff, "%.1a", 0x1.18p0); 913 ASSERT_STREQ_LEN(written, buff, "0x1.1p+0"); 914 915 written = LIBC_NAMESPACE::sprintf(buff, "%.1a", 0x1.04p0); 916 ASSERT_STREQ_LEN(written, buff, "0x1.0p+0"); 917 918 written = LIBC_NAMESPACE::sprintf(buff, "%.1a", 0x1.14p0); 919 ASSERT_STREQ_LEN(written, buff, "0x1.1p+0"); 920 921 written = LIBC_NAMESPACE::sprintf(buff, "%.1a", -0x1.08p0); 922 ASSERT_STREQ_LEN(written, buff, "-0x1.1p+0"); 923 924 written = LIBC_NAMESPACE::sprintf(buff, "%.1a", -0x1.18p0); 925 ASSERT_STREQ_LEN(written, buff, "-0x1.2p+0"); 926 927 written = LIBC_NAMESPACE::sprintf(buff, "%.1a", -0x1.04p0); 928 ASSERT_STREQ_LEN(written, buff, "-0x1.1p+0"); 929 930 written = LIBC_NAMESPACE::sprintf(buff, "%.1a", -0x1.14p0); 931 ASSERT_STREQ_LEN(written, buff, "-0x1.2p+0"); 932 } 933 934 if (ForceRoundingMode r(RoundingMode::TowardZero); r.success) { 935 written = LIBC_NAMESPACE::sprintf(buff, "%.1a", 0x1.08p0); 936 ASSERT_STREQ_LEN(written, buff, "0x1.0p+0"); 937 938 written = LIBC_NAMESPACE::sprintf(buff, "%.1a", 0x1.18p0); 939 ASSERT_STREQ_LEN(written, buff, "0x1.1p+0"); 940 941 written = LIBC_NAMESPACE::sprintf(buff, "%.1a", 0x1.04p0); 942 ASSERT_STREQ_LEN(written, buff, "0x1.0p+0"); 943 944 written = LIBC_NAMESPACE::sprintf(buff, "%.1a", 0x1.14p0); 945 ASSERT_STREQ_LEN(written, buff, "0x1.1p+0"); 946 947 written = LIBC_NAMESPACE::sprintf(buff, "%.1a", -0x1.08p0); 948 ASSERT_STREQ_LEN(written, buff, "-0x1.0p+0"); 949 950 written = LIBC_NAMESPACE::sprintf(buff, "%.1a", -0x1.18p0); 951 ASSERT_STREQ_LEN(written, buff, "-0x1.1p+0"); 952 953 written = LIBC_NAMESPACE::sprintf(buff, "%.1a", -0x1.04p0); 954 ASSERT_STREQ_LEN(written, buff, "-0x1.0p+0"); 955 956 written = LIBC_NAMESPACE::sprintf(buff, "%.1a", -0x1.14p0); 957 ASSERT_STREQ_LEN(written, buff, "-0x1.1p+0"); 958 } 959 960 // Flag Tests. 961 962 written = LIBC_NAMESPACE::sprintf(buff, "%+a", nan); 963 ASSERT_STREQ_LEN(written, buff, "+nan"); 964 965 written = LIBC_NAMESPACE::sprintf(buff, "% A", inf); 966 ASSERT_STREQ_LEN(written, buff, " INF"); 967 968 written = LIBC_NAMESPACE::sprintf(buff, "%-5a", inf); 969 ASSERT_STREQ_LEN(written, buff, "inf "); 970 971 written = LIBC_NAMESPACE::sprintf(buff, "%+-5A", nan); 972 ASSERT_STREQ_LEN(written, buff, "+NAN "); 973 974 written = LIBC_NAMESPACE::sprintf(buff, "%+a", 1.0); 975 ASSERT_STREQ_LEN(written, buff, "+0x1p+0"); 976 977 written = LIBC_NAMESPACE::sprintf(buff, "% a", 0.0); 978 ASSERT_STREQ_LEN(written, buff, " 0x0p+0"); 979 980 written = LIBC_NAMESPACE::sprintf(buff, "%-10a", 1.5); 981 ASSERT_STREQ_LEN(written, buff, "0x1.8p+0 "); 982 983 written = LIBC_NAMESPACE::sprintf(buff, "%#a", 1.0); 984 ASSERT_STREQ_LEN(written, buff, "0x1.p+0"); 985 986 written = LIBC_NAMESPACE::sprintf(buff, "%#.0a", 1.5); 987 ASSERT_STREQ_LEN(written, buff, "0x2.p+0"); 988 989 written = LIBC_NAMESPACE::sprintf(buff, "%010a", 1.5); 990 ASSERT_STREQ_LEN(written, buff, "0x001.8p+0"); 991 992 written = LIBC_NAMESPACE::sprintf(buff, "%+- #0a", 0.0); 993 ASSERT_STREQ_LEN(written, buff, "+0x0.p+0"); 994 995 // Combined Tests. 996 997 written = LIBC_NAMESPACE::sprintf(buff, "%12.3a %-12.3A", 0.1, 256.0); 998 ASSERT_STREQ_LEN(written, buff, " 0x1.99ap-4 0X1.000P+8 "); 999 1000 written = LIBC_NAMESPACE::sprintf(buff, "%+-#12.3a % 012.3a", 0.1256, 1256.0); 1001 ASSERT_STREQ_LEN(written, buff, "+0x1.014p-3 0x1.3a0p+10"); 1002 1003 // These tests check that the padding is properly calculated based on the 1004 // min_width field. Specifically, they check that the extra zeroes added by 1005 // the high precision are accounted for correctly. 1006 written = LIBC_NAMESPACE::sprintf(buff, "%50.50a", 0x1.0p0); 1007 ASSERT_STREQ_LEN(written, buff, 1008 "0x1.00000000000000000000000000000000000000000000000000p+0"); 1009 1010 // The difference with this test is that the formatted number is exactly 57 1011 // characters, so padding to 58 adds a space. 1012 written = LIBC_NAMESPACE::sprintf(buff, "%58.50a", 0x1.0p0); 1013 ASSERT_STREQ_LEN( 1014 written, buff, 1015 " 0x1.00000000000000000000000000000000000000000000000000p+0"); 1016 } 1017 1018 TEST(LlvmLibcSPrintfTest, FloatDecimalConv) { 1019 char buff[1500]; 1020 int written; 1021 1022 ForceRoundingMode r(RoundingMode::Nearest); 1023 double inf = LIBC_NAMESPACE::fputil::FPBits<double>::inf().get_val(); 1024 double nan = LIBC_NAMESPACE::fputil::FPBits<double>::quiet_nan().get_val(); 1025 long double ld_inf = 1026 LIBC_NAMESPACE::fputil::FPBits<long double>::inf().get_val(); 1027 long double ld_nan = 1028 LIBC_NAMESPACE::fputil::FPBits<long double>::quiet_nan().get_val(); 1029 1030 written = LIBC_NAMESPACE::sprintf(buff, "%f", 1.0); 1031 ASSERT_STREQ_LEN(written, buff, "1.000000"); 1032 1033 written = LIBC_NAMESPACE::sprintf(buff, "%F", -1.0); 1034 ASSERT_STREQ_LEN(written, buff, "-1.000000"); 1035 1036 written = LIBC_NAMESPACE::sprintf(buff, "%f", -1.234567); 1037 ASSERT_STREQ_LEN(written, buff, "-1.234567"); 1038 1039 written = LIBC_NAMESPACE::sprintf(buff, "%f", 0.0); 1040 ASSERT_STREQ_LEN(written, buff, "0.000000"); 1041 1042 written = LIBC_NAMESPACE::sprintf(buff, "%f", 1.5); 1043 ASSERT_STREQ_LEN(written, buff, "1.500000"); 1044 1045 #ifndef LIBC_COPT_FLOAT_TO_STR_REDUCED_PRECISION 1046 written = LIBC_NAMESPACE::sprintf(buff, "%f", 1e300); 1047 ASSERT_STREQ_LEN( 1048 written, buff, 1049 "100000000000000005250476025520442024870446858110815915491585411551180245" 1050 "798890819578637137508044786404370444383288387817694252323536043057564479" 1051 "218478670698284838720092657580373783023379478809005936895323497079994508" 1052 "111903896764088007465274278014249457925878882005684283811566947219638686" 1053 "5459400540160.000000"); 1054 #endif // LIBC_COPT_FLOAT_TO_STR_REDUCED_PRECISION 1055 1056 written = LIBC_NAMESPACE::sprintf(buff, "%f", 0.1); 1057 ASSERT_STREQ_LEN(written, buff, "0.100000"); 1058 1059 written = LIBC_NAMESPACE::sprintf(buff, "%f", 1234567890123456789.0); 1060 ASSERT_STREQ_LEN(written, buff, "1234567890123456768.000000"); 1061 1062 written = LIBC_NAMESPACE::sprintf(buff, "%f", 9999999999999.99); 1063 ASSERT_STREQ_LEN(written, buff, "9999999999999.990234"); 1064 1065 // Simple Subnormal Tests. 1066 1067 written = LIBC_NAMESPACE::sprintf(buff, "%f", 0x1.0p-1027); 1068 ASSERT_STREQ_LEN(written, buff, "0.000000"); 1069 1070 written = LIBC_NAMESPACE::sprintf(buff, "%f", 0x1.0p-1074); 1071 ASSERT_STREQ_LEN(written, buff, "0.000000"); 1072 1073 // Inf/Nan Tests. 1074 1075 written = LIBC_NAMESPACE::sprintf(buff, "%f", inf); 1076 ASSERT_STREQ_LEN(written, buff, "inf"); 1077 1078 written = LIBC_NAMESPACE::sprintf(buff, "%F", -inf); 1079 ASSERT_STREQ_LEN(written, buff, "-INF"); 1080 1081 written = LIBC_NAMESPACE::sprintf(buff, "%f", nan); 1082 ASSERT_STREQ_LEN(written, buff, "nan"); 1083 1084 written = LIBC_NAMESPACE::sprintf(buff, "%F", -nan); 1085 ASSERT_STREQ_LEN(written, buff, "-NAN"); 1086 1087 written = LIBC_NAMESPACE::sprintf(buff, "%Lf", ld_inf); 1088 ASSERT_STREQ_LEN(written, buff, "inf"); 1089 1090 written = LIBC_NAMESPACE::sprintf(buff, "%LF", -ld_inf); 1091 ASSERT_STREQ_LEN(written, buff, "-INF"); 1092 1093 written = LIBC_NAMESPACE::sprintf(buff, "%Lf", ld_nan); 1094 ASSERT_STREQ_LEN(written, buff, "nan"); 1095 1096 // Some float128 systems (specifically the ones used for aarch64 buildbots) 1097 // don't respect signs for long double NaNs. 1098 #if defined(LIBC_TYPES_LONG_DOUBLE_IS_X86_FLOAT80) || \ 1099 defined(LIBC_TYPES_LONG_DOUBLE_IS_FLOAT64) 1100 written = LIBC_NAMESPACE::sprintf(buff, "%LF", -ld_nan); 1101 ASSERT_STREQ_LEN(written, buff, "-NAN"); 1102 #endif 1103 1104 // Min Width Tests. 1105 1106 written = LIBC_NAMESPACE::sprintf(buff, "%15f", 1.0); 1107 ASSERT_STREQ_LEN(written, buff, " 1.000000"); 1108 1109 written = LIBC_NAMESPACE::sprintf(buff, "%15f", -1.0); 1110 ASSERT_STREQ_LEN(written, buff, " -1.000000"); 1111 1112 written = LIBC_NAMESPACE::sprintf(buff, "%15f", 1.0e5); 1113 ASSERT_STREQ_LEN(written, buff, " 100000.000000"); 1114 1115 written = LIBC_NAMESPACE::sprintf(buff, "%15f", -1.0e5); 1116 ASSERT_STREQ_LEN(written, buff, " -100000.000000"); 1117 1118 written = LIBC_NAMESPACE::sprintf(buff, "%10f", 1.0e5); 1119 ASSERT_STREQ_LEN(written, buff, "100000.000000"); 1120 1121 // Precision Tests. 1122 1123 written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 1.0); 1124 ASSERT_STREQ_LEN(written, buff, "1.0"); 1125 1126 written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 0.0); 1127 ASSERT_STREQ_LEN(written, buff, "0.0"); 1128 1129 written = LIBC_NAMESPACE::sprintf(buff, "%.0f", 0.0); 1130 ASSERT_STREQ_LEN(written, buff, "0"); 1131 1132 written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 0.1); 1133 ASSERT_STREQ_LEN(written, buff, "0.1"); 1134 1135 written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 1.09); 1136 ASSERT_STREQ_LEN(written, buff, "1.1"); 1137 1138 written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 1.04); 1139 ASSERT_STREQ_LEN(written, buff, "1.0"); 1140 1141 written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 1.19); 1142 ASSERT_STREQ_LEN(written, buff, "1.2"); 1143 1144 written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 1.99); 1145 ASSERT_STREQ_LEN(written, buff, "2.0"); 1146 1147 written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 9.99); 1148 ASSERT_STREQ_LEN(written, buff, "10.0"); 1149 1150 written = LIBC_NAMESPACE::sprintf(buff, "%.2f", 9999999999999.99); 1151 ASSERT_STREQ_LEN(written, buff, "9999999999999.99"); 1152 1153 written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 9999999999999.99); 1154 ASSERT_STREQ_LEN(written, buff, "10000000000000.0"); 1155 1156 written = LIBC_NAMESPACE::sprintf(buff, "%.5f", 1.25); 1157 ASSERT_STREQ_LEN(written, buff, "1.25000"); 1158 1159 written = LIBC_NAMESPACE::sprintf(buff, "%.0f", 1.25); 1160 ASSERT_STREQ_LEN(written, buff, "1"); 1161 1162 written = LIBC_NAMESPACE::sprintf(buff, "%.0f", 1.75); 1163 ASSERT_STREQ_LEN(written, buff, "2"); 1164 1165 written = LIBC_NAMESPACE::sprintf(buff, "%.20f", 1.234e-10); 1166 ASSERT_STREQ_LEN(written, buff, "0.00000000012340000000"); 1167 1168 written = LIBC_NAMESPACE::sprintf(buff, "%.2f", -9.99); 1169 ASSERT_STREQ_LEN(written, buff, "-9.99"); 1170 1171 written = LIBC_NAMESPACE::sprintf(buff, "%.1f", -9.99); 1172 ASSERT_STREQ_LEN(written, buff, "-10.0"); 1173 1174 written = LIBC_NAMESPACE::sprintf(buff, "%.5f", 0.0); 1175 ASSERT_STREQ_LEN(written, buff, "0.00000"); 1176 1177 written = LIBC_NAMESPACE::sprintf(buff, "%.5f", 1.008); 1178 ASSERT_STREQ_LEN(written, buff, "1.00800"); 1179 1180 written = LIBC_NAMESPACE::sprintf(buff, "%.5f", 1.008e3); 1181 ASSERT_STREQ_LEN(written, buff, "1008.00000"); 1182 1183 // Found with the help of Fred Tydeman's tbin2dec test. 1184 written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 0x1.1000000000006p+3); 1185 ASSERT_STREQ_LEN(written, buff, "8.5"); 1186 1187 written = LIBC_NAMESPACE::sprintf(buff, "%.0f", 0x1.1000000000006p+3); 1188 ASSERT_STREQ_LEN(written, buff, "9"); 1189 1190 // Most of these tests are checking rounding behavior when the precision is 1191 // set. As an example, %.9f has a precision of 9, meaning it should be rounded 1192 // to 9 digits after the decimal point. In this case, that means that it 1193 // should be rounded up. Many of these tests have precisions divisible by 9 1194 // since when printing the floating point numbers are broken up into "blocks" 1195 // of 9 digits. They often also have a 5 after the end of what's printed, 1196 // since in round to nearest mode, that requires checking additional digits. 1197 written = LIBC_NAMESPACE::sprintf(buff, "%.9f", 1.9999999999999514); 1198 ASSERT_STREQ_LEN(written, buff, "2.000000000"); 1199 1200 #ifndef LIBC_COPT_FLOAT_TO_STR_REDUCED_PRECISION 1201 // The number continues after the literal because floating point numbers can't 1202 // represent every value. The printed value is the closest value a double can 1203 // represent, rounded to the requested precision. 1204 written = LIBC_NAMESPACE::sprintf(buff, "%.238f", 1.131959884853339E-72); 1205 ASSERT_STREQ_LEN( 1206 written, buff, 1207 "0." 1208 "000000000000000000000000000000000000000000000000000000000000000000000001" 1209 "131959884853339045938639911360973972585316399767392273697826861241937664" 1210 "824105639342441431495119762431744054912109728706985341609159156917030486" 1211 "5110665559768676757812"); 1212 #endif 1213 1214 written = LIBC_NAMESPACE::sprintf(buff, "%.36f", 9.9e-77); 1215 ASSERT_STREQ_LEN(written, buff, "0.000000000000000000000000000000000000"); 1216 1217 #ifndef LIBC_COPT_FLOAT_TO_STR_REDUCED_PRECISION 1218 written = LIBC_NAMESPACE::sprintf(buff, "%.1071f", 2.0226568751604562E-314); 1219 ASSERT_STREQ_LEN( 1220 written, buff, 1221 "0." 1222 "000000000000000000000000000000000000000000000000000000000000000000000000" 1223 "000000000000000000000000000000000000000000000000000000000000000000000000" 1224 "000000000000000000000000000000000000000000000000000000000000000000000000" 1225 "000000000000000000000000000000000000000000000000000000000000000000000000" 1226 "000000000000000000000000020226568751604561683387695750739190248658016786" 1227 "876938365740768295004457513021760887468117675879956193821375945376632621" 1228 "367998639317487303530427946024002091961988296562516210434394107910027236" 1229 "308233439098296717697919471698168200340836487924061502604112643734560622" 1230 "258525943451473162532620033398739382796482175564084902819878893430369431" 1231 "907237673154867595954110791891883281880339550955455702452422857027182100" 1232 "606009588295886640782228837851739241290179512817803196347460636150182981" 1233 "085084829941917048152725177119574542042352896161225179181967347829576272" 1234 "242480201291872969114441104973910102402751449901108484914924879541248714" 1235 "939096548775588293353689592872854495101242645279589976452453829724479805" 1236 "750016448075109469332839157162950982637994457036256790161132812"); 1237 #endif 1238 1239 // If no precision is specified it defaults to 6 for %f. 1240 written = LIBC_NAMESPACE::sprintf(buff, "%f", 2325885.4901960781); 1241 ASSERT_STREQ_LEN(written, buff, "2325885.490196"); 1242 1243 // Subnormal Precision Tests 1244 1245 written = LIBC_NAMESPACE::sprintf(buff, "%.310f", 0x1.0p-1022); 1246 ASSERT_STREQ_LEN( 1247 written, buff, 1248 "0." 1249 "000000000000000000000000000000000000000000000000000000000000000000000000" 1250 "000000000000000000000000000000000000000000000000000000000000000000000000" 1251 "000000000000000000000000000000000000000000000000000000000000000000000000" 1252 "000000000000000000000000000000000000000000000000000000000000000000000000" 1253 "0000000000000000000223"); 1254 1255 written = LIBC_NAMESPACE::sprintf(buff, "%.310f", 0x1.0p-1023); 1256 ASSERT_STREQ_LEN( 1257 written, buff, 1258 "0." 1259 "000000000000000000000000000000000000000000000000000000000000000000000000" 1260 "000000000000000000000000000000000000000000000000000000000000000000000000" 1261 "000000000000000000000000000000000000000000000000000000000000000000000000" 1262 "000000000000000000000000000000000000000000000000000000000000000000000000" 1263 "0000000000000000000111"); 1264 1265 written = LIBC_NAMESPACE::sprintf(buff, "%.315f", 9.99999e-310); 1266 ASSERT_STREQ_LEN( 1267 written, buff, 1268 "0." 1269 "000000000000000000000000000000000000000000000000000000000000000000000000" 1270 "000000000000000000000000000000000000000000000000000000000000000000000000" 1271 "000000000000000000000000000000000000000000000000000000000000000000000000" 1272 "000000000000000000000000000000000000000000000000000000000000000000000000" 1273 "000000000000000000000999999"); 1274 1275 written = LIBC_NAMESPACE::sprintf(buff, "%.314f", 9.99999e-310); 1276 ASSERT_STREQ_LEN( 1277 written, buff, 1278 "0." 1279 "000000000000000000000000000000000000000000000000000000000000000000000000" 1280 "000000000000000000000000000000000000000000000000000000000000000000000000" 1281 "000000000000000000000000000000000000000000000000000000000000000000000000" 1282 "000000000000000000000000000000000000000000000000000000000000000000000000" 1283 "00000000000000000000100000"); 1284 1285 written = LIBC_NAMESPACE::sprintf(buff, "%.330f", 0x1.0p-1074); 1286 ASSERT_STREQ_LEN( 1287 written, buff, 1288 "0." 1289 "000000000000000000000000000000000000000000000000000000000000000000000000" 1290 "000000000000000000000000000000000000000000000000000000000000000000000000" 1291 "000000000000000000000000000000000000000000000000000000000000000000000000" 1292 "000000000000000000000000000000000000000000000000000000000000000000000000" 1293 "000000000000000000000000000000000004940656"); 1294 1295 // Rounding Mode Tests. 1296 1297 if (ForceRoundingMode r(RoundingMode::Nearest); r.success) { 1298 written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 1.75); 1299 ASSERT_STREQ_LEN(written, buff, "1.8"); 1300 1301 written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 1.25); 1302 ASSERT_STREQ_LEN(written, buff, "1.2"); 1303 1304 written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 1.125); 1305 ASSERT_STREQ_LEN(written, buff, "1.1"); 1306 1307 written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 1.625); 1308 ASSERT_STREQ_LEN(written, buff, "1.6"); 1309 1310 written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 1.375); 1311 ASSERT_STREQ_LEN(written, buff, "1.4"); 1312 1313 written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 1.875); 1314 ASSERT_STREQ_LEN(written, buff, "1.9"); 1315 1316 written = LIBC_NAMESPACE::sprintf(buff, "%.1f", -1.75); 1317 ASSERT_STREQ_LEN(written, buff, "-1.8"); 1318 1319 written = LIBC_NAMESPACE::sprintf(buff, "%.1f", -1.25); 1320 ASSERT_STREQ_LEN(written, buff, "-1.2"); 1321 1322 written = LIBC_NAMESPACE::sprintf(buff, "%.1f", -1.125); 1323 ASSERT_STREQ_LEN(written, buff, "-1.1"); 1324 1325 written = LIBC_NAMESPACE::sprintf(buff, "%.1f", -1.625); 1326 ASSERT_STREQ_LEN(written, buff, "-1.6"); 1327 1328 written = LIBC_NAMESPACE::sprintf(buff, "%.1f", -1.375); 1329 ASSERT_STREQ_LEN(written, buff, "-1.4"); 1330 1331 written = LIBC_NAMESPACE::sprintf(buff, "%.1f", -1.875); 1332 ASSERT_STREQ_LEN(written, buff, "-1.9"); 1333 } 1334 1335 if (ForceRoundingMode r(RoundingMode::Upward); r.success) { 1336 written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 1.75); 1337 ASSERT_STREQ_LEN(written, buff, "1.8"); 1338 1339 written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 1.25); 1340 ASSERT_STREQ_LEN(written, buff, "1.3"); 1341 1342 written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 1.125); 1343 ASSERT_STREQ_LEN(written, buff, "1.2"); 1344 1345 written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 1.625); 1346 ASSERT_STREQ_LEN(written, buff, "1.7"); 1347 1348 written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 1.375); 1349 ASSERT_STREQ_LEN(written, buff, "1.4"); 1350 1351 written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 1.875); 1352 ASSERT_STREQ_LEN(written, buff, "1.9"); 1353 1354 written = LIBC_NAMESPACE::sprintf(buff, "%.1f", -1.75); 1355 ASSERT_STREQ_LEN(written, buff, "-1.7"); 1356 1357 written = LIBC_NAMESPACE::sprintf(buff, "%.1f", -1.25); 1358 ASSERT_STREQ_LEN(written, buff, "-1.2"); 1359 1360 written = LIBC_NAMESPACE::sprintf(buff, "%.1f", -1.125); 1361 ASSERT_STREQ_LEN(written, buff, "-1.1"); 1362 1363 written = LIBC_NAMESPACE::sprintf(buff, "%.1f", -1.625); 1364 ASSERT_STREQ_LEN(written, buff, "-1.6"); 1365 1366 written = LIBC_NAMESPACE::sprintf(buff, "%.1f", -1.375); 1367 ASSERT_STREQ_LEN(written, buff, "-1.3"); 1368 1369 written = LIBC_NAMESPACE::sprintf(buff, "%.1f", -1.875); 1370 ASSERT_STREQ_LEN(written, buff, "-1.8"); 1371 } 1372 1373 if (ForceRoundingMode r(RoundingMode::Downward); r.success) { 1374 written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 1.75); 1375 ASSERT_STREQ_LEN(written, buff, "1.7"); 1376 1377 written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 1.25); 1378 ASSERT_STREQ_LEN(written, buff, "1.2"); 1379 1380 written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 1.125); 1381 ASSERT_STREQ_LEN(written, buff, "1.1"); 1382 1383 written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 1.625); 1384 ASSERT_STREQ_LEN(written, buff, "1.6"); 1385 1386 written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 1.375); 1387 ASSERT_STREQ_LEN(written, buff, "1.3"); 1388 1389 written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 1.875); 1390 ASSERT_STREQ_LEN(written, buff, "1.8"); 1391 1392 written = LIBC_NAMESPACE::sprintf(buff, "%.1f", -1.75); 1393 ASSERT_STREQ_LEN(written, buff, "-1.8"); 1394 1395 written = LIBC_NAMESPACE::sprintf(buff, "%.1f", -1.25); 1396 ASSERT_STREQ_LEN(written, buff, "-1.3"); 1397 1398 written = LIBC_NAMESPACE::sprintf(buff, "%.1f", -1.125); 1399 ASSERT_STREQ_LEN(written, buff, "-1.2"); 1400 1401 written = LIBC_NAMESPACE::sprintf(buff, "%.1f", -1.625); 1402 ASSERT_STREQ_LEN(written, buff, "-1.7"); 1403 1404 written = LIBC_NAMESPACE::sprintf(buff, "%.1f", -1.375); 1405 ASSERT_STREQ_LEN(written, buff, "-1.4"); 1406 1407 written = LIBC_NAMESPACE::sprintf(buff, "%.1f", -1.875); 1408 ASSERT_STREQ_LEN(written, buff, "-1.9"); 1409 } 1410 1411 if (ForceRoundingMode r(RoundingMode::TowardZero); r.success) { 1412 written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 1.75); 1413 ASSERT_STREQ_LEN(written, buff, "1.7"); 1414 1415 written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 1.25); 1416 ASSERT_STREQ_LEN(written, buff, "1.2"); 1417 1418 written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 1.125); 1419 ASSERT_STREQ_LEN(written, buff, "1.1"); 1420 1421 written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 1.625); 1422 ASSERT_STREQ_LEN(written, buff, "1.6"); 1423 1424 written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 1.375); 1425 ASSERT_STREQ_LEN(written, buff, "1.3"); 1426 1427 written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 1.875); 1428 ASSERT_STREQ_LEN(written, buff, "1.8"); 1429 1430 written = LIBC_NAMESPACE::sprintf(buff, "%.1f", -1.75); 1431 ASSERT_STREQ_LEN(written, buff, "-1.7"); 1432 1433 written = LIBC_NAMESPACE::sprintf(buff, "%.1f", -1.25); 1434 ASSERT_STREQ_LEN(written, buff, "-1.2"); 1435 1436 written = LIBC_NAMESPACE::sprintf(buff, "%.1f", -1.125); 1437 ASSERT_STREQ_LEN(written, buff, "-1.1"); 1438 1439 written = LIBC_NAMESPACE::sprintf(buff, "%.1f", -1.625); 1440 ASSERT_STREQ_LEN(written, buff, "-1.6"); 1441 1442 written = LIBC_NAMESPACE::sprintf(buff, "%.1f", -1.375); 1443 ASSERT_STREQ_LEN(written, buff, "-1.3"); 1444 1445 written = LIBC_NAMESPACE::sprintf(buff, "%.1f", -1.875); 1446 ASSERT_STREQ_LEN(written, buff, "-1.8"); 1447 } 1448 1449 // Flag Tests. 1450 written = LIBC_NAMESPACE::sprintf(buff, "%+f", 1.0); 1451 ASSERT_STREQ_LEN(written, buff, "+1.000000"); 1452 1453 written = LIBC_NAMESPACE::sprintf(buff, "%+f", -1.0); 1454 ASSERT_STREQ_LEN(written, buff, "-1.000000"); 1455 1456 written = LIBC_NAMESPACE::sprintf(buff, "% f", 1.0); 1457 ASSERT_STREQ_LEN(written, buff, " 1.000000"); 1458 1459 written = LIBC_NAMESPACE::sprintf(buff, "% f", -1.0); 1460 ASSERT_STREQ_LEN(written, buff, "-1.000000"); 1461 1462 written = LIBC_NAMESPACE::sprintf(buff, "%-10f", 1.5); 1463 ASSERT_STREQ_LEN(written, buff, "1.500000 "); 1464 1465 written = LIBC_NAMESPACE::sprintf(buff, "%#.f", 1.0); 1466 ASSERT_STREQ_LEN(written, buff, "1."); 1467 1468 written = LIBC_NAMESPACE::sprintf(buff, "%#.0f", 1.5); 1469 ASSERT_STREQ_LEN(written, buff, "2."); 1470 1471 written = LIBC_NAMESPACE::sprintf(buff, "%010f", 1.5); 1472 ASSERT_STREQ_LEN(written, buff, "001.500000"); 1473 1474 written = LIBC_NAMESPACE::sprintf(buff, "%010f", -1.5); 1475 ASSERT_STREQ_LEN(written, buff, "-01.500000"); 1476 1477 written = LIBC_NAMESPACE::sprintf(buff, "%+- #0f", 0.0); 1478 ASSERT_STREQ_LEN(written, buff, "+0.000000"); 1479 1480 // Combined Tests. 1481 1482 written = LIBC_NAMESPACE::sprintf(buff, "%10.2f", 9.99); 1483 ASSERT_STREQ_LEN(written, buff, " 9.99"); 1484 1485 written = LIBC_NAMESPACE::sprintf(buff, "%5.1f", 9.99); 1486 ASSERT_STREQ_LEN(written, buff, " 10.0"); 1487 1488 written = LIBC_NAMESPACE::sprintf(buff, "%-10.2f", 9.99); 1489 ASSERT_STREQ_LEN(written, buff, "9.99 "); 1490 1491 written = LIBC_NAMESPACE::sprintf(buff, "%-5.1f", 9.99); 1492 ASSERT_STREQ_LEN(written, buff, "10.0 "); 1493 1494 written = LIBC_NAMESPACE::sprintf(buff, "%-5.1f", 1.0e-50); 1495 ASSERT_STREQ_LEN(written, buff, "0.0 "); 1496 1497 written = LIBC_NAMESPACE::sprintf(buff, "%30f", 1234567890123456789.0); 1498 ASSERT_STREQ_LEN(written, buff, " 1234567890123456768.000000"); 1499 1500 written = LIBC_NAMESPACE::sprintf(buff, "%-30f", 1234567890123456789.0); 1501 ASSERT_STREQ_LEN(written, buff, "1234567890123456768.000000 "); 1502 1503 written = LIBC_NAMESPACE::sprintf(buff, "%20.2f", 9999999999999.99); 1504 ASSERT_STREQ_LEN(written, buff, " 9999999999999.99"); 1505 1506 written = LIBC_NAMESPACE::sprintf(buff, "%20.1f", 9999999999999.99); 1507 ASSERT_STREQ_LEN(written, buff, " 10000000000000.0"); 1508 1509 written = LIBC_NAMESPACE::sprintf(buff, "%12.3f %-12.3f", 0.1, 256.0); 1510 ASSERT_STREQ_LEN(written, buff, " 0.100 256.000 "); 1511 1512 written = LIBC_NAMESPACE::sprintf(buff, "%+-#12.3f % 012.3f", 0.1256, 1256.0); 1513 ASSERT_STREQ_LEN(written, buff, "+0.126 0001256.000"); 1514 } 1515 1516 // The long double tests are separated so that their performance can be directly 1517 // measured. 1518 TEST(LlvmLibcSPrintfTest, FloatDecimalLongDoubleConv) { 1519 char buff[1000]; 1520 int written; 1521 1522 ForceRoundingMode r(RoundingMode::Nearest); 1523 1524 // Length Modifier Tests. 1525 1526 // TODO(michaelrj): Add tests for LIBC_TYPES_LONG_DOUBLE_IS_FLOAT64 and 128 1527 // bit long double systems. 1528 // TODO(michaelrj): Fix the tests to only depend on the digits the long double 1529 // is accurate for. 1530 1531 written = LIBC_NAMESPACE::sprintf(buff, "%Lf", 1.0L); 1532 ASSERT_STREQ_LEN(written, buff, "1.000000"); 1533 1534 written = LIBC_NAMESPACE::sprintf(buff, "%.Lf", -2.5L); 1535 ASSERT_STREQ_LEN(written, buff, "-2"); 1536 1537 #if defined(LIBC_TYPES_LONG_DOUBLE_IS_X86_FLOAT80) 1538 1539 #ifndef LIBC_COPT_FLOAT_TO_STR_REDUCED_PRECISION 1540 written = LIBC_NAMESPACE::sprintf(buff, "%Lf", 1e100L); 1541 ASSERT_STREQ_LEN(written, buff, 1542 "99999999999999999996693535322073426194986990198284960792713" 1543 "91541752018669482644324418977840117055488.000000"); 1544 #endif 1545 1546 written = LIBC_NAMESPACE::sprintf(buff, "%Lf", 0xd.96ed1192687859ap-24L); 1547 ASSERT_STREQ_LEN(written, buff, "0.000001"); 1548 1549 written = LIBC_NAMESPACE::sprintf(buff, "%Lf", 10000000000000000.25L); 1550 ASSERT_STREQ_LEN(written, buff, "10000000000000000.250000"); 1551 1552 #ifndef LIBC_COPT_FLOAT_TO_STR_REDUCED_PRECISION 1553 written = LIBC_NAMESPACE::sprintf(buff, "%.510Lf", 0x8p-503L); 1554 ASSERT_STREQ_LEN( 1555 written, buff, 1556 "0." 1557 "000000000000000000000000000000000000000000000000000000000000000000000000" 1558 "000000000000000000000000000000000000000000000000000000000000000000000000" 1559 "000000305493636349960468205197939321361769978940274057232666389361390928" 1560 "129162652472045770185723510801522825687515269359046715531785342780428396" 1561 "973513311420091788963072442053377285222203558881953188370081650866793017" 1562 "948791366338993705251636497892270212003524508209121908744820211960149463" 1563 "721109340307985507678283651836204093399373959982767701148986816406250000" 1564 "000000"); 1565 #endif 1566 1567 written = LIBC_NAMESPACE::sprintf(buff, "%.500Lf", -4327677766926336.0L); 1568 ASSERT_STREQ_LEN( 1569 written, buff, 1570 "-4327677766926336." 1571 "000000000000000000000000000000000000000000000000000000000000000000000000" 1572 "000000000000000000000000000000000000000000000000000000000000000000000000" 1573 "000000000000000000000000000000000000000000000000000000000000000000000000" 1574 "000000000000000000000000000000000000000000000000000000000000000000000000" 1575 "000000000000000000000000000000000000000000000000000000000000000000000000" 1576 "000000000000000000000000000000000000000000000000000000000000000000000000" 1577 "00000000000000000000000000000000000000000000000000000000000000000000"); 1578 1579 char big_buff[10000]; // Used for extremely wide numbers. 1580 1581 #ifndef LIBC_COPT_FLOAT_TO_STR_REDUCED_PRECISION 1582 written = LIBC_NAMESPACE::sprintf(big_buff, "%Lf", 1e1000L); 1583 ASSERT_STREQ_LEN( 1584 written, big_buff, 1585 "999999999999999999973107317669562353428234857594552594925899449376328728" 1586 "202461036775511405481186963193066642191664822065529414252060696836533522" 1587 "387143501724276282079456797058697369889056407118642873669166717313763499" 1588 "277025985141177344925615052465165938514140943010597323750202561187880136" 1589 "174810574553749194614479541820148407958204853833697063267336294787191005" 1590 "628217462261955103745349844675732989944229689277833828743730290177882029" 1591 "042613704915899149603539993716885598351951895974316347947147507970269673" 1592 "097709017164643598452451201499004104341931127294141495501309305995449742" 1593 "273419524803597130450457553871345958049837885085168840317195672271085085" 1594 "950520957945970913451088104971436093671776829538796532762184174216651692" 1595 "640931965387852083906784898823494867055070322768919156031682291829761007" 1596 "101483799978382119231551218582499361996919560548090784230386907125151658" 1597 "086767207295524036170321059257942621398084478974000973622199163292708506" 1598 "2431457550909271560663602154947063707982236377366647567795879936." 1599 "000000"); 1600 1601 written = LIBC_NAMESPACE::sprintf(big_buff, "%Lf", 1e4900L); 1602 ASSERT_STREQ_LEN( 1603 written, big_buff, 1604 "100000000000000000002708312230690349833224052504078834346502930111959028" 1605 "517260692666637048230414374897655201843766090626319971729765251179632020" 1606 "313912652522792711197087872698264530532442630109549129842736280196919130" 1607 "242615101228133188193853826983121366159061148351354364472807590931218045" 1608 "387490935930967150336231085015126034696883068553581691802388371635128003" 1609 "615577299166097675723780877126495909902479233742826339471026068806070433" 1610 "075629449530819183550315434973800271862658869400009022028602967197463980" 1611 "126881829804282202449930132940824361207087494829502385835258094836304011" 1612 "876250359661206802659650567866176246063987902366800491980400341950657151" 1613 "370854446585517805253310195469184699955519312761482572080479702840420595" 1614 "377369017651259376039167277822106875560385309101650382998482652792335482" 1615 "865443482342801545877390859444282105890147577937366066315975231014810320" 1616 "888482059656248277607763361589359794524314002443575149260630989130103550" 1617 "443177966380769341050735632338583912575890190136462629316287947355057647" 1618 "111088565611192544631519843618778618820046304429723908484879583579178075" 1619 "456701368334212923379389029311286386996015804122917416008806233549005183" 1620 "152461084266176543129004016414959261473645240454289630182591200574019087" 1621 "358223489767381636349719510715487188747217311279465814538495924567014916" 1622 "238565628036285599497236493491668884212847699052761266207598941300449276" 1623 "447201387520841811835583254242213093566548778954711633721122784159793843" 1624 "766802019309395771984693609426401362800013936338891483689127845928572536" 1625 "790651156184721483511507878883282891696900630100211914227950790472211403" 1626 "392549466062537498185758854079775888444518306635752468713312357556380082" 1627 "275500658967283696421824354930077523691855699312544373220921962817907078" 1628 "445538421941800259027487429330768616490865438859612697367766323925013940" 1629 "918384858952407145253573823848733994146335416209309233074165707437420756" 1630 "438833918763109580759409985573826485055208965115587885226774453455112406" 1631 "581351429640282227888764449360534584421929291565334894907337572527922691" 1632 "473242328379737396430908523008687037407295838014450772162091496534584696" 1633 "605157436893236842602956298545594095307060870397506421786236892553632163" 1634 "491468601982681381011940409602294892199042638682530687578982576819839451" 1635 "907594697546439533559153604700750696252355362322662219852740143212566818" 1636 "745528402265116534684566273868361460640280523251242059850044328669692159" 1637 "629900374576027104298177006629276014371540945261309319363704125592775129" 1638 "543526908667388673739382491147471395192495459318806593271282662311169392" 1639 "196897003517840025298267505925987901751541005546610016067658227181318892" 1640 "914686508281007582655667597441346214499847364272258631922040641860333431" 1641 "409838623713258383681350233064164940590695888300919626215847587544298023" 1642 "636416943680102708406086295669759876682046839368574433996997648445207805" 1643 "615784339667691231286807666753972942872019850432610318031627872612657513" 1644 "588188267160616660825719678199868371370527508463011236193719286066916786" 1645 "169956541349011494927225747024994619057884118692213564790598702879596058" 1646 "672338334720925179141906809470606964896245458600635183723159228561689808" 1647 "246141482736625197373238197777325580142168245885279594913851700941789475" 1648 "252421784152262567254611571822468808675893407728003047921107885664474662" 1649 "930921581384003950729114103689170603748380178682003976896397305836815761" 1650 "717676338115866650889936516794601457549097578905329423919798362140648664" 1651 "569177147076571576101649257502509463877402424847669830852345415301684820" 1652 "395813946416649808062227494112874521812750160935760825922220707178083076" 1653 "380203450993589198835885505461509442443773367592842795410339065860781804" 1654 "024975272228687688301824830333940416256885455008512598774611538878683158" 1655 "183931461086893832255176926531299425504132104728730288984598001187854507" 1656 "900417184206801359847651992484444933900133130832052346600926424167009902" 1657 "829803553087005800387704758687923428053612864451456596148162238935900033" 1658 "917094683141205188616000211702577553792389670853917118547527592495253773" 1659 "028135298405566315903922235989614934474805789300370437580494193066066314" 1660 "056627605207631392651010580925826419831250810981343093764403877594495896" 1661 "516881097415880926429607388979497471571321217205535961262051641426436441" 1662 "668989765107456413733909427384182109285933511623871034309722437967253289" 1663 "084018145083721513211807496392673952789642893241520398827805325610653506" 1664 "029060153153064455898648607959013571280930834475689835845791849456112104" 1665 "462337569019001580859906425911782967213265389744605395555069797947978230" 1666 "708108432086217134763779632408473684293543722127232658767439906910370146" 1667 "716836295909075482355827087389127370874842532825987593970846704144140471" 1668 "956027276735614286138656432085771988513977140957180090146798065497158947" 1669 "229765733489703157617307078835099906185890777007500964162371428641176460" 1670 "739074789794941408428328217107759915202650066155868439585510978709442590" 1671 "231934194956788626761834746430104077432547436359522462253411168467463134" 1672 "24896.000000"); 1673 1674 written = 1675 LIBC_NAMESPACE::sprintf(big_buff, "%Lf", 0xf.fffffffffffffffp+16380L); 1676 ASSERT_STREQ_LEN( 1677 written, big_buff, 1678 "118973149535723176502126385303097020516906332229462420044032373389173700" 1679 "552297072261641029033652888285354569780749557731442744315367028843419812" 1680 "557385374367867359320070697326320191591828296152436552951064679108661431" 1681 "179063216977883889613478656060039914875343321145491116008867984515486651" 1682 "285234014977303760000912547939396622315138362241783854274391783813871780" 1683 "588948754057516822634765923557697480511372564902088485522249479139937758" 1684 "502601177354918009979622602685950855888360815984690023564513234659447638" 1685 "493985927645628457966177293040780660922910271504608538808795932778162298" 1686 "682754783076808004015069494230341172895777710033571401055977524212405734" 1687 "700738625166011082837911962300846927720096515350020847447079244384854591" 1688 "288672300061908512647211195136146752763351956292759795725027800298079590" 1689 "419313960302147099703527646744553092202267965628099149823208332964124103" 1690 "850923918473478612192169721054348428704835340811304257300221642134891734" 1691 "717423480071488075100206439051723424765600472176809648610799494341570347" 1692 "632064355862420744350442438056613601760883747816538902780957697597728686" 1693 "007148702828795556714140463261583262360276289631617397848425448686060994" 1694 "827086796804807870251185893083854658422304090880599629459458620190376604" 1695 "844679092600222541053077590106576067134720012584640695703025713896098375" 1696 "799892695455305236856075868317922311363951946885088077187210470520395758" 1697 "748001314313144425494391994017575316933939236688185618912993172910425292" 1698 "123683515992232205099800167710278403536014082929639811512287776813570604" 1699 "578934353545169653956125404884644716978689321167108722908808277835051822" 1700 "885764606221873970285165508372099234948333443522898475123275372663606621" 1701 "390228126470623407535207172405866507951821730346378263135339370677490195" 1702 "019784169044182473806316282858685774143258116536404021840272491339332094" 1703 "921949842244273042701987304453662035026238695780468200360144729199712309" 1704 "553005720614186697485284685618651483271597448120312194675168637934309618" 1705 "961510733006555242148519520176285859509105183947250286387163249416761380" 1706 "499631979144187025430270675849519200883791516940158174004671147787720145" 1707 "964446117520405945350476472180797576111172084627363927960033967047003761" 1708 "337450955318415007379641260504792325166135484129188421134082301547330475" 1709 "406707281876350361733290800595189632520707167390454777712968226520622565" 1710 "143991937680440029238090311243791261477625596469422198137514696707944687" 1711 "035800439250765945161837981185939204954403611491531078225107269148697980" 1712 "924094677214272701240437718740921675661363493890045123235166814608932240" 1713 "069799317601780533819184998193300841098599393876029260139091141452600372" 1714 "028487213241195542428210183120421610446740462163533690058366460659115629" 1715 "876474552506814500393294140413149540067760295100596225302282300363147382" 1716 "468105964844244132486457313743759509641616804802412935187620466813563687" 1717 "753281467553879887177183651289394719533506188500326760735438867336800207" 1718 "438784965701457609034985757124304510203873049485425670247933932280911052" 1719 "604153852899484920399109194612991249163328991799809438033787952209313146" 1720 "694614970593966415237594928589096048991612194498998638483702248667224914" 1721 "892467841020618336462741696957630763248023558797524525373703543388296086" 1722 "275342774001633343405508353704850737454481975472222897528108302089868263" 1723 "302028525992308416805453968791141829762998896457648276528750456285492426" 1724 "516521775079951625966922911497778896235667095662713848201819134832168799" 1725 "586365263762097828507009933729439678463987902491451422274252700636394232" 1726 "799848397673998715441855420156224415492665301451550468548925862027608576" 1727 "183712976335876121538256512963353814166394951655600026415918655485005705" 1728 "261143195291991880795452239464962763563017858089669222640623538289853586" 1729 "759599064700838568712381032959192649484625076899225841930548076362021508" 1730 "902214922052806984201835084058693849381549890944546197789302911357651677" 1731 "540623227829831403347327660395223160342282471752818181884430488092132193" 1732 "355086987339586127607367086665237555567580317149010847732009642431878007" 1733 "000879734603290627894355374356444885190719161645514115576193939969076741" 1734 "515640282654366402676009508752394550734155613586793306603174472092444651" 1735 "353236664764973540085196704077110364053815007348689179836404957060618953" 1736 "500508984091382686953509006678332447257871219660441528492484004185093281" 1737 "190896363417573989716659600075948780061916409485433875852065711654107226" 1738 "099628815012314437794400874930194474433078438899570184271000480830501217" 1739 "712356062289507626904285680004771889315808935851559386317665294808903126" 1740 "774702966254511086154895839508779675546413794489596052797520987481383976" 1741 "257859210575628440175934932416214833956535018919681138909184379573470326" 1742 "940634289008780584694035245347939808067427323629788710086717580253156130" 1743 "235606487870925986528841635097252953709111431720488774740553905400942537" 1744 "542411931794417513706468964386151771884986701034153254238591108962471088" 1745 "538580868883777725864856414593426212108664758848926003176234596076950884" 1746 "9149662444156604419552086811989770240.000000"); 1747 #endif 1748 1749 written = LIBC_NAMESPACE::sprintf(big_buff, "%.10Lf", 1e-10L); 1750 ASSERT_STREQ_LEN(written, big_buff, "0.0000000001"); 1751 1752 #ifndef LIBC_COPT_FLOAT_TO_STR_REDUCED_PRECISION 1753 written = LIBC_NAMESPACE::sprintf(big_buff, "%.7500Lf", 1e-4900L); 1754 ASSERT_STREQ_LEN( 1755 written, big_buff, 1756 "0." 1757 "000000000000000000000000000000000000000000000000000000000000000000000000" 1758 "000000000000000000000000000000000000000000000000000000000000000000000000" 1759 "000000000000000000000000000000000000000000000000000000000000000000000000" 1760 "000000000000000000000000000000000000000000000000000000000000000000000000" 1761 "000000000000000000000000000000000000000000000000000000000000000000000000" 1762 "000000000000000000000000000000000000000000000000000000000000000000000000" 1763 "000000000000000000000000000000000000000000000000000000000000000000000000" 1764 "000000000000000000000000000000000000000000000000000000000000000000000000" 1765 "000000000000000000000000000000000000000000000000000000000000000000000000" 1766 "000000000000000000000000000000000000000000000000000000000000000000000000" 1767 "000000000000000000000000000000000000000000000000000000000000000000000000" 1768 "000000000000000000000000000000000000000000000000000000000000000000000000" 1769 "000000000000000000000000000000000000000000000000000000000000000000000000" 1770 "000000000000000000000000000000000000000000000000000000000000000000000000" 1771 "000000000000000000000000000000000000000000000000000000000000000000000000" 1772 "000000000000000000000000000000000000000000000000000000000000000000000000" 1773 "000000000000000000000000000000000000000000000000000000000000000000000000" 1774 "000000000000000000000000000000000000000000000000000000000000000000000000" 1775 "000000000000000000000000000000000000000000000000000000000000000000000000" 1776 "000000000000000000000000000000000000000000000000000000000000000000000000" 1777 "000000000000000000000000000000000000000000000000000000000000000000000000" 1778 "000000000000000000000000000000000000000000000000000000000000000000000000" 1779 "000000000000000000000000000000000000000000000000000000000000000000000000" 1780 "000000000000000000000000000000000000000000000000000000000000000000000000" 1781 "000000000000000000000000000000000000000000000000000000000000000000000000" 1782 "000000000000000000000000000000000000000000000000000000000000000000000000" 1783 "000000000000000000000000000000000000000000000000000000000000000000000000" 1784 "000000000000000000000000000000000000000000000000000000000000000000000000" 1785 "000000000000000000000000000000000000000000000000000000000000000000000000" 1786 "000000000000000000000000000000000000000000000000000000000000000000000000" 1787 "000000000000000000000000000000000000000000000000000000000000000000000000" 1788 "000000000000000000000000000000000000000000000000000000000000000000000000" 1789 "000000000000000000000000000000000000000000000000000000000000000000000000" 1790 "000000000000000000000000000000000000000000000000000000000000000000000000" 1791 "000000000000000000000000000000000000000000000000000000000000000000000000" 1792 "000000000000000000000000000000000000000000000000000000000000000000000000" 1793 "000000000000000000000000000000000000000000000000000000000000000000000000" 1794 "000000000000000000000000000000000000000000000000000000000000000000000000" 1795 "000000000000000000000000000000000000000000000000000000000000000000000000" 1796 "000000000000000000000000000000000000000000000000000000000000000000000000" 1797 "000000000000000000000000000000000000000000000000000000000000000000000000" 1798 "000000000000000000000000000000000000000000000000000000000000000000000000" 1799 "000000000000000000000000000000000000000000000000000000000000000000000000" 1800 "000000000000000000000000000000000000000000000000000000000000000000000000" 1801 "000000000000000000000000000000000000000000000000000000000000000000000000" 1802 "000000000000000000000000000000000000000000000000000000000000000000000000" 1803 "000000000000000000000000000000000000000000000000000000000000000000000000" 1804 "000000000000000000000000000000000000000000000000000000000000000000000000" 1805 "000000000000000000000000000000000000000000000000000000000000000000000000" 1806 "000000000000000000000000000000000000000000000000000000000000000000000000" 1807 "000000000000000000000000000000000000000000000000000000000000000000000000" 1808 "000000000000000000000000000000000000000000000000000000000000000000000000" 1809 "000000000000000000000000000000000000000000000000000000000000000000000000" 1810 "000000000000000000000000000000000000000000000000000000000000000000000000" 1811 "000000000000000000000000000000000000000000000000000000000000000000000000" 1812 "000000000000000000000000000000000000000000000000000000000000000000000000" 1813 "000000000000000000000000000000000000000000000000000000000000000000000000" 1814 "000000000000000000000000000000000000000000000000000000000000000000000000" 1815 "000000000000000000000000000000000000000000000000000000000000000000000000" 1816 "000000000000000000000000000000000000000000000000000000000000000000000000" 1817 "000000000000000000000000000000000000000000000000000000000000000000000000" 1818 "000000000000000000000000000000000000000000000000000000000000000000000000" 1819 "000000000000000000000000000000000000000000000000000000000000000000000000" 1820 "000000000000000000000000000000000000000000000000000000000000000000000000" 1821 "000000000000000000000000000000000000000000000000000000000000000000000000" 1822 "000000000000000000000000000000000000000000000000000000000000000000000000" 1823 "000000000000000000000000000000000000000000000000000000000000000000000000" 1824 "000000000000000000000000000000000000000000000000000000000000000000000000" 1825 "000099999999999999999996962764452956071352139203248614920751610856665084" 1826 "549214352477698417183862158583009348897567779527408501588132175167211539" 1827 "462139941448204886585901454195352527238724272760638086779284030512649793" 1828 "039219351187928723378036480041948464946018272171365770411701020666925613" 1829 "422460317465324758217878522666789603627480490870456508256359180089236338" 1830 "765625231186929290294207420828927406735690318849109129700396907705735097" 1831 "663944722727287361650042373203763784830198232253311807069225650324196304" 1832 "532045014970637489181357566354288111205943347410488298480279857453705249" 1833 "232862728556860184412369114663536200895729846877559808001004454634804626" 1834 "541455540260282018142615835686583304903486353937549394736905011798466731" 1835 "536563240053860118551127061960208467764243724656897127545613968909523389" 1836 "577188368809623987105800147797280462974804046545425080530020901531407223" 1837 "191237123282274818236437397994019915368657474589800678444589412286037789" 1838 "891525464936023205313685584525510094270344601331453730179416773626565262" 1839 "480345858564672442896904520146956686863172737711483866766404977719744767" 1840 "834324844875237277613991088218774564658513875732403456058414595576806383" 1841 "115554713240005982141397577420073082470139244845624915873825746771661332" 1842 "098677966580506186966978746832443976821987300902957597498388211921362869" 1843 "017846215557612829071692275292036211064515305528052919611691470945774714" 1844 "135516559501572279732350629089770249554808690411603894492333360300589658" 1845 "470898965370892774715815089075170720164713889237058574941489766701880158" 1846 "060081295483989540170337129032188818293132770882381428397119039835946745" 1847 "549356649433406617266370644136291924838857814675939156677910783740103207" 1848 "523299367093130816446415259371931925208362367989095199399211644084543790" 1849 "110432339056231037520216864358899218874658268610955002763260912337688947" 1850 "822453100821038299301092582962825965939081817836419126254832772002214908" 1851 "085575905761843610944187009818156363893015929300295112598059949496854566" 1852 "638748010633726861510500653821408135845840123073754133549077708843800674" 1853 "328440913743105608636458354618912183716456158809545183074062249922212944" 1854 "249667793845728355381309084891765979111348980470647082269921872595470473" 1855 "719354467594516320911964549508538492057120740224559944452120552719041944" 1856 "961475548547884309626382512432626380881023756568143060204097921571153170" 1857 "723817845809196253498326358439807445210362177680590181657555380795450462" 1858 "223805222580359379367452693270553602179122419370586308101820559214330382" 1859 "570449525088342437216896462077260223998756027453411520977536701491759878" 1860 "422771447006016890777855573925295187921971811871399320142563330377888532" 1861 "179817332113"); 1862 #endif 1863 #endif // LIBC_TYPES_LONG_DOUBLE_IS_X86_FLOAT80 1864 } 1865 1866 TEST(LlvmLibcSPrintfTest, FloatExponentConv) { 1867 char buff[1000]; 1868 int written; 1869 1870 ForceRoundingMode r(RoundingMode::Nearest); 1871 double inf = LIBC_NAMESPACE::fputil::FPBits<double>::inf().get_val(); 1872 double nan = LIBC_NAMESPACE::fputil::FPBits<double>::quiet_nan().get_val(); 1873 1874 written = LIBC_NAMESPACE::sprintf(buff, "%e", 1.0); 1875 ASSERT_STREQ_LEN(written, buff, "1.000000e+00"); 1876 1877 written = LIBC_NAMESPACE::sprintf(buff, "%E", -1.0); 1878 ASSERT_STREQ_LEN(written, buff, "-1.000000E+00"); 1879 1880 written = LIBC_NAMESPACE::sprintf(buff, "%e", -1.234567); 1881 ASSERT_STREQ_LEN(written, buff, "-1.234567e+00"); 1882 1883 written = LIBC_NAMESPACE::sprintf(buff, "%e", 0.0); 1884 ASSERT_STREQ_LEN(written, buff, "0.000000e+00"); 1885 1886 written = LIBC_NAMESPACE::sprintf(buff, "%e", 1.5); 1887 ASSERT_STREQ_LEN(written, buff, "1.500000e+00"); 1888 1889 written = LIBC_NAMESPACE::sprintf(buff, "%e", 1e300); 1890 ASSERT_STREQ_LEN(written, buff, "1.000000e+300"); 1891 1892 written = LIBC_NAMESPACE::sprintf(buff, "%e", 0.1); 1893 ASSERT_STREQ_LEN(written, buff, "1.000000e-01"); 1894 1895 written = LIBC_NAMESPACE::sprintf(buff, "%e", 0.001); 1896 ASSERT_STREQ_LEN(written, buff, "1.000000e-03"); 1897 1898 written = LIBC_NAMESPACE::sprintf(buff, "%e", 0.00001); 1899 ASSERT_STREQ_LEN(written, buff, "1.000000e-05"); 1900 1901 written = LIBC_NAMESPACE::sprintf(buff, "%e", 0.0000001); 1902 ASSERT_STREQ_LEN(written, buff, "1.000000e-07"); 1903 1904 written = LIBC_NAMESPACE::sprintf(buff, "%e", 0.000000001); 1905 ASSERT_STREQ_LEN(written, buff, "1.000000e-09"); 1906 1907 written = LIBC_NAMESPACE::sprintf(buff, "%e", 1.0e-20); 1908 ASSERT_STREQ_LEN(written, buff, "1.000000e-20"); 1909 1910 written = LIBC_NAMESPACE::sprintf(buff, "%e", 1234567890123456789.0); 1911 ASSERT_STREQ_LEN(written, buff, "1.234568e+18"); 1912 1913 written = LIBC_NAMESPACE::sprintf(buff, "%e", 9999999000000.00); 1914 ASSERT_STREQ_LEN(written, buff, "9.999999e+12"); 1915 1916 // Simple Subnormal Tests. 1917 1918 written = LIBC_NAMESPACE::sprintf(buff, "%e", 0x1.0p-1027); 1919 ASSERT_STREQ_LEN(written, buff, "6.953356e-310"); 1920 1921 written = LIBC_NAMESPACE::sprintf(buff, "%e", 0x1.0p-1074); 1922 ASSERT_STREQ_LEN(written, buff, "4.940656e-324"); 1923 1924 // Inf/Nan Tests. 1925 1926 written = LIBC_NAMESPACE::sprintf(buff, "%e", inf); 1927 ASSERT_STREQ_LEN(written, buff, "inf"); 1928 1929 written = LIBC_NAMESPACE::sprintf(buff, "%E", -inf); 1930 ASSERT_STREQ_LEN(written, buff, "-INF"); 1931 1932 written = LIBC_NAMESPACE::sprintf(buff, "%e", nan); 1933 ASSERT_STREQ_LEN(written, buff, "nan"); 1934 1935 written = LIBC_NAMESPACE::sprintf(buff, "%E", -nan); 1936 ASSERT_STREQ_LEN(written, buff, "-NAN"); 1937 1938 // Min Width Tests. 1939 1940 written = LIBC_NAMESPACE::sprintf(buff, "%15e", 1.0); 1941 ASSERT_STREQ_LEN(written, buff, " 1.000000e+00"); 1942 1943 written = LIBC_NAMESPACE::sprintf(buff, "%15e", -1.0); 1944 ASSERT_STREQ_LEN(written, buff, " -1.000000e+00"); 1945 1946 written = LIBC_NAMESPACE::sprintf(buff, "%15e", 1.0e5); 1947 ASSERT_STREQ_LEN(written, buff, " 1.000000e+05"); 1948 1949 written = LIBC_NAMESPACE::sprintf(buff, "%15e", -1.0e5); 1950 ASSERT_STREQ_LEN(written, buff, " -1.000000e+05"); 1951 1952 written = LIBC_NAMESPACE::sprintf(buff, "%10e", 1.0e-5); 1953 ASSERT_STREQ_LEN(written, buff, "1.000000e-05"); 1954 1955 // Precision Tests. 1956 1957 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.0); 1958 ASSERT_STREQ_LEN(written, buff, "1.0e+00"); 1959 1960 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 0.0); 1961 ASSERT_STREQ_LEN(written, buff, "0.0e+00"); 1962 1963 written = LIBC_NAMESPACE::sprintf(buff, "%.0e", 0.0); 1964 ASSERT_STREQ_LEN(written, buff, "0e+00"); 1965 1966 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 0.1); 1967 ASSERT_STREQ_LEN(written, buff, "1.0e-01"); 1968 1969 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.09); 1970 ASSERT_STREQ_LEN(written, buff, "1.1e+00"); 1971 1972 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.04); 1973 ASSERT_STREQ_LEN(written, buff, "1.0e+00"); 1974 1975 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.19); 1976 ASSERT_STREQ_LEN(written, buff, "1.2e+00"); 1977 1978 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.99); 1979 ASSERT_STREQ_LEN(written, buff, "2.0e+00"); 1980 1981 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 9.99); 1982 ASSERT_STREQ_LEN(written, buff, "1.0e+01"); 1983 1984 written = LIBC_NAMESPACE::sprintf(buff, "%.2e", 99.9); 1985 ASSERT_STREQ_LEN(written, buff, "9.99e+01"); 1986 1987 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 99.9); 1988 ASSERT_STREQ_LEN(written, buff, "1.0e+02"); 1989 1990 written = LIBC_NAMESPACE::sprintf(buff, "%.5e", 1.25); 1991 ASSERT_STREQ_LEN(written, buff, "1.25000e+00"); 1992 1993 written = LIBC_NAMESPACE::sprintf(buff, "%.0e", 1.25); 1994 ASSERT_STREQ_LEN(written, buff, "1e+00"); 1995 1996 written = LIBC_NAMESPACE::sprintf(buff, "%.0e", 1.75); 1997 ASSERT_STREQ_LEN(written, buff, "2e+00"); 1998 1999 written = LIBC_NAMESPACE::sprintf(buff, "%.20e", 1.234e-10); 2000 ASSERT_STREQ_LEN(written, buff, "1.23400000000000008140e-10"); 2001 2002 written = LIBC_NAMESPACE::sprintf(buff, "%.2e", -9.99); 2003 ASSERT_STREQ_LEN(written, buff, "-9.99e+00"); 2004 2005 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -9.99); 2006 ASSERT_STREQ_LEN(written, buff, "-1.0e+01"); 2007 2008 written = LIBC_NAMESPACE::sprintf(buff, "%.5e", 0.0); 2009 ASSERT_STREQ_LEN(written, buff, "0.00000e+00"); 2010 2011 written = LIBC_NAMESPACE::sprintf(buff, "%.5e", 1.008); 2012 ASSERT_STREQ_LEN(written, buff, "1.00800e+00"); 2013 2014 written = LIBC_NAMESPACE::sprintf(buff, "%.5e", 1.008e3); 2015 ASSERT_STREQ_LEN(written, buff, "1.00800e+03"); 2016 2017 // These tests also focus on rounding. Almost all of them have a 5 right after 2018 // the printed string (e.g. 9.5 with precision 0 prints 0 digits after the 2019 // decimal point). This is again because rounding a number with a 5 after the 2020 // printed section means that more digits have to be checked to determine if 2021 // this should be rounded up (if there are non-zero digits after the 5) or to 2022 // even (if the 5 is the last non-zero digit). Additionally, the algorithm for 2023 // checking if a number is all 0s after the decimal point may not work since 2024 // the decimal point moves in this representation. 2025 written = LIBC_NAMESPACE::sprintf(buff, "%.0e", 2.5812229360061737E+200); 2026 ASSERT_STREQ_LEN(written, buff, "3e+200"); 2027 2028 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 9.059E+200); 2029 ASSERT_STREQ_LEN(written, buff, "9.1e+200"); 2030 2031 written = LIBC_NAMESPACE::sprintf(buff, "%.0e", 9.059E+200); 2032 ASSERT_STREQ_LEN(written, buff, "9e+200"); 2033 2034 #ifndef LIBC_COPT_FLOAT_TO_STR_REDUCED_PRECISION 2035 written = LIBC_NAMESPACE::sprintf(buff, "%.166e", 1.131959884853339E-72); 2036 ASSERT_STREQ_LEN(written, buff, 2037 "1." 2038 "13195988485333904593863991136097397258531639976739227369782" 2039 "68612419376648241056393424414314951197624317440549121097287" 2040 "069853416091591569170304865110665559768676757812e-72"); 2041 #endif 2042 2043 written = LIBC_NAMESPACE::sprintf(buff, "%.0e", 9.5); 2044 ASSERT_STREQ_LEN(written, buff, "1e+01"); 2045 2046 written = LIBC_NAMESPACE::sprintf(buff, "%.10e", 1.9999999999890936); 2047 ASSERT_STREQ_LEN(written, buff, "2.0000000000e+00"); 2048 2049 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 745362143563.03894); 2050 ASSERT_STREQ_LEN(written, buff, "7.5e+11"); 2051 2052 written = LIBC_NAMESPACE::sprintf(buff, "%.0e", 45181042688.0); 2053 ASSERT_STREQ_LEN(written, buff, "5e+10"); 2054 2055 written = LIBC_NAMESPACE::sprintf(buff, "%.35e", 1.3752441369139243); 2056 ASSERT_STREQ_LEN(written, buff, "1.37524413691392433101157166674965993e+00"); 2057 2058 // Subnormal Precision Tests 2059 2060 #ifndef LIBC_COPT_FLOAT_TO_STR_REDUCED_PRECISION 2061 written = LIBC_NAMESPACE::sprintf(buff, "%.310e", 0x1.0p-1022); 2062 ASSERT_STREQ_LEN( 2063 written, buff, 2064 "2." 2065 "225073858507201383090232717332404064219215980462331830553327416887204434" 2066 "813918195854283159012511020564067339731035811005152434161553460108856012" 2067 "385377718821130777993532002330479610147442583636071921565046942503734208" 2068 "375250806650616658158948720491179968591639648500635908770118304874799780" 2069 "8877537499494515804516e-308"); 2070 #endif 2071 2072 written = LIBC_NAMESPACE::sprintf(buff, "%.30e", 0x1.0p-1022); 2073 ASSERT_STREQ_LEN(written, buff, "2.225073858507201383090232717332e-308"); 2074 2075 #ifndef LIBC_COPT_FLOAT_TO_STR_REDUCED_PRECISION 2076 written = LIBC_NAMESPACE::sprintf(buff, "%.310e", 0x1.0p-1023); 2077 ASSERT_STREQ_LEN( 2078 written, buff, 2079 "1." 2080 "112536929253600691545116358666202032109607990231165915276663708443602217" 2081 "406959097927141579506255510282033669865517905502576217080776730054428006" 2082 "192688859410565388996766001165239805073721291818035960782523471251867104" 2083 "187625403325308329079474360245589984295819824250317954385059152437399890" 2084 "4438768749747257902258e-308"); 2085 #endif 2086 2087 written = LIBC_NAMESPACE::sprintf(buff, "%.6e", 9.99999e-310); 2088 ASSERT_STREQ_LEN(written, buff, "9.999990e-310"); 2089 2090 written = LIBC_NAMESPACE::sprintf(buff, "%.5e", 9.99999e-310); 2091 ASSERT_STREQ_LEN(written, buff, "9.99999e-310"); 2092 2093 written = LIBC_NAMESPACE::sprintf(buff, "%.4e", 9.99999e-310); 2094 ASSERT_STREQ_LEN(written, buff, "1.0000e-309"); 2095 2096 written = LIBC_NAMESPACE::sprintf(buff, "%.3e", 9.99999e-310); 2097 ASSERT_STREQ_LEN(written, buff, "1.000e-309"); 2098 2099 written = LIBC_NAMESPACE::sprintf(buff, "%.2e", 9.99999e-310); 2100 ASSERT_STREQ_LEN(written, buff, "1.00e-309"); 2101 2102 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 9.99999e-310); 2103 ASSERT_STREQ_LEN(written, buff, "1.0e-309"); 2104 2105 written = LIBC_NAMESPACE::sprintf(buff, "%.0e", 9.99999e-310); 2106 ASSERT_STREQ_LEN(written, buff, "1e-309"); 2107 2108 written = LIBC_NAMESPACE::sprintf(buff, "%.10e", 0x1.0p-1074); 2109 ASSERT_STREQ_LEN(written, buff, "4.9406564584e-324"); 2110 2111 // Rounding Mode Tests. 2112 2113 if (ForceRoundingMode r(RoundingMode::Nearest); r.success) { 2114 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.75); 2115 ASSERT_STREQ_LEN(written, buff, "1.8e+00"); 2116 2117 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.25); 2118 ASSERT_STREQ_LEN(written, buff, "1.2e+00"); 2119 2120 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.125); 2121 ASSERT_STREQ_LEN(written, buff, "1.1e+00"); 2122 2123 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.625); 2124 ASSERT_STREQ_LEN(written, buff, "1.6e+00"); 2125 2126 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.375); 2127 ASSERT_STREQ_LEN(written, buff, "1.4e+00"); 2128 2129 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.875); 2130 ASSERT_STREQ_LEN(written, buff, "1.9e+00"); 2131 2132 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -1.75); 2133 ASSERT_STREQ_LEN(written, buff, "-1.8e+00"); 2134 2135 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -1.25); 2136 ASSERT_STREQ_LEN(written, buff, "-1.2e+00"); 2137 2138 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -1.125); 2139 ASSERT_STREQ_LEN(written, buff, "-1.1e+00"); 2140 2141 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -1.625); 2142 ASSERT_STREQ_LEN(written, buff, "-1.6e+00"); 2143 2144 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -1.375); 2145 ASSERT_STREQ_LEN(written, buff, "-1.4e+00"); 2146 2147 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -1.875); 2148 ASSERT_STREQ_LEN(written, buff, "-1.9e+00"); 2149 } 2150 2151 if (ForceRoundingMode r(RoundingMode::Upward); r.success) { 2152 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.75); 2153 ASSERT_STREQ_LEN(written, buff, "1.8e+00"); 2154 2155 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.25); 2156 ASSERT_STREQ_LEN(written, buff, "1.3e+00"); 2157 2158 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.125); 2159 ASSERT_STREQ_LEN(written, buff, "1.2e+00"); 2160 2161 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.625); 2162 ASSERT_STREQ_LEN(written, buff, "1.7e+00"); 2163 2164 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.375); 2165 ASSERT_STREQ_LEN(written, buff, "1.4e+00"); 2166 2167 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.875); 2168 ASSERT_STREQ_LEN(written, buff, "1.9e+00"); 2169 2170 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -1.75); 2171 ASSERT_STREQ_LEN(written, buff, "-1.7e+00"); 2172 2173 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -1.25); 2174 ASSERT_STREQ_LEN(written, buff, "-1.2e+00"); 2175 2176 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -1.125); 2177 ASSERT_STREQ_LEN(written, buff, "-1.1e+00"); 2178 2179 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -1.625); 2180 ASSERT_STREQ_LEN(written, buff, "-1.6e+00"); 2181 2182 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -1.375); 2183 ASSERT_STREQ_LEN(written, buff, "-1.3e+00"); 2184 2185 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -1.875); 2186 ASSERT_STREQ_LEN(written, buff, "-1.8e+00"); 2187 } 2188 2189 if (ForceRoundingMode r(RoundingMode::Downward); r.success) { 2190 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.75); 2191 ASSERT_STREQ_LEN(written, buff, "1.7e+00"); 2192 2193 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.25); 2194 ASSERT_STREQ_LEN(written, buff, "1.2e+00"); 2195 2196 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.125); 2197 ASSERT_STREQ_LEN(written, buff, "1.1e+00"); 2198 2199 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.625); 2200 ASSERT_STREQ_LEN(written, buff, "1.6e+00"); 2201 2202 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.375); 2203 ASSERT_STREQ_LEN(written, buff, "1.3e+00"); 2204 2205 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.875); 2206 ASSERT_STREQ_LEN(written, buff, "1.8e+00"); 2207 2208 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -1.75); 2209 ASSERT_STREQ_LEN(written, buff, "-1.8e+00"); 2210 2211 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -1.25); 2212 ASSERT_STREQ_LEN(written, buff, "-1.3e+00"); 2213 2214 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -1.125); 2215 ASSERT_STREQ_LEN(written, buff, "-1.2e+00"); 2216 2217 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -1.625); 2218 ASSERT_STREQ_LEN(written, buff, "-1.7e+00"); 2219 2220 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -1.375); 2221 ASSERT_STREQ_LEN(written, buff, "-1.4e+00"); 2222 2223 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -1.875); 2224 ASSERT_STREQ_LEN(written, buff, "-1.9e+00"); 2225 } 2226 2227 if (ForceRoundingMode r(RoundingMode::TowardZero); r.success) { 2228 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.75); 2229 ASSERT_STREQ_LEN(written, buff, "1.7e+00"); 2230 2231 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.25); 2232 ASSERT_STREQ_LEN(written, buff, "1.2e+00"); 2233 2234 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.125); 2235 ASSERT_STREQ_LEN(written, buff, "1.1e+00"); 2236 2237 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.625); 2238 ASSERT_STREQ_LEN(written, buff, "1.6e+00"); 2239 2240 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.375); 2241 ASSERT_STREQ_LEN(written, buff, "1.3e+00"); 2242 2243 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.875); 2244 ASSERT_STREQ_LEN(written, buff, "1.8e+00"); 2245 2246 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -1.75); 2247 ASSERT_STREQ_LEN(written, buff, "-1.7e+00"); 2248 2249 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -1.25); 2250 ASSERT_STREQ_LEN(written, buff, "-1.2e+00"); 2251 2252 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -1.125); 2253 ASSERT_STREQ_LEN(written, buff, "-1.1e+00"); 2254 2255 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -1.625); 2256 ASSERT_STREQ_LEN(written, buff, "-1.6e+00"); 2257 2258 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -1.375); 2259 ASSERT_STREQ_LEN(written, buff, "-1.3e+00"); 2260 2261 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -1.875); 2262 ASSERT_STREQ_LEN(written, buff, "-1.8e+00"); 2263 } 2264 2265 // Flag Tests. 2266 written = LIBC_NAMESPACE::sprintf(buff, "%+e", 1.0); 2267 ASSERT_STREQ_LEN(written, buff, "+1.000000e+00"); 2268 2269 written = LIBC_NAMESPACE::sprintf(buff, "%+e", -1.0); 2270 ASSERT_STREQ_LEN(written, buff, "-1.000000e+00"); 2271 2272 written = LIBC_NAMESPACE::sprintf(buff, "% e", 1.0); 2273 ASSERT_STREQ_LEN(written, buff, " 1.000000e+00"); 2274 2275 written = LIBC_NAMESPACE::sprintf(buff, "% e", -1.0); 2276 ASSERT_STREQ_LEN(written, buff, "-1.000000e+00"); 2277 2278 written = LIBC_NAMESPACE::sprintf(buff, "%-15e", 1.5); 2279 ASSERT_STREQ_LEN(written, buff, "1.500000e+00 "); 2280 2281 written = LIBC_NAMESPACE::sprintf(buff, "%#.e", 1.0); 2282 ASSERT_STREQ_LEN(written, buff, "1.e+00"); 2283 2284 written = LIBC_NAMESPACE::sprintf(buff, "%#.0e", 1.5); 2285 ASSERT_STREQ_LEN(written, buff, "2.e+00"); 2286 2287 written = LIBC_NAMESPACE::sprintf(buff, "%015e", 1.5); 2288 ASSERT_STREQ_LEN(written, buff, "0001.500000e+00"); 2289 2290 written = LIBC_NAMESPACE::sprintf(buff, "%015e", -1.5); 2291 ASSERT_STREQ_LEN(written, buff, "-001.500000e+00"); 2292 2293 written = LIBC_NAMESPACE::sprintf(buff, "%+- #0e", 0.0); 2294 ASSERT_STREQ_LEN(written, buff, "+0.000000e+00"); 2295 2296 // Combined Tests. 2297 2298 written = LIBC_NAMESPACE::sprintf(buff, "%10.2e", 9.99); 2299 ASSERT_STREQ_LEN(written, buff, " 9.99e+00"); 2300 2301 written = LIBC_NAMESPACE::sprintf(buff, "%10.1e", 9.99); 2302 ASSERT_STREQ_LEN(written, buff, " 1.0e+01"); 2303 2304 written = LIBC_NAMESPACE::sprintf(buff, "%10.0e", 9.99); 2305 ASSERT_STREQ_LEN(written, buff, " 1e+01"); 2306 2307 written = LIBC_NAMESPACE::sprintf(buff, "%10.0e", 0.0999); 2308 ASSERT_STREQ_LEN(written, buff, " 1e-01"); 2309 2310 written = LIBC_NAMESPACE::sprintf(buff, "%-10.2e", 9.99); 2311 ASSERT_STREQ_LEN(written, buff, "9.99e+00 "); 2312 2313 written = LIBC_NAMESPACE::sprintf(buff, "%-10.1e", 9.99); 2314 ASSERT_STREQ_LEN(written, buff, "1.0e+01 "); 2315 2316 written = LIBC_NAMESPACE::sprintf(buff, "%-10.1e", 1.0e-50); 2317 ASSERT_STREQ_LEN(written, buff, "1.0e-50 "); 2318 2319 written = LIBC_NAMESPACE::sprintf(buff, "%30e", 1234567890123456789.0); 2320 ASSERT_STREQ_LEN(written, buff, " 1.234568e+18"); 2321 2322 written = LIBC_NAMESPACE::sprintf(buff, "%-30e", 1234567890123456789.0); 2323 ASSERT_STREQ_LEN(written, buff, "1.234568e+18 "); 2324 2325 written = LIBC_NAMESPACE::sprintf(buff, "%25.14e", 9999999999999.99); 2326 ASSERT_STREQ_LEN(written, buff, " 9.99999999999999e+12"); 2327 2328 written = LIBC_NAMESPACE::sprintf(buff, "%25.13e", 9999999999999.99); 2329 ASSERT_STREQ_LEN(written, buff, " 1.0000000000000e+13"); 2330 2331 written = LIBC_NAMESPACE::sprintf(buff, "%25.12e", 9999999999999.99); 2332 ASSERT_STREQ_LEN(written, buff, " 1.000000000000e+13"); 2333 2334 written = LIBC_NAMESPACE::sprintf(buff, "%12.3e %-12.3e", 0.1, 256.0); 2335 ASSERT_STREQ_LEN(written, buff, " 1.000e-01 2.560e+02 "); 2336 2337 written = LIBC_NAMESPACE::sprintf(buff, "%+-#12.3e % 012.3e", 0.1256, 1256.0); 2338 ASSERT_STREQ_LEN(written, buff, "+1.256e-01 001.256e+03"); 2339 } 2340 2341 TEST(LlvmLibcSPrintfTest, FloatExponentLongDoubleConv) { 2342 char buff[1000]; 2343 int written; 2344 2345 ForceRoundingMode r(RoundingMode::Nearest); 2346 // Length Modifier Tests. 2347 2348 written = LIBC_NAMESPACE::sprintf(buff, "%.9Le", 1000000000500000000.1L); 2349 ASSERT_STREQ_LEN(written, buff, "1.000000001e+18"); 2350 2351 written = LIBC_NAMESPACE::sprintf(buff, "%.9Le", 1000000000500000000.0L); 2352 ASSERT_STREQ_LEN(written, buff, "1.000000000e+18"); 2353 2354 written = LIBC_NAMESPACE::sprintf(buff, "%Le", 1e100L); 2355 ASSERT_STREQ_LEN(written, buff, "1.000000e+100"); 2356 2357 written = LIBC_NAMESPACE::sprintf(buff, "%Le", 1.0L); 2358 ASSERT_STREQ_LEN(written, buff, "1.000000e+00"); 2359 2360 #if !defined(LIBC_TYPES_LONG_DOUBLE_IS_DOUBLE) 2361 written = LIBC_NAMESPACE::sprintf(buff, "%Le", 0xf.fffffffffffffffp+16380L); 2362 ASSERT_STREQ_LEN(written, buff, "1.189731e+4932"); 2363 2364 written = LIBC_NAMESPACE::sprintf(buff, "%Le", 1e1000L); 2365 ASSERT_STREQ_LEN(written, buff, "1.000000e+1000"); 2366 2367 written = LIBC_NAMESPACE::sprintf(buff, "%Le", 1e4900L); 2368 ASSERT_STREQ_LEN(written, buff, "1.000000e+4900"); 2369 2370 written = LIBC_NAMESPACE::sprintf(buff, "%Le", 1.2345678e4900L); 2371 ASSERT_STREQ_LEN(written, buff, "1.234568e+4900"); 2372 #endif 2373 } 2374 2375 TEST(LlvmLibcSPrintfTest, FloatAutoConv) { 2376 char buff[1000]; 2377 int written; 2378 2379 ForceRoundingMode r(RoundingMode::Nearest); 2380 double inf = LIBC_NAMESPACE::fputil::FPBits<double>::inf().get_val(); 2381 double nan = LIBC_NAMESPACE::fputil::FPBits<double>::quiet_nan().get_val(); 2382 2383 written = LIBC_NAMESPACE::sprintf(buff, "%g", 1.0); 2384 ASSERT_STREQ_LEN(written, buff, "1"); 2385 2386 written = LIBC_NAMESPACE::sprintf(buff, "%G", -1.0); 2387 ASSERT_STREQ_LEN(written, buff, "-1"); 2388 2389 written = LIBC_NAMESPACE::sprintf(buff, "%g", -1.234567); 2390 ASSERT_STREQ_LEN(written, buff, "-1.23457"); 2391 2392 written = LIBC_NAMESPACE::sprintf(buff, "%g", 0.0); 2393 ASSERT_STREQ_LEN(written, buff, "0"); 2394 2395 written = LIBC_NAMESPACE::sprintf(buff, "%g", -0.0); 2396 ASSERT_STREQ_LEN(written, buff, "-0"); 2397 2398 written = LIBC_NAMESPACE::sprintf(buff, "%g", 1.5); 2399 ASSERT_STREQ_LEN(written, buff, "1.5"); 2400 2401 written = LIBC_NAMESPACE::sprintf(buff, "%g", 1e300); 2402 ASSERT_STREQ_LEN(written, buff, "1e+300"); 2403 2404 written = LIBC_NAMESPACE::sprintf(buff, "%g", 0.1); 2405 ASSERT_STREQ_LEN(written, buff, "0.1"); 2406 2407 written = LIBC_NAMESPACE::sprintf(buff, "%g", 0.001); 2408 ASSERT_STREQ_LEN(written, buff, "0.001"); 2409 2410 written = LIBC_NAMESPACE::sprintf(buff, "%g", 0.00001); 2411 ASSERT_STREQ_LEN(written, buff, "1e-05"); 2412 2413 written = LIBC_NAMESPACE::sprintf(buff, "%g", 0.0000001); 2414 ASSERT_STREQ_LEN(written, buff, "1e-07"); 2415 2416 written = LIBC_NAMESPACE::sprintf(buff, "%g", 0.000000001); 2417 ASSERT_STREQ_LEN(written, buff, "1e-09"); 2418 2419 written = LIBC_NAMESPACE::sprintf(buff, "%g", 1.0e-20); 2420 ASSERT_STREQ_LEN(written, buff, "1e-20"); 2421 2422 written = LIBC_NAMESPACE::sprintf(buff, "%g", 1234567890123456789.0); 2423 ASSERT_STREQ_LEN(written, buff, "1.23457e+18"); 2424 2425 written = LIBC_NAMESPACE::sprintf(buff, "%g", 9999990000000.00); 2426 ASSERT_STREQ_LEN(written, buff, "9.99999e+12"); 2427 2428 written = LIBC_NAMESPACE::sprintf(buff, "%g", 9999999000000.00); 2429 ASSERT_STREQ_LEN(written, buff, "1e+13"); 2430 2431 written = LIBC_NAMESPACE::sprintf(buff, "%g", 0xa.aaaaaaaaaaaaaabp-7); 2432 ASSERT_STREQ_LEN(written, buff, "0.0833333"); 2433 2434 // Simple Subnormal Tests. 2435 2436 written = LIBC_NAMESPACE::sprintf(buff, "%g", 0x1.0p-1027); 2437 ASSERT_STREQ_LEN(written, buff, "6.95336e-310"); 2438 2439 written = LIBC_NAMESPACE::sprintf(buff, "%g", 0x1.0p-1074); 2440 ASSERT_STREQ_LEN(written, buff, "4.94066e-324"); 2441 2442 // Inf/Nan Tests. 2443 2444 written = LIBC_NAMESPACE::sprintf(buff, "%g", inf); 2445 ASSERT_STREQ_LEN(written, buff, "inf"); 2446 2447 written = LIBC_NAMESPACE::sprintf(buff, "%G", -inf); 2448 ASSERT_STREQ_LEN(written, buff, "-INF"); 2449 2450 written = LIBC_NAMESPACE::sprintf(buff, "%g", nan); 2451 ASSERT_STREQ_LEN(written, buff, "nan"); 2452 2453 written = LIBC_NAMESPACE::sprintf(buff, "%G", -nan); 2454 ASSERT_STREQ_LEN(written, buff, "-NAN"); 2455 2456 // Min Width Tests. 2457 2458 written = LIBC_NAMESPACE::sprintf(buff, "%15g", 1.0); 2459 ASSERT_STREQ_LEN(written, buff, " 1"); 2460 2461 written = LIBC_NAMESPACE::sprintf(buff, "%15g", -1.0); 2462 ASSERT_STREQ_LEN(written, buff, " -1"); 2463 2464 written = LIBC_NAMESPACE::sprintf(buff, "%15g", 1.0e5); 2465 ASSERT_STREQ_LEN(written, buff, " 100000"); 2466 2467 written = LIBC_NAMESPACE::sprintf(buff, "%15g", -1.0e5); 2468 ASSERT_STREQ_LEN(written, buff, " -100000"); 2469 2470 written = LIBC_NAMESPACE::sprintf(buff, "%10g", 1.0e-5); 2471 ASSERT_STREQ_LEN(written, buff, " 1e-05"); 2472 2473 // Precision Tests. 2474 2475 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.23456789); 2476 ASSERT_STREQ_LEN(written, buff, "1.2"); 2477 2478 // Trimming trailing zeroes causes the precision to be ignored here. 2479 written = LIBC_NAMESPACE::sprintf(buff, "%.1g", 0.0); 2480 ASSERT_STREQ_LEN(written, buff, "0"); 2481 2482 written = LIBC_NAMESPACE::sprintf(buff, "%.0g", 0.0); 2483 ASSERT_STREQ_LEN(written, buff, "0"); 2484 2485 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 0.1); 2486 ASSERT_STREQ_LEN(written, buff, "0.1"); 2487 2488 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.09); 2489 ASSERT_STREQ_LEN(written, buff, "1.1"); 2490 2491 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.04); 2492 ASSERT_STREQ_LEN(written, buff, "1"); 2493 2494 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.19); 2495 ASSERT_STREQ_LEN(written, buff, "1.2"); 2496 2497 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.99); 2498 ASSERT_STREQ_LEN(written, buff, "2"); 2499 2500 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 9.99); 2501 ASSERT_STREQ_LEN(written, buff, "10"); 2502 2503 written = LIBC_NAMESPACE::sprintf(buff, "%.3g", 99.9); 2504 ASSERT_STREQ_LEN(written, buff, "99.9"); 2505 2506 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 99.9); 2507 ASSERT_STREQ_LEN(written, buff, "1e+02"); 2508 2509 written = LIBC_NAMESPACE::sprintf(buff, "%.1g", 99.9); 2510 ASSERT_STREQ_LEN(written, buff, "1e+02"); 2511 2512 written = LIBC_NAMESPACE::sprintf(buff, "%.5g", 1.25); 2513 ASSERT_STREQ_LEN(written, buff, "1.25"); 2514 2515 written = LIBC_NAMESPACE::sprintf(buff, "%.0g", 1.25); 2516 ASSERT_STREQ_LEN(written, buff, "1"); 2517 2518 written = LIBC_NAMESPACE::sprintf(buff, "%.0g", 1.75); 2519 ASSERT_STREQ_LEN(written, buff, "2"); 2520 2521 written = LIBC_NAMESPACE::sprintf(buff, "%.20g", 1.234e-10); 2522 ASSERT_STREQ_LEN(written, buff, "1.2340000000000000814e-10"); 2523 2524 written = LIBC_NAMESPACE::sprintf(buff, "%.3g", -9.99); 2525 ASSERT_STREQ_LEN(written, buff, "-9.99"); 2526 2527 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -9.99); 2528 ASSERT_STREQ_LEN(written, buff, "-10"); 2529 2530 written = LIBC_NAMESPACE::sprintf(buff, "%.1g", -9.99); 2531 ASSERT_STREQ_LEN(written, buff, "-1e+01"); 2532 2533 written = LIBC_NAMESPACE::sprintf(buff, "%.5g", 1.008); 2534 ASSERT_STREQ_LEN(written, buff, "1.008"); 2535 2536 written = LIBC_NAMESPACE::sprintf(buff, "%.5g", 1.008e3); 2537 ASSERT_STREQ_LEN(written, buff, "1008"); 2538 2539 written = LIBC_NAMESPACE::sprintf(buff, "%.4g", 9999.0); 2540 ASSERT_STREQ_LEN(written, buff, "9999"); 2541 2542 written = LIBC_NAMESPACE::sprintf(buff, "%.3g", 9999.0); 2543 ASSERT_STREQ_LEN(written, buff, "1e+04"); 2544 2545 written = LIBC_NAMESPACE::sprintf(buff, "%.3g", 1256.0); 2546 ASSERT_STREQ_LEN(written, buff, "1.26e+03"); 2547 2548 // Found through large scale testing. 2549 written = LIBC_NAMESPACE::sprintf(buff, "%.15g", 22.25); 2550 ASSERT_STREQ_LEN(written, buff, "22.25"); 2551 2552 // These tests also focus on rounding, but only in how it relates to the base 2553 // 10 exponent. The %g conversion selects between being a %f or %e conversion 2554 // based on what the exponent would be if it was %e. If we call the precision 2555 // P (equal to 6 if the precision is not set, 0 if the provided precision is 2556 // 0, and provided precision - 1 otherwise) and the exponent X, then the style 2557 // is %f with an effective precision of P - X + 1 if P > X >= -4, else the 2558 // style is %e with effective precision P - 1. Additionally, it attempts to 2559 // trim zeros that would be displayed after the decimal point. 2560 written = LIBC_NAMESPACE::sprintf(buff, "%.1g", 9.059E+200); 2561 ASSERT_STREQ_LEN(written, buff, "9e+200"); 2562 2563 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 9.059E+200); 2564 ASSERT_STREQ_LEN(written, buff, "9.1e+200"); 2565 2566 // For this test, P = 0 and X = 1, so P > X >= -4 is false, giving a %e style. 2567 written = LIBC_NAMESPACE::sprintf(buff, "%.0g", 9.5); 2568 ASSERT_STREQ_LEN(written, buff, "1e+01"); 2569 2570 // Subnormal Precision Tests 2571 #ifndef LIBC_COPT_FLOAT_TO_STR_REDUCED_PRECISION 2572 written = LIBC_NAMESPACE::sprintf(buff, "%.310g", 0x1.0p-1022); 2573 ASSERT_STREQ_LEN( 2574 written, buff, 2575 "2." 2576 "225073858507201383090232717332404064219215980462331830553327416887204434" 2577 "813918195854283159012511020564067339731035811005152434161553460108856012" 2578 "385377718821130777993532002330479610147442583636071921565046942503734208" 2579 "375250806650616658158948720491179968591639648500635908770118304874799780" 2580 "887753749949451580452e-308"); 2581 #endif 2582 2583 written = LIBC_NAMESPACE::sprintf(buff, "%.30g", 0x1.0p-1022); 2584 ASSERT_STREQ_LEN(written, buff, "2.22507385850720138309023271733e-308"); 2585 2586 #ifndef LIBC_COPT_FLOAT_TO_STR_REDUCED_PRECISION 2587 written = LIBC_NAMESPACE::sprintf(buff, "%.310g", 0x1.0p-1023); 2588 ASSERT_STREQ_LEN( 2589 written, buff, 2590 "1." 2591 "112536929253600691545116358666202032109607990231165915276663708443602217" 2592 "406959097927141579506255510282033669865517905502576217080776730054428006" 2593 "192688859410565388996766001165239805073721291818035960782523471251867104" 2594 "187625403325308329079474360245589984295819824250317954385059152437399890" 2595 "443876874974725790226e-308"); 2596 #endif 2597 2598 written = LIBC_NAMESPACE::sprintf(buff, "%.7g", 9.99999e-310); 2599 ASSERT_STREQ_LEN(written, buff, "9.99999e-310"); 2600 2601 written = LIBC_NAMESPACE::sprintf(buff, "%.6g", 9.99999e-310); 2602 ASSERT_STREQ_LEN(written, buff, "9.99999e-310"); 2603 2604 written = LIBC_NAMESPACE::sprintf(buff, "%.5g", 9.99999e-310); 2605 ASSERT_STREQ_LEN(written, buff, "1e-309"); 2606 2607 written = LIBC_NAMESPACE::sprintf(buff, "%.4g", 9.99999e-310); 2608 ASSERT_STREQ_LEN(written, buff, "1e-309"); 2609 2610 written = LIBC_NAMESPACE::sprintf(buff, "%.3g", 9.99999e-310); 2611 ASSERT_STREQ_LEN(written, buff, "1e-309"); 2612 2613 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 9.99999e-310); 2614 ASSERT_STREQ_LEN(written, buff, "1e-309"); 2615 2616 written = LIBC_NAMESPACE::sprintf(buff, "%.1g", 9.99999e-310); 2617 ASSERT_STREQ_LEN(written, buff, "1e-309"); 2618 2619 written = LIBC_NAMESPACE::sprintf(buff, "%.0g", 9.99999e-310); 2620 ASSERT_STREQ_LEN(written, buff, "1e-309"); 2621 2622 written = LIBC_NAMESPACE::sprintf(buff, "%.10g", 0x1.0p-1074); 2623 ASSERT_STREQ_LEN(written, buff, "4.940656458e-324"); 2624 2625 // Rounding Mode Tests. 2626 2627 if (ForceRoundingMode r(RoundingMode::Nearest); r.success) { 2628 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.75); 2629 ASSERT_STREQ_LEN(written, buff, "1.8"); 2630 2631 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.25); 2632 ASSERT_STREQ_LEN(written, buff, "1.2"); 2633 2634 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.125); 2635 ASSERT_STREQ_LEN(written, buff, "1.1"); 2636 2637 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.625); 2638 ASSERT_STREQ_LEN(written, buff, "1.6"); 2639 2640 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.375); 2641 ASSERT_STREQ_LEN(written, buff, "1.4"); 2642 2643 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.875); 2644 ASSERT_STREQ_LEN(written, buff, "1.9"); 2645 2646 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -1.75); 2647 ASSERT_STREQ_LEN(written, buff, "-1.8"); 2648 2649 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -1.25); 2650 ASSERT_STREQ_LEN(written, buff, "-1.2"); 2651 2652 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -1.125); 2653 ASSERT_STREQ_LEN(written, buff, "-1.1"); 2654 2655 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -1.625); 2656 ASSERT_STREQ_LEN(written, buff, "-1.6"); 2657 2658 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -1.375); 2659 ASSERT_STREQ_LEN(written, buff, "-1.4"); 2660 2661 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -1.875); 2662 ASSERT_STREQ_LEN(written, buff, "-1.9"); 2663 } 2664 2665 if (ForceRoundingMode r(RoundingMode::Upward); r.success) { 2666 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.75); 2667 ASSERT_STREQ_LEN(written, buff, "1.8"); 2668 2669 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.25); 2670 ASSERT_STREQ_LEN(written, buff, "1.3"); 2671 2672 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.125); 2673 ASSERT_STREQ_LEN(written, buff, "1.2"); 2674 2675 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.625); 2676 ASSERT_STREQ_LEN(written, buff, "1.7"); 2677 2678 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.375); 2679 ASSERT_STREQ_LEN(written, buff, "1.4"); 2680 2681 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.875); 2682 ASSERT_STREQ_LEN(written, buff, "1.9"); 2683 2684 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -1.75); 2685 ASSERT_STREQ_LEN(written, buff, "-1.7"); 2686 2687 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -1.25); 2688 ASSERT_STREQ_LEN(written, buff, "-1.2"); 2689 2690 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -1.125); 2691 ASSERT_STREQ_LEN(written, buff, "-1.1"); 2692 2693 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -1.625); 2694 ASSERT_STREQ_LEN(written, buff, "-1.6"); 2695 2696 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -1.375); 2697 ASSERT_STREQ_LEN(written, buff, "-1.3"); 2698 2699 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -1.875); 2700 ASSERT_STREQ_LEN(written, buff, "-1.8"); 2701 } 2702 2703 if (ForceRoundingMode r(RoundingMode::Downward); r.success) { 2704 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.75); 2705 ASSERT_STREQ_LEN(written, buff, "1.7"); 2706 2707 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.25); 2708 ASSERT_STREQ_LEN(written, buff, "1.2"); 2709 2710 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.125); 2711 ASSERT_STREQ_LEN(written, buff, "1.1"); 2712 2713 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.625); 2714 ASSERT_STREQ_LEN(written, buff, "1.6"); 2715 2716 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.375); 2717 ASSERT_STREQ_LEN(written, buff, "1.3"); 2718 2719 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.875); 2720 ASSERT_STREQ_LEN(written, buff, "1.8"); 2721 2722 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -1.75); 2723 ASSERT_STREQ_LEN(written, buff, "-1.8"); 2724 2725 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -1.25); 2726 ASSERT_STREQ_LEN(written, buff, "-1.3"); 2727 2728 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -1.125); 2729 ASSERT_STREQ_LEN(written, buff, "-1.2"); 2730 2731 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -1.625); 2732 ASSERT_STREQ_LEN(written, buff, "-1.7"); 2733 2734 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -1.375); 2735 ASSERT_STREQ_LEN(written, buff, "-1.4"); 2736 2737 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -1.875); 2738 ASSERT_STREQ_LEN(written, buff, "-1.9"); 2739 } 2740 2741 if (ForceRoundingMode r(RoundingMode::TowardZero); r.success) { 2742 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.75); 2743 ASSERT_STREQ_LEN(written, buff, "1.7"); 2744 2745 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.25); 2746 ASSERT_STREQ_LEN(written, buff, "1.2"); 2747 2748 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.125); 2749 ASSERT_STREQ_LEN(written, buff, "1.1"); 2750 2751 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.625); 2752 ASSERT_STREQ_LEN(written, buff, "1.6"); 2753 2754 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.375); 2755 ASSERT_STREQ_LEN(written, buff, "1.3"); 2756 2757 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.875); 2758 ASSERT_STREQ_LEN(written, buff, "1.8"); 2759 2760 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -1.75); 2761 ASSERT_STREQ_LEN(written, buff, "-1.7"); 2762 2763 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -1.25); 2764 ASSERT_STREQ_LEN(written, buff, "-1.2"); 2765 2766 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -1.125); 2767 ASSERT_STREQ_LEN(written, buff, "-1.1"); 2768 2769 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -1.625); 2770 ASSERT_STREQ_LEN(written, buff, "-1.6"); 2771 2772 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -1.375); 2773 ASSERT_STREQ_LEN(written, buff, "-1.3"); 2774 2775 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -1.875); 2776 ASSERT_STREQ_LEN(written, buff, "-1.8"); 2777 } 2778 2779 // Flag Tests. 2780 written = LIBC_NAMESPACE::sprintf(buff, "%+g", 1.0); 2781 ASSERT_STREQ_LEN(written, buff, "+1"); 2782 2783 written = LIBC_NAMESPACE::sprintf(buff, "%+g", -1.0); 2784 ASSERT_STREQ_LEN(written, buff, "-1"); 2785 2786 written = LIBC_NAMESPACE::sprintf(buff, "% g", 1.0); 2787 ASSERT_STREQ_LEN(written, buff, " 1"); 2788 2789 written = LIBC_NAMESPACE::sprintf(buff, "% g", -1.0); 2790 ASSERT_STREQ_LEN(written, buff, "-1"); 2791 2792 written = LIBC_NAMESPACE::sprintf(buff, "%-15g", 1.5); 2793 ASSERT_STREQ_LEN(written, buff, "1.5 "); 2794 2795 written = LIBC_NAMESPACE::sprintf(buff, "%#.g", 1.0); 2796 ASSERT_STREQ_LEN(written, buff, "1."); 2797 2798 written = LIBC_NAMESPACE::sprintf(buff, "%#g", 1.0); 2799 ASSERT_STREQ_LEN(written, buff, "1.00000"); 2800 2801 written = LIBC_NAMESPACE::sprintf(buff, "%#.0g", 1.5); 2802 ASSERT_STREQ_LEN(written, buff, "2."); 2803 2804 written = LIBC_NAMESPACE::sprintf(buff, "%015g", 1.5); 2805 ASSERT_STREQ_LEN(written, buff, "0000000000001.5"); 2806 2807 written = LIBC_NAMESPACE::sprintf(buff, "%015g", -1.5); 2808 ASSERT_STREQ_LEN(written, buff, "-000000000001.5"); 2809 2810 written = LIBC_NAMESPACE::sprintf(buff, "%+- #0g", 0.0); 2811 ASSERT_STREQ_LEN(written, buff, "+0.00000"); 2812 2813 // Combined Tests. 2814 2815 written = LIBC_NAMESPACE::sprintf(buff, "%10.3g", 9.99); 2816 ASSERT_STREQ_LEN(written, buff, " 9.99"); 2817 2818 written = LIBC_NAMESPACE::sprintf(buff, "%10.2g", 9.99); 2819 ASSERT_STREQ_LEN(written, buff, " 10"); 2820 2821 written = LIBC_NAMESPACE::sprintf(buff, "%10.1g", 9.99); 2822 ASSERT_STREQ_LEN(written, buff, " 1e+01"); 2823 2824 written = LIBC_NAMESPACE::sprintf(buff, "%-10.3g", 9.99); 2825 ASSERT_STREQ_LEN(written, buff, "9.99 "); 2826 2827 written = LIBC_NAMESPACE::sprintf(buff, "%-10.2g", 9.99); 2828 ASSERT_STREQ_LEN(written, buff, "10 "); 2829 2830 written = LIBC_NAMESPACE::sprintf(buff, "%-10.1g", 9.99); 2831 ASSERT_STREQ_LEN(written, buff, "1e+01 "); 2832 2833 written = LIBC_NAMESPACE::sprintf(buff, "%-10.1g", 1.0e-50); 2834 ASSERT_STREQ_LEN(written, buff, "1e-50 "); 2835 2836 written = LIBC_NAMESPACE::sprintf(buff, "%30g", 1234567890123456789.0); 2837 ASSERT_STREQ_LEN(written, buff, " 1.23457e+18"); 2838 2839 written = LIBC_NAMESPACE::sprintf(buff, "%-30g", 1234567890123456789.0); 2840 ASSERT_STREQ_LEN(written, buff, "1.23457e+18 "); 2841 2842 written = LIBC_NAMESPACE::sprintf(buff, "%25.15g", 9999999999999.99); 2843 ASSERT_STREQ_LEN(written, buff, " 9999999999999.99"); 2844 2845 written = LIBC_NAMESPACE::sprintf(buff, "%25.14g", 9999999999999.99); 2846 ASSERT_STREQ_LEN(written, buff, " 10000000000000"); 2847 2848 written = LIBC_NAMESPACE::sprintf(buff, "%25.13g", 9999999999999.99); 2849 ASSERT_STREQ_LEN(written, buff, " 1e+13"); 2850 2851 written = LIBC_NAMESPACE::sprintf(buff, "%#12.3g %-12.3g", 0.1, 256.0); 2852 ASSERT_STREQ_LEN(written, buff, " 0.100 256 "); 2853 2854 written = LIBC_NAMESPACE::sprintf(buff, "%+-#12.3g % 012.3g", 0.1256, 1256.0); 2855 ASSERT_STREQ_LEN(written, buff, "+0.126 0001.26e+03"); 2856 } 2857 2858 TEST(LlvmLibcSPrintfTest, FloatAutoLongDoubleConv) { 2859 char buff[1000]; 2860 int written; 2861 2862 ForceRoundingMode r(RoundingMode::Nearest); 2863 2864 // Length Modifier Tests. 2865 2866 // TODO: Tests for other long double types 2867 #if defined(LIBC_TYPES_LONG_DOUBLE_IS_X86_FLOAT80) 2868 2869 written = LIBC_NAMESPACE::sprintf(buff, "%Lg", 0xf.fffffffffffffffp+16380L); 2870 ASSERT_STREQ_LEN(written, buff, "1.18973e+4932"); 2871 2872 written = LIBC_NAMESPACE::sprintf(buff, "%Lg", 0xa.aaaaaaaaaaaaaabp-7L); 2873 ASSERT_STREQ_LEN(written, buff, "0.0833333"); 2874 2875 #ifndef LIBC_COPT_FLOAT_TO_STR_REDUCED_PRECISION 2876 written = LIBC_NAMESPACE::sprintf(buff, "%.60Lg", 0xa.aaaaaaaaaaaaaabp-7L); 2877 ASSERT_STREQ_LEN( 2878 written, buff, 2879 "0.0833333333333333333355920878593448009041821933351457118988037"); 2880 #endif 2881 2882 #endif // LIBC_TYPES_LONG_DOUBLE_IS_X86_FLOAT80 2883 2884 written = LIBC_NAMESPACE::sprintf(buff, "%Lg", 9.99999999999e-100L); 2885 ASSERT_STREQ_LEN(written, buff, "1e-99"); 2886 2887 written = LIBC_NAMESPACE::sprintf(buff, "%Lg", 1e100L); 2888 ASSERT_STREQ_LEN(written, buff, "1e+100"); 2889 2890 written = LIBC_NAMESPACE::sprintf(buff, "%Lg", 1.0L); 2891 ASSERT_STREQ_LEN(written, buff, "1"); 2892 2893 written = LIBC_NAMESPACE::sprintf(buff, "%Lg", 0.1L); 2894 ASSERT_STREQ_LEN(written, buff, "0.1"); 2895 2896 char big_buff[10000]; 2897 written = LIBC_NAMESPACE::sprintf(big_buff, "%Lg", 1e1000L); 2898 ASSERT_STREQ_LEN(written, big_buff, "1e+1000"); 2899 2900 written = LIBC_NAMESPACE::sprintf(big_buff, "%Lg", 1e4900L); 2901 ASSERT_STREQ_LEN(written, big_buff, "1e+4900"); 2902 } 2903 2904 #endif // LIBC_COPT_PRINTF_DISABLE_FLOAT 2905 2906 #if defined(LIBC_COMPILER_HAS_FIXED_POINT) && \ 2907 !defined(LIBC_COPT_PRINTF_DISABLE_FIXED_POINT) 2908 TEST(LlvmLibcSPrintfTest, FixedConv) { 2909 char buff[1000]; 2910 int written; 2911 2912 // These numeric tests are potentially a little weak, but the fuzz test is 2913 // more thorough than my handwritten tests tend to be. 2914 2915 // TODO: Replace hex literals with their appropriate fixed point literals. 2916 2917 written = LIBC_NAMESPACE::sprintf(buff, "%k", 0x0); // 0.0 2918 ASSERT_STREQ_LEN(written, buff, "0.000000"); 2919 2920 written = LIBC_NAMESPACE::sprintf(buff, "%k", 0x80000000); // -0.0 2921 ASSERT_STREQ_LEN(written, buff, "-0.000000"); 2922 2923 written = LIBC_NAMESPACE::sprintf(buff, "%r", 0xffff); // -fract max 2924 ASSERT_STREQ_LEN(written, buff, "-0.999969"); 2925 2926 written = LIBC_NAMESPACE::sprintf(buff, "%R", 0xffff); // unsigned fract max 2927 ASSERT_STREQ_LEN(written, buff, "0.999985"); 2928 2929 written = LIBC_NAMESPACE::sprintf(buff, "%k", 0xffffffff); // -accum max 2930 ASSERT_STREQ_LEN(written, buff, "-65535.999969"); 2931 2932 written = 2933 LIBC_NAMESPACE::sprintf(buff, "%K", 0xffffffff); // unsigned accum max 2934 ASSERT_STREQ_LEN(written, buff, "65535.999985"); 2935 2936 written = LIBC_NAMESPACE::sprintf(buff, "%r", 0x7fff); // fract max 2937 ASSERT_STREQ_LEN(written, buff, "0.999969"); 2938 2939 written = LIBC_NAMESPACE::sprintf(buff, "%k", 0x7fffffff); // accum max 2940 ASSERT_STREQ_LEN(written, buff, "65535.999969"); 2941 2942 // Length Modifier Tests. 2943 2944 written = LIBC_NAMESPACE::sprintf(buff, "%hk", 0x0); // 0.0 2945 ASSERT_STREQ_LEN(written, buff, "0.000000"); 2946 2947 written = LIBC_NAMESPACE::sprintf(buff, "%hk", 0xffff); // -short accum max 2948 ASSERT_STREQ_LEN(written, buff, "-255.992188"); 2949 2950 written = LIBC_NAMESPACE::sprintf(buff, "%hr", 0x0); // 0.0 2951 ASSERT_STREQ_LEN(written, buff, "0.000000"); 2952 2953 written = LIBC_NAMESPACE::sprintf(buff, "%hr", 0xff); // -short fract max 2954 ASSERT_STREQ_LEN(written, buff, "-0.992188"); 2955 2956 written = LIBC_NAMESPACE::sprintf(buff, "%hK", 0x0); // 0.0 2957 ASSERT_STREQ_LEN(written, buff, "0.000000"); 2958 2959 written = 2960 LIBC_NAMESPACE::sprintf(buff, "%hK", 0xffff); // unsigned short accum max 2961 ASSERT_STREQ_LEN(written, buff, "255.996094"); 2962 2963 written = LIBC_NAMESPACE::sprintf(buff, "%hR", 0x0); // 0.0 2964 ASSERT_STREQ_LEN(written, buff, "0.000000"); 2965 2966 written = 2967 LIBC_NAMESPACE::sprintf(buff, "%hR", 0xff); // unsigned short fract max 2968 ASSERT_STREQ_LEN(written, buff, "0.996094"); 2969 2970 written = LIBC_NAMESPACE::sprintf(buff, "%lk", 0x0ll); // 0.0 2971 ASSERT_STREQ_LEN(written, buff, "0.000000"); 2972 2973 written = LIBC_NAMESPACE::sprintf(buff, "%lk", 2974 0xffffffffffffffff); //-long accum max 2975 ASSERT_STREQ_LEN(written, buff, "-4294967296.000000"); 2976 2977 written = LIBC_NAMESPACE::sprintf(buff, "%lr", 0x0); // 0.0 2978 ASSERT_STREQ_LEN(written, buff, "0.000000"); 2979 2980 written = LIBC_NAMESPACE::sprintf(buff, "%lr", 2981 0xffffffff); //-long fract max 2982 ASSERT_STREQ_LEN(written, buff, "-1.000000"); 2983 2984 written = LIBC_NAMESPACE::sprintf(buff, "%lK", 0x0ll); // 0.0 2985 ASSERT_STREQ_LEN(written, buff, "0.000000"); 2986 2987 written = 2988 LIBC_NAMESPACE::sprintf(buff, "%lK", 2989 0xffffffffffffffff); // unsigned long accum max 2990 ASSERT_STREQ_LEN(written, buff, "4294967296.000000"); 2991 2992 written = LIBC_NAMESPACE::sprintf(buff, "%lR", 0x0); // 0.0 2993 ASSERT_STREQ_LEN(written, buff, "0.000000"); 2994 2995 written = LIBC_NAMESPACE::sprintf(buff, "%lR", 2996 0xffffffff); // unsigned long fract max 2997 ASSERT_STREQ_LEN(written, buff, "1.000000"); 2998 2999 // Min Width Tests. 3000 3001 written = LIBC_NAMESPACE::sprintf(buff, "%10k", 0x0000a000); // 1.25 3002 ASSERT_STREQ_LEN(written, buff, " 1.250000"); 3003 3004 written = LIBC_NAMESPACE::sprintf(buff, "%10k", 0x8000a000); //-1.25 3005 ASSERT_STREQ_LEN(written, buff, " -1.250000"); 3006 3007 written = LIBC_NAMESPACE::sprintf(buff, "%8k", 0x0000a000); // 1.25 3008 ASSERT_STREQ_LEN(written, buff, "1.250000"); 3009 3010 written = LIBC_NAMESPACE::sprintf(buff, "%9k", 0x8000a000); //-1.25 3011 ASSERT_STREQ_LEN(written, buff, "-1.250000"); 3012 3013 written = LIBC_NAMESPACE::sprintf(buff, "%4k", 0x0000a000); // 1.25 3014 ASSERT_STREQ_LEN(written, buff, "1.250000"); 3015 3016 written = LIBC_NAMESPACE::sprintf(buff, "%4k", 0x8000a000); //-1.25 3017 ASSERT_STREQ_LEN(written, buff, "-1.250000"); 3018 3019 // Precision Tests. 3020 3021 written = 3022 LIBC_NAMESPACE::sprintf(buff, "%.16K", 0xFFFFFFFF); // unsigned accum max 3023 ASSERT_STREQ_LEN(written, buff, "65535.9999847412109375"); 3024 3025 written = LIBC_NAMESPACE::sprintf( 3026 buff, "%.32lK", 0xFFFFFFFFFFFFFFFF); // unsigned long accum max 3027 ASSERT_STREQ_LEN(written, buff, 3028 "4294967295.99999999976716935634613037109375"); 3029 3030 written = 3031 LIBC_NAMESPACE::sprintf(buff, "%.0K", 0xFFFFFFFF); // unsigned accum max 3032 ASSERT_STREQ_LEN(written, buff, "65536"); 3033 3034 written = LIBC_NAMESPACE::sprintf(buff, "%.0R", 0xFFFF); // unsigned fract max 3035 ASSERT_STREQ_LEN(written, buff, "1"); 3036 3037 // Flag Tests. 3038 3039 written = LIBC_NAMESPACE::sprintf(buff, "%+k", 0x0000a000); // 1.25 3040 ASSERT_STREQ_LEN(written, buff, "+1.250000"); 3041 3042 written = LIBC_NAMESPACE::sprintf(buff, "%+k", 0x8000a000); //-1.25 3043 ASSERT_STREQ_LEN(written, buff, "-1.250000"); 3044 3045 written = LIBC_NAMESPACE::sprintf(buff, "% k", 0x0000a000); // 1.25 3046 ASSERT_STREQ_LEN(written, buff, " 1.250000"); 3047 3048 written = LIBC_NAMESPACE::sprintf(buff, "% k", 0x8000a000); //-1.25 3049 ASSERT_STREQ_LEN(written, buff, "-1.250000"); 3050 3051 // unsigned variants ignore sign flags. 3052 written = LIBC_NAMESPACE::sprintf(buff, "%+K", 0x00014000); // 1.25 3053 ASSERT_STREQ_LEN(written, buff, "1.250000"); 3054 3055 written = LIBC_NAMESPACE::sprintf(buff, "% K", 0x00014000); // 1.25 3056 ASSERT_STREQ_LEN(written, buff, "1.250000"); 3057 3058 written = LIBC_NAMESPACE::sprintf(buff, "%-10k", 0x0000c000); // 1.5 3059 ASSERT_STREQ_LEN(written, buff, "1.500000 "); 3060 3061 written = LIBC_NAMESPACE::sprintf(buff, "%#.k", 0x00008000); // 1.0 3062 ASSERT_STREQ_LEN(written, buff, "1."); 3063 3064 written = LIBC_NAMESPACE::sprintf(buff, "%#.0k", 0x0000c000); // 1.5 3065 ASSERT_STREQ_LEN(written, buff, "2."); 3066 3067 written = LIBC_NAMESPACE::sprintf(buff, "%010k", 0x0000c000); // 1.5 3068 ASSERT_STREQ_LEN(written, buff, "001.500000"); 3069 3070 written = LIBC_NAMESPACE::sprintf(buff, "%010k", 0x8000c000); //-1.5 3071 ASSERT_STREQ_LEN(written, buff, "-01.500000"); 3072 3073 written = LIBC_NAMESPACE::sprintf(buff, "%+- #0k", 0); // 0.0 3074 ASSERT_STREQ_LEN(written, buff, "+0.000000"); 3075 3076 // Combined Tests. 3077 3078 written = LIBC_NAMESPACE::sprintf(buff, "%10.2k", 0x0004feb8); // 9.99 3079 ASSERT_STREQ_LEN(written, buff, " 9.99"); 3080 3081 written = LIBC_NAMESPACE::sprintf(buff, "%5.1k", 0x0004feb8); // 9.99 3082 ASSERT_STREQ_LEN(written, buff, " 10.0"); 3083 3084 written = LIBC_NAMESPACE::sprintf(buff, "%-10.2k", 0x0004feb8); // 9.99 3085 ASSERT_STREQ_LEN(written, buff, "9.99 "); 3086 3087 written = LIBC_NAMESPACE::sprintf(buff, "%-5.1k", 0x0004feb8); // 9.99 3088 ASSERT_STREQ_LEN(written, buff, "10.0 "); 3089 3090 written = LIBC_NAMESPACE::sprintf(buff, "%-5.1k", 0x00000001); // accum min 3091 ASSERT_STREQ_LEN(written, buff, "0.0 "); 3092 3093 written = LIBC_NAMESPACE::sprintf(buff, "%30k", 0x7fffffff); // accum max 3094 ASSERT_STREQ_LEN(written, buff, " 65535.999969"); 3095 3096 written = LIBC_NAMESPACE::sprintf(buff, "%-30k", 0x7fffffff); // accum max 3097 ASSERT_STREQ_LEN(written, buff, "65535.999969 "); 3098 3099 written = LIBC_NAMESPACE::sprintf(buff, "%20.2lK", 3100 0x3b9ac9ffFD70A3D7); // 999999999.99 3101 ASSERT_STREQ_LEN(written, buff, " 999999999.99"); 3102 3103 written = LIBC_NAMESPACE::sprintf(buff, "%20.1lK", 3104 0x3b9ac9ffFD70A3D7); // 999999999.99 3105 ASSERT_STREQ_LEN(written, buff, " 1000000000.0"); 3106 3107 written = LIBC_NAMESPACE::sprintf(buff, "%12.3R %-12.3k", 0x1999, 3108 0x00800000); // 0.1, 256.0 3109 ASSERT_STREQ_LEN(written, buff, " 0.100 256.000 "); 3110 3111 written = 3112 LIBC_NAMESPACE::sprintf(buff, "%+-#12.3lk % 012.3k", 0x000000001013a92all, 3113 0x02740000); // 0.126, 1256.0 3114 ASSERT_STREQ_LEN(written, buff, "+0.126 0001256.000"); 3115 } 3116 #endif // defined(LIBC_COMPILER_HAS_FIXED_POINT) && 3117 // !defined(LIBC_COPT_PRINTF_DISABLE_FIXED_POINT) 3118 3119 #ifndef LIBC_COPT_PRINTF_DISABLE_STRERROR 3120 TEST(LlvmLibcSPrintfTest, StrerrorConv) { 3121 char buff[1000]; 3122 int written; 3123 3124 LIBC_NAMESPACE::libc_errno = 0; 3125 written = LIBC_NAMESPACE::sprintf(buff, "%m"); 3126 ASSERT_STREQ_LEN(written, buff, "Success"); 3127 3128 LIBC_NAMESPACE::libc_errno = ERANGE; 3129 written = LIBC_NAMESPACE::sprintf(buff, "%m"); 3130 ASSERT_STREQ_LEN(written, buff, "Numerical result out of range"); 3131 3132 // Check that it correctly consumes no arguments. 3133 LIBC_NAMESPACE::libc_errno = 0; 3134 written = LIBC_NAMESPACE::sprintf(buff, "%m %d", 1); 3135 ASSERT_STREQ_LEN(written, buff, "Success 1"); 3136 3137 // Width Tests 3138 3139 LIBC_NAMESPACE::libc_errno = 0; 3140 written = LIBC_NAMESPACE::sprintf(buff, "%10m"); 3141 ASSERT_STREQ_LEN(written, buff, " Success"); 3142 3143 LIBC_NAMESPACE::libc_errno = ERANGE; 3144 written = LIBC_NAMESPACE::sprintf(buff, "%10m"); 3145 ASSERT_STREQ_LEN(written, buff, "Numerical result out of range"); 3146 3147 // Precision Tests 3148 3149 LIBC_NAMESPACE::libc_errno = 0; 3150 written = LIBC_NAMESPACE::sprintf(buff, "%.10m"); 3151 ASSERT_STREQ_LEN(written, buff, "Success"); 3152 3153 LIBC_NAMESPACE::libc_errno = ERANGE; 3154 written = LIBC_NAMESPACE::sprintf(buff, "%.10m"); 3155 ASSERT_STREQ_LEN(written, buff, "Numerical "); 3156 3157 // Flag Tests (Only '-' since the others only affect ints) 3158 3159 LIBC_NAMESPACE::libc_errno = 0; 3160 written = LIBC_NAMESPACE::sprintf(buff, "%-10m"); 3161 ASSERT_STREQ_LEN(written, buff, "Success "); 3162 3163 LIBC_NAMESPACE::libc_errno = ERANGE; 3164 written = LIBC_NAMESPACE::sprintf(buff, "%-10m"); 3165 ASSERT_STREQ_LEN(written, buff, "Numerical result out of range"); 3166 3167 // Alt Mode Tests 3168 // Since alt mode here is effectively a completely separate conversion, it 3169 // gets separate tests. 3170 3171 LIBC_NAMESPACE::libc_errno = 0; 3172 written = LIBC_NAMESPACE::sprintf(buff, "%#m"); 3173 ASSERT_STREQ_LEN(written, buff, "0"); 3174 3175 LIBC_NAMESPACE::libc_errno = ERANGE; 3176 written = LIBC_NAMESPACE::sprintf(buff, "%#m"); 3177 ASSERT_STREQ_LEN(written, buff, "ERANGE"); 3178 3179 LIBC_NAMESPACE::libc_errno = -9999; 3180 written = LIBC_NAMESPACE::sprintf(buff, "%#m"); 3181 ASSERT_STREQ_LEN(written, buff, "-9999"); 3182 3183 // Alt Mode Width 3184 3185 LIBC_NAMESPACE::libc_errno = 0; 3186 written = LIBC_NAMESPACE::sprintf(buff, "%#10m"); 3187 ASSERT_STREQ_LEN(written, buff, " 0"); 3188 3189 LIBC_NAMESPACE::libc_errno = ERANGE; 3190 written = LIBC_NAMESPACE::sprintf(buff, "%#10m"); 3191 ASSERT_STREQ_LEN(written, buff, " ERANGE"); 3192 3193 LIBC_NAMESPACE::libc_errno = -9999; 3194 written = LIBC_NAMESPACE::sprintf(buff, "%#10m"); 3195 ASSERT_STREQ_LEN(written, buff, " -9999"); 3196 3197 LIBC_NAMESPACE::libc_errno = ERANGE; 3198 written = LIBC_NAMESPACE::sprintf(buff, "%#3m"); 3199 ASSERT_STREQ_LEN(written, buff, "ERANGE"); 3200 3201 LIBC_NAMESPACE::libc_errno = -9999; 3202 written = LIBC_NAMESPACE::sprintf(buff, "%#3m"); 3203 ASSERT_STREQ_LEN(written, buff, "-9999"); 3204 3205 // Alt Mode Precision 3206 3207 LIBC_NAMESPACE::libc_errno = ERANGE; 3208 written = LIBC_NAMESPACE::sprintf(buff, "%#.10m"); 3209 ASSERT_STREQ_LEN(written, buff, "ERANGE"); 3210 3211 LIBC_NAMESPACE::libc_errno = -9999; 3212 written = LIBC_NAMESPACE::sprintf(buff, "%#.10m"); 3213 ASSERT_STREQ_LEN(written, buff, "-0000009999"); 3214 3215 LIBC_NAMESPACE::libc_errno = ERANGE; 3216 written = LIBC_NAMESPACE::sprintf(buff, "%#.3m"); 3217 ASSERT_STREQ_LEN(written, buff, "ERA"); 3218 3219 LIBC_NAMESPACE::libc_errno = -9999; 3220 written = LIBC_NAMESPACE::sprintf(buff, "%#.3m"); 3221 ASSERT_STREQ_LEN(written, buff, "-9999"); 3222 3223 // We don't test precision (or int flags) on errno = 0 because it behaves 3224 // weirdly, see the docs for more information. 3225 LIBC_NAMESPACE::libc_errno = 0; 3226 written = LIBC_NAMESPACE::sprintf(buff, "%#.1m"); 3227 ASSERT_STREQ_LEN(written, buff, "0"); 3228 3229 // Alt Mode Flags 3230 3231 // '-' flag 3232 LIBC_NAMESPACE::libc_errno = 0; 3233 written = LIBC_NAMESPACE::sprintf(buff, "%#-10m"); 3234 ASSERT_STREQ_LEN(written, buff, "0 "); 3235 3236 LIBC_NAMESPACE::libc_errno = ERANGE; 3237 written = LIBC_NAMESPACE::sprintf(buff, "%#-10m"); 3238 ASSERT_STREQ_LEN(written, buff, "ERANGE "); 3239 3240 LIBC_NAMESPACE::libc_errno = -9999; 3241 written = LIBC_NAMESPACE::sprintf(buff, "%#-10m"); 3242 ASSERT_STREQ_LEN(written, buff, "-9999 "); 3243 3244 LIBC_NAMESPACE::libc_errno = ERANGE; 3245 written = LIBC_NAMESPACE::sprintf(buff, "%#-3m"); 3246 ASSERT_STREQ_LEN(written, buff, "ERANGE"); 3247 3248 LIBC_NAMESPACE::libc_errno = -9999; 3249 written = LIBC_NAMESPACE::sprintf(buff, "%#-3m"); 3250 ASSERT_STREQ_LEN(written, buff, "-9999"); 3251 3252 // '+' flag 3253 LIBC_NAMESPACE::libc_errno = ERANGE; 3254 written = LIBC_NAMESPACE::sprintf(buff, "%#+m"); 3255 ASSERT_STREQ_LEN(written, buff, "ERANGE"); 3256 3257 LIBC_NAMESPACE::libc_errno = -9999; 3258 written = LIBC_NAMESPACE::sprintf(buff, "%#+m"); 3259 ASSERT_STREQ_LEN(written, buff, "-9999"); 3260 3261 // Technically 9999 could be a valid error, since the standard just says errno 3262 // macros are "distinct positive values". In practice I don't expect this to 3263 // come up, but I've avoided it for the other %m tests for ease of 3264 // refactoring if necessary. Here it needs to be positive to test that the 3265 // flags that only affect positive signed integers are properly passed along. 3266 LIBC_NAMESPACE::libc_errno = 9999; 3267 written = LIBC_NAMESPACE::sprintf(buff, "%#+m"); 3268 ASSERT_STREQ_LEN(written, buff, "+9999"); 3269 3270 // ' ' flag 3271 LIBC_NAMESPACE::libc_errno = ERANGE; 3272 written = LIBC_NAMESPACE::sprintf(buff, "%# m"); 3273 ASSERT_STREQ_LEN(written, buff, "ERANGE"); 3274 3275 LIBC_NAMESPACE::libc_errno = -9999; 3276 written = LIBC_NAMESPACE::sprintf(buff, "%# m"); 3277 ASSERT_STREQ_LEN(written, buff, "-9999"); 3278 3279 LIBC_NAMESPACE::libc_errno = 9999; 3280 written = LIBC_NAMESPACE::sprintf(buff, "%# m"); 3281 ASSERT_STREQ_LEN(written, buff, " 9999"); 3282 3283 // '0' flag 3284 3285 LIBC_NAMESPACE::libc_errno = ERANGE; 3286 written = LIBC_NAMESPACE::sprintf(buff, "%#010m"); 3287 ASSERT_STREQ_LEN(written, buff, " ERANGE"); 3288 3289 LIBC_NAMESPACE::libc_errno = -9999; 3290 written = LIBC_NAMESPACE::sprintf(buff, "%#010m"); 3291 ASSERT_STREQ_LEN(written, buff, "-000009999"); 3292 3293 LIBC_NAMESPACE::libc_errno = ERANGE; 3294 written = LIBC_NAMESPACE::sprintf(buff, "%#03m"); 3295 ASSERT_STREQ_LEN(written, buff, "ERANGE"); 3296 3297 LIBC_NAMESPACE::libc_errno = -9999; 3298 written = LIBC_NAMESPACE::sprintf(buff, "%#03m"); 3299 ASSERT_STREQ_LEN(written, buff, "-9999"); 3300 } 3301 #endif // LIBC_COPT_PRINTF_DISABLE_STRERROR 3302 3303 #ifndef LIBC_COPT_PRINTF_DISABLE_WRITE_INT 3304 TEST(LlvmLibcSPrintfTest, WriteIntConv) { 3305 char buff[64]; 3306 int written; 3307 int test_val = -1; 3308 3309 test_val = -1; 3310 written = LIBC_NAMESPACE::sprintf(buff, "12345%n67890", &test_val); 3311 EXPECT_EQ(test_val, 5); 3312 ASSERT_STREQ_LEN(written, buff, "1234567890"); 3313 3314 test_val = -1; 3315 written = LIBC_NAMESPACE::sprintf(buff, "%n", &test_val); 3316 EXPECT_EQ(test_val, 0); 3317 ASSERT_STREQ_LEN(written, buff, ""); 3318 3319 test_val = 0x100; 3320 written = LIBC_NAMESPACE::sprintf(buff, "ABC%hhnDEF", &test_val); 3321 EXPECT_EQ(test_val, 0x103); 3322 ASSERT_STREQ_LEN(written, buff, "ABCDEF"); 3323 3324 test_val = -1; 3325 written = LIBC_NAMESPACE::sprintf(buff, "%s%n", "87654321", &test_val); 3326 EXPECT_EQ(test_val, 8); 3327 ASSERT_STREQ_LEN(written, buff, "87654321"); 3328 3329 #ifndef LIBC_COPT_PRINTF_NO_NULLPTR_CHECKS 3330 written = LIBC_NAMESPACE::sprintf(buff, "abc123%n", nullptr); 3331 EXPECT_LT(written, 0); 3332 #endif // LIBC_COPT_PRINTF_NO_NULLPTR_CHECKS 3333 } 3334 #endif // LIBC_COPT_PRINTF_DISABLE_WRITE_INT 3335 3336 #ifndef LIBC_COPT_PRINTF_DISABLE_INDEX_MODE 3337 TEST(LlvmLibcSPrintfTest, IndexModeParsing) { 3338 char buff[64]; 3339 int written; 3340 3341 written = LIBC_NAMESPACE::sprintf(buff, "%1$s", "abcDEF123"); 3342 ASSERT_STREQ_LEN(written, buff, "abcDEF123"); 3343 3344 written = LIBC_NAMESPACE::sprintf(buff, "%1$s %%", "abcDEF123"); 3345 ASSERT_STREQ_LEN(written, buff, "abcDEF123 %"); 3346 3347 written = 3348 LIBC_NAMESPACE::sprintf(buff, "%3$s %1$s %2$s", "is", "hard", "ordering"); 3349 ASSERT_STREQ_LEN(written, buff, "ordering is hard"); 3350 3351 written = LIBC_NAMESPACE::sprintf( 3352 buff, "%10$s %9$s %8$c %7$s %6$s, %6$s %5$s %4$-*1$s %3$.*11$s %2$s. %%", 3353 6, "pain", "alphabetical", "such", "is", "this", "do", 'u', "would", 3354 "why", 1); 3355 ASSERT_STREQ_LEN(written, buff, 3356 "why would u do this, this is such a pain. %"); 3357 } 3358 #endif // LIBC_COPT_PRINTF_DISABLE_INDEX_MODE 3359