3478 lines · cpp
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-exception6//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/__support/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 25using LIBC_NAMESPACE::fputil::testing::ForceRoundingMode;26using 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 42TEST(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 53TEST(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 62TEST(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 76TEST(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 90TEST(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_CHECKS109 written = LIBC_NAMESPACE::sprintf(buff, "%s", nullptr);110 ASSERT_STREQ_LEN(written, buff, "(null)");111#endif // LIBC_COPT_PRINTF_NO_NULLPTR_CHECKS112}113 114TEST(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); // 0x101129 ASSERT_STREQ_LEN(written, buff, "1");130 131 written = LIBC_NAMESPACE::sprintf(buff, "%llu", 18446744073709551615ull);132 ASSERT_STREQ_LEN(written, buff, "18446744073709551615"); // ull max133 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 min148 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 max184 185 written =186 LIBC_NAMESPACE::sprintf(buff, "%w64d", -9223372036854775807ll - 1ll);187 ASSERT_STREQ_LEN(written, buff, "-9223372036854775808"); // ll min188 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 max197 198 written =199 LIBC_NAMESPACE::sprintf(buff, "%wf64d", -9223372036854775807ll - 1ll);200 ASSERT_STREQ_LEN(written, buff, "-9223372036854775808"); // ll min201 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 301TEST(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 max320 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 406TEST(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 495TEST(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 the530 // 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 547TEST(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 max566 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_FLOAT650 651TEST(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#endif720 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#endif729 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#endif738 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#endif844 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#endif853 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 the1004 // min_width field. Specifically, they check that the extra zeroes added by1005 // 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 571011 // 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 1018TEST(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_PRECISION1046 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_PRECISION1055 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#endif1103 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 is1191 // set. As an example, %.9f has a precision of 9, meaning it should be rounded1192 // to 9 digits after the decimal point. In this case, that means that it1193 // should be rounded up. Many of these tests have precisions divisible by 91194 // 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_PRECISION1201 // The number continues after the literal because floating point numbers can't1202 // represent every value. The printed value is the closest value a double can1203 // 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#endif1213 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_PRECISION1218 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#endif1238 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 Tests1244 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 directly1517// measured.1518TEST(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 1281527 // bit long double systems.1528 // TODO(michaelrj): Fix the tests to only depend on the digits the long double1529 // 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_PRECISION1540 written = LIBC_NAMESPACE::sprintf(1541 buff, "%.75Lf",1542 0.0833333333333333333355920878593448009041821933351457118988037109375L);1543 ASSERT_STREQ_LEN(written, buff,1544 "0."1545 "08333333333333333333559208785934480090418219333514571189880"1546 "3710937500000000");1547 1548 written = LIBC_NAMESPACE::sprintf(buff, "%Lf", 1e100L);1549 ASSERT_STREQ_LEN(written, buff,1550 "99999999999999999996693535322073426194986990198284960792713"1551 "91541752018669482644324418977840117055488.000000");1552#endif1553 1554 written = LIBC_NAMESPACE::sprintf(buff, "%Lf", 0xd.96ed1192687859ap-24L);1555 ASSERT_STREQ_LEN(written, buff, "0.000001");1556 1557 written = LIBC_NAMESPACE::sprintf(buff, "%Lf", 10000000000000000.25L);1558 ASSERT_STREQ_LEN(written, buff, "10000000000000000.250000");1559 1560#ifndef LIBC_COPT_FLOAT_TO_STR_REDUCED_PRECISION1561 written = LIBC_NAMESPACE::sprintf(buff, "%.510Lf", 0x8p-503L);1562 ASSERT_STREQ_LEN(1563 written, buff,1564 "0."1565 "000000000000000000000000000000000000000000000000000000000000000000000000"1566 "000000000000000000000000000000000000000000000000000000000000000000000000"1567 "000000305493636349960468205197939321361769978940274057232666389361390928"1568 "129162652472045770185723510801522825687515269359046715531785342780428396"1569 "973513311420091788963072442053377285222203558881953188370081650866793017"1570 "948791366338993705251636497892270212003524508209121908744820211960149463"1571 "721109340307985507678283651836204093399373959982767701148986816406250000"1572 "000000");1573#endif1574 1575 written = LIBC_NAMESPACE::sprintf(buff, "%.500Lf", -4327677766926336.0L);1576 ASSERT_STREQ_LEN(1577 written, buff,1578 "-4327677766926336."1579 "000000000000000000000000000000000000000000000000000000000000000000000000"1580 "000000000000000000000000000000000000000000000000000000000000000000000000"1581 "000000000000000000000000000000000000000000000000000000000000000000000000"1582 "000000000000000000000000000000000000000000000000000000000000000000000000"1583 "000000000000000000000000000000000000000000000000000000000000000000000000"1584 "000000000000000000000000000000000000000000000000000000000000000000000000"1585 "00000000000000000000000000000000000000000000000000000000000000000000");1586 1587 char big_buff[10000]; // Used for extremely wide numbers.1588 1589#ifndef LIBC_COPT_FLOAT_TO_STR_REDUCED_PRECISION1590 written = LIBC_NAMESPACE::sprintf(big_buff, "%Lf", 1e1000L);1591 ASSERT_STREQ_LEN(1592 written, big_buff,1593 "999999999999999999973107317669562353428234857594552594925899449376328728"1594 "202461036775511405481186963193066642191664822065529414252060696836533522"1595 "387143501724276282079456797058697369889056407118642873669166717313763499"1596 "277025985141177344925615052465165938514140943010597323750202561187880136"1597 "174810574553749194614479541820148407958204853833697063267336294787191005"1598 "628217462261955103745349844675732989944229689277833828743730290177882029"1599 "042613704915899149603539993716885598351951895974316347947147507970269673"1600 "097709017164643598452451201499004104341931127294141495501309305995449742"1601 "273419524803597130450457553871345958049837885085168840317195672271085085"1602 "950520957945970913451088104971436093671776829538796532762184174216651692"1603 "640931965387852083906784898823494867055070322768919156031682291829761007"1604 "101483799978382119231551218582499361996919560548090784230386907125151658"1605 "086767207295524036170321059257942621398084478974000973622199163292708506"1606 "2431457550909271560663602154947063707982236377366647567795879936."1607 "000000");1608 1609 written = LIBC_NAMESPACE::sprintf(big_buff, "%Lf", 1e4900L);1610 ASSERT_STREQ_LEN(1611 written, big_buff,1612 "100000000000000000002708312230690349833224052504078834346502930111959028"1613 "517260692666637048230414374897655201843766090626319971729765251179632020"1614 "313912652522792711197087872698264530532442630109549129842736280196919130"1615 "242615101228133188193853826983121366159061148351354364472807590931218045"1616 "387490935930967150336231085015126034696883068553581691802388371635128003"1617 "615577299166097675723780877126495909902479233742826339471026068806070433"1618 "075629449530819183550315434973800271862658869400009022028602967197463980"1619 "126881829804282202449930132940824361207087494829502385835258094836304011"1620 "876250359661206802659650567866176246063987902366800491980400341950657151"1621 "370854446585517805253310195469184699955519312761482572080479702840420595"1622 "377369017651259376039167277822106875560385309101650382998482652792335482"1623 "865443482342801545877390859444282105890147577937366066315975231014810320"1624 "888482059656248277607763361589359794524314002443575149260630989130103550"1625 "443177966380769341050735632338583912575890190136462629316287947355057647"1626 "111088565611192544631519843618778618820046304429723908484879583579178075"1627 "456701368334212923379389029311286386996015804122917416008806233549005183"1628 "152461084266176543129004016414959261473645240454289630182591200574019087"1629 "358223489767381636349719510715487188747217311279465814538495924567014916"1630 "238565628036285599497236493491668884212847699052761266207598941300449276"1631 "447201387520841811835583254242213093566548778954711633721122784159793843"1632 "766802019309395771984693609426401362800013936338891483689127845928572536"1633 "790651156184721483511507878883282891696900630100211914227950790472211403"1634 "392549466062537498185758854079775888444518306635752468713312357556380082"1635 "275500658967283696421824354930077523691855699312544373220921962817907078"1636 "445538421941800259027487429330768616490865438859612697367766323925013940"1637 "918384858952407145253573823848733994146335416209309233074165707437420756"1638 "438833918763109580759409985573826485055208965115587885226774453455112406"1639 "581351429640282227888764449360534584421929291565334894907337572527922691"1640 "473242328379737396430908523008687037407295838014450772162091496534584696"1641 "605157436893236842602956298545594095307060870397506421786236892553632163"1642 "491468601982681381011940409602294892199042638682530687578982576819839451"1643 "907594697546439533559153604700750696252355362322662219852740143212566818"1644 "745528402265116534684566273868361460640280523251242059850044328669692159"1645 "629900374576027104298177006629276014371540945261309319363704125592775129"1646 "543526908667388673739382491147471395192495459318806593271282662311169392"1647 "196897003517840025298267505925987901751541005546610016067658227181318892"1648 "914686508281007582655667597441346214499847364272258631922040641860333431"1649 "409838623713258383681350233064164940590695888300919626215847587544298023"1650 "636416943680102708406086295669759876682046839368574433996997648445207805"1651 "615784339667691231286807666753972942872019850432610318031627872612657513"1652 "588188267160616660825719678199868371370527508463011236193719286066916786"1653 "169956541349011494927225747024994619057884118692213564790598702879596058"1654 "672338334720925179141906809470606964896245458600635183723159228561689808"1655 "246141482736625197373238197777325580142168245885279594913851700941789475"1656 "252421784152262567254611571822468808675893407728003047921107885664474662"1657 "930921581384003950729114103689170603748380178682003976896397305836815761"1658 "717676338115866650889936516794601457549097578905329423919798362140648664"1659 "569177147076571576101649257502509463877402424847669830852345415301684820"1660 "395813946416649808062227494112874521812750160935760825922220707178083076"1661 "380203450993589198835885505461509442443773367592842795410339065860781804"1662 "024975272228687688301824830333940416256885455008512598774611538878683158"1663 "183931461086893832255176926531299425504132104728730288984598001187854507"1664 "900417184206801359847651992484444933900133130832052346600926424167009902"1665 "829803553087005800387704758687923428053612864451456596148162238935900033"1666 "917094683141205188616000211702577553792389670853917118547527592495253773"1667 "028135298405566315903922235989614934474805789300370437580494193066066314"1668 "056627605207631392651010580925826419831250810981343093764403877594495896"1669 "516881097415880926429607388979497471571321217205535961262051641426436441"1670 "668989765107456413733909427384182109285933511623871034309722437967253289"1671 "084018145083721513211807496392673952789642893241520398827805325610653506"1672 "029060153153064455898648607959013571280930834475689835845791849456112104"1673 "462337569019001580859906425911782967213265389744605395555069797947978230"1674 "708108432086217134763779632408473684293543722127232658767439906910370146"1675 "716836295909075482355827087389127370874842532825987593970846704144140471"1676 "956027276735614286138656432085771988513977140957180090146798065497158947"1677 "229765733489703157617307078835099906185890777007500964162371428641176460"1678 "739074789794941408428328217107759915202650066155868439585510978709442590"1679 "231934194956788626761834746430104077432547436359522462253411168467463134"1680 "24896.000000");1681 1682 written =1683 LIBC_NAMESPACE::sprintf(big_buff, "%Lf", 0xf.fffffffffffffffp+16380L);1684 ASSERT_STREQ_LEN(1685 written, big_buff,1686 "118973149535723176502126385303097020516906332229462420044032373389173700"1687 "552297072261641029033652888285354569780749557731442744315367028843419812"1688 "557385374367867359320070697326320191591828296152436552951064679108661431"1689 "179063216977883889613478656060039914875343321145491116008867984515486651"1690 "285234014977303760000912547939396622315138362241783854274391783813871780"1691 "588948754057516822634765923557697480511372564902088485522249479139937758"1692 "502601177354918009979622602685950855888360815984690023564513234659447638"1693 "493985927645628457966177293040780660922910271504608538808795932778162298"1694 "682754783076808004015069494230341172895777710033571401055977524212405734"1695 "700738625166011082837911962300846927720096515350020847447079244384854591"1696 "288672300061908512647211195136146752763351956292759795725027800298079590"1697 "419313960302147099703527646744553092202267965628099149823208332964124103"1698 "850923918473478612192169721054348428704835340811304257300221642134891734"1699 "717423480071488075100206439051723424765600472176809648610799494341570347"1700 "632064355862420744350442438056613601760883747816538902780957697597728686"1701 "007148702828795556714140463261583262360276289631617397848425448686060994"1702 "827086796804807870251185893083854658422304090880599629459458620190376604"1703 "844679092600222541053077590106576067134720012584640695703025713896098375"1704 "799892695455305236856075868317922311363951946885088077187210470520395758"1705 "748001314313144425494391994017575316933939236688185618912993172910425292"1706 "123683515992232205099800167710278403536014082929639811512287776813570604"1707 "578934353545169653956125404884644716978689321167108722908808277835051822"1708 "885764606221873970285165508372099234948333443522898475123275372663606621"1709 "390228126470623407535207172405866507951821730346378263135339370677490195"1710 "019784169044182473806316282858685774143258116536404021840272491339332094"1711 "921949842244273042701987304453662035026238695780468200360144729199712309"1712 "553005720614186697485284685618651483271597448120312194675168637934309618"1713 "961510733006555242148519520176285859509105183947250286387163249416761380"1714 "499631979144187025430270675849519200883791516940158174004671147787720145"1715 "964446117520405945350476472180797576111172084627363927960033967047003761"1716 "337450955318415007379641260504792325166135484129188421134082301547330475"1717 "406707281876350361733290800595189632520707167390454777712968226520622565"1718 "143991937680440029238090311243791261477625596469422198137514696707944687"1719 "035800439250765945161837981185939204954403611491531078225107269148697980"1720 "924094677214272701240437718740921675661363493890045123235166814608932240"1721 "069799317601780533819184998193300841098599393876029260139091141452600372"1722 "028487213241195542428210183120421610446740462163533690058366460659115629"1723 "876474552506814500393294140413149540067760295100596225302282300363147382"1724 "468105964844244132486457313743759509641616804802412935187620466813563687"1725 "753281467553879887177183651289394719533506188500326760735438867336800207"1726 "438784965701457609034985757124304510203873049485425670247933932280911052"1727 "604153852899484920399109194612991249163328991799809438033787952209313146"1728 "694614970593966415237594928589096048991612194498998638483702248667224914"1729 "892467841020618336462741696957630763248023558797524525373703543388296086"1730 "275342774001633343405508353704850737454481975472222897528108302089868263"1731 "302028525992308416805453968791141829762998896457648276528750456285492426"1732 "516521775079951625966922911497778896235667095662713848201819134832168799"1733 "586365263762097828507009933729439678463987902491451422274252700636394232"1734 "799848397673998715441855420156224415492665301451550468548925862027608576"1735 "183712976335876121538256512963353814166394951655600026415918655485005705"1736 "261143195291991880795452239464962763563017858089669222640623538289853586"1737 "759599064700838568712381032959192649484625076899225841930548076362021508"1738 "902214922052806984201835084058693849381549890944546197789302911357651677"1739 "540623227829831403347327660395223160342282471752818181884430488092132193"1740 "355086987339586127607367086665237555567580317149010847732009642431878007"1741 "000879734603290627894355374356444885190719161645514115576193939969076741"1742 "515640282654366402676009508752394550734155613586793306603174472092444651"1743 "353236664764973540085196704077110364053815007348689179836404957060618953"1744 "500508984091382686953509006678332447257871219660441528492484004185093281"1745 "190896363417573989716659600075948780061916409485433875852065711654107226"1746 "099628815012314437794400874930194474433078438899570184271000480830501217"1747 "712356062289507626904285680004771889315808935851559386317665294808903126"1748 "774702966254511086154895839508779675546413794489596052797520987481383976"1749 "257859210575628440175934932416214833956535018919681138909184379573470326"1750 "940634289008780584694035245347939808067427323629788710086717580253156130"1751 "235606487870925986528841635097252953709111431720488774740553905400942537"1752 "542411931794417513706468964386151771884986701034153254238591108962471088"1753 "538580868883777725864856414593426212108664758848926003176234596076950884"1754 "9149662444156604419552086811989770240.000000");1755#endif1756 1757 written = LIBC_NAMESPACE::sprintf(big_buff, "%.10Lf", 1e-10L);1758 ASSERT_STREQ_LEN(written, big_buff, "0.0000000001");1759 1760#ifndef LIBC_COPT_FLOAT_TO_STR_REDUCED_PRECISION1761 written = LIBC_NAMESPACE::sprintf(big_buff, "%.7500Lf", 1e-4900L);1762 ASSERT_STREQ_LEN(1763 written, big_buff,1764 "0."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 "000000000000000000000000000000000000000000000000000000000000000000000000"1826 "000000000000000000000000000000000000000000000000000000000000000000000000"1827 "000000000000000000000000000000000000000000000000000000000000000000000000"1828 "000000000000000000000000000000000000000000000000000000000000000000000000"1829 "000000000000000000000000000000000000000000000000000000000000000000000000"1830 "000000000000000000000000000000000000000000000000000000000000000000000000"1831 "000000000000000000000000000000000000000000000000000000000000000000000000"1832 "000000000000000000000000000000000000000000000000000000000000000000000000"1833 "000099999999999999999996962764452956071352139203248614920751610856665084"1834 "549214352477698417183862158583009348897567779527408501588132175167211539"1835 "462139941448204886585901454195352527238724272760638086779284030512649793"1836 "039219351187928723378036480041948464946018272171365770411701020666925613"1837 "422460317465324758217878522666789603627480490870456508256359180089236338"1838 "765625231186929290294207420828927406735690318849109129700396907705735097"1839 "663944722727287361650042373203763784830198232253311807069225650324196304"1840 "532045014970637489181357566354288111205943347410488298480279857453705249"1841 "232862728556860184412369114663536200895729846877559808001004454634804626"1842 "541455540260282018142615835686583304903486353937549394736905011798466731"1843 "536563240053860118551127061960208467764243724656897127545613968909523389"1844 "577188368809623987105800147797280462974804046545425080530020901531407223"1845 "191237123282274818236437397994019915368657474589800678444589412286037789"1846 "891525464936023205313685584525510094270344601331453730179416773626565262"1847 "480345858564672442896904520146956686863172737711483866766404977719744767"1848 "834324844875237277613991088218774564658513875732403456058414595576806383"1849 "115554713240005982141397577420073082470139244845624915873825746771661332"1850 "098677966580506186966978746832443976821987300902957597498388211921362869"1851 "017846215557612829071692275292036211064515305528052919611691470945774714"1852 "135516559501572279732350629089770249554808690411603894492333360300589658"1853 "470898965370892774715815089075170720164713889237058574941489766701880158"1854 "060081295483989540170337129032188818293132770882381428397119039835946745"1855 "549356649433406617266370644136291924838857814675939156677910783740103207"1856 "523299367093130816446415259371931925208362367989095199399211644084543790"1857 "110432339056231037520216864358899218874658268610955002763260912337688947"1858 "822453100821038299301092582962825965939081817836419126254832772002214908"1859 "085575905761843610944187009818156363893015929300295112598059949496854566"1860 "638748010633726861510500653821408135845840123073754133549077708843800674"1861 "328440913743105608636458354618912183716456158809545183074062249922212944"1862 "249667793845728355381309084891765979111348980470647082269921872595470473"1863 "719354467594516320911964549508538492057120740224559944452120552719041944"1864 "961475548547884309626382512432626380881023756568143060204097921571153170"1865 "723817845809196253498326358439807445210362177680590181657555380795450462"1866 "223805222580359379367452693270553602179122419370586308101820559214330382"1867 "570449525088342437216896462077260223998756027453411520977536701491759878"1868 "422771447006016890777855573925295187921971811871399320142563330377888532"1869 "179817332113");1870#endif1871#endif // LIBC_TYPES_LONG_DOUBLE_IS_X86_FLOAT801872 1873#if defined(LIBC_TYPES_LONG_DOUBLE_IS_FLOAT128)1874 // Some exceptionally difficult cases for 39-digit precision. (That's the1875 // number of digits supported by the float320 algorithm, and should still be1876 // correct under other algorithms. So these are still enabled even under1877 // LIBC_COPT_FLOAT_TO_STR_REDUCED_PRECISION.)1878 //1879 // These were found by number-theoretic search to be the worst cases in terms1880 // of being extremely close to the rounding boundary between two possible1881 // decimal outputs. For example, the first of these cases has a true value1882 // beginning with1883 //1884 // 2.2457869644188155228316136144221128387950000000000000000001885 // 0000000000000000010767969...1886 //1887 // so you need to compute a _long_ way past the 39th digit to find out1888 // whether to round the ...8795 up to 880 or not!1889 //1890 // The first half of these cases all rounded up; the second half all rounded1891 // down. You can see that in both sections the final decimal digit is1892 // sometimes odd and sometimes even, ruling out the possibility that we're1893 // getting these right by mistakenly assuming them to be _exactly_ on the1894 // boundary.1895 1896 written = LIBC_NAMESPACE::sprintf(buff, "%#.39Lg",1897 0x1.bde5716bba8d70255b4be10e0a0ap-3388L);1898 ASSERT_STREQ_LEN(written, buff,1899 "2.24578696441881552283161361442211283880e-1020");1900 written = LIBC_NAMESPACE::sprintf(buff, "%#.39Lg",1901 0x1.64b78defc8712684490980d80808p-3391L);1902 ASSERT_STREQ_LEN(written, buff,1903 "2.24578696441881552283161361442211283880e-1021");1904 written = LIBC_NAMESPACE::sprintf(buff, "%#.39Lg",1905 0x1.c0eed9d1ea4b6f215accb15cb42cp-4714L);1906 ASSERT_STREQ_LEN(written, buff,1907 "1.54362575487963943466308346767014523161e-1419");1908 written = LIBC_NAMESPACE::sprintf(buff, "%#.39Lg",1909 0x1.a393eaafc3dbabfcd30442cef525p-12600L);1910 ASSERT_STREQ_LEN(written, buff,1911 "1.72435694193924008931441874634575361189e-3793");1912 written = LIBC_NAMESPACE::sprintf(buff, "%#.39Lg",1913 0x1.b7a5248baf85133c9b7bf3241f75p+11050L);1914 ASSERT_STREQ_LEN(written, buff,1915 "4.13346579244549095104252956440178208514e+3326");1916 written = LIBC_NAMESPACE::sprintf(buff, "%#.39Lg",1917 0x1.81bf6d977f99ff7bd9debdd52815p+1359L);1918 ASSERT_STREQ_LEN(written, buff,1919 "1.89595297593127274811683259716608232064e+409");1920 written = LIBC_NAMESPACE::sprintf(buff, "%#.39Lg",1921 0x1.fcb9cfd65f068b758d30ba19a494p-4451L);1922 ASSERT_STREQ_LEN(written, buff,1923 "2.59258570015527007681686041122929728653e-1340");1924 written = LIBC_NAMESPACE::sprintf(buff, "%#.39Lg",1925 0x1.7d8b5be0c744e89829e48b933b6fp-4448L);1926 ASSERT_STREQ_LEN(written, buff,1927 "1.55555142009316204609011624673757837192e-1339");1928 written = LIBC_NAMESPACE::sprintf(buff, "%#.39Lg",1929 0x1.dbb1f01aef7b93c37ca00217888cp-12205L);1930 ASSERT_STREQ_LEN(written, buff,1931 "1.57758077908296078543773740016012372216e-3674");1932 written = LIBC_NAMESPACE::sprintf(buff, "%#.39Lg",1933 0x1.fb037d72fdf1a8aa8bdfc2586fe3p+2580L);1934 ASSERT_STREQ_LEN(written, buff,1935 "8.99846610004600287527755301065037553046e+776");1936 1937 written = LIBC_NAMESPACE::sprintf(buff, "%#.39Lg",1938 0x1.9af8fe5febf751a795292e30335dp+2052L);1939 ASSERT_STREQ_LEN(written, buff,1940 "8.30087814106622071390265113980150545241e+617");1941 written = LIBC_NAMESPACE::sprintf(buff, "%#.39Lg",1942 0x1.48c731e6565f748610edbe8cf5e4p+2049L);1943 ASSERT_STREQ_LEN(written, buff,1944 "8.30087814106622071390265113980150545241e+616");1945 written = LIBC_NAMESPACE::sprintf(buff, "%#.39Lg",1946 0x1.8e78bc76e98998b7bbf6c8f80f2ap-5671L);1947 ASSERT_STREQ_LEN(written, buff,1948 "1.12473970318904704063044350553302771341e-1707");1949 written = LIBC_NAMESPACE::sprintf(buff, "%#.39Lg",1950 0x1.59a832c16a7797aec70196ddf9dbp-16181L);1951 ASSERT_STREQ_LEN(written, buff,1952 "1.45896738321434823250358135932839533040e-4871");1953 written = LIBC_NAMESPACE::sprintf(buff, "%#.39Lg",1954 0x1.14868f0121f946256c01457e617cp-16184L);1955 ASSERT_STREQ_LEN(written, buff,1956 "1.45896738321434823250358135932839533040e-4872");1957 written = LIBC_NAMESPACE::sprintf(buff, "%#.39Lg",1958 0x1.0ca8c4b525b1128506cdc668df43p+11017L);1959 ASSERT_STREQ_LEN(written, buff,1960 "2.94051951004764266903705588743096762647e+3316");1961 written = LIBC_NAMESPACE::sprintf(buff, "%#.39Lg",1962 0x1.fcd40bb49b18aa19d66a3c5572dep+5547L);1963 ASSERT_STREQ_LEN(written, buff,1964 "1.29335350323078956384272678475060580129e+1670");1965 written = LIBC_NAMESPACE::sprintf(buff, "%#.39Lg",1966 0x1.0e5e51510a653e744d6b84efed86p-13613L);1967 ASSERT_STREQ_LEN(written, buff,1968 "1.26585813611514592337442314391432904094e-4098");1969 written = LIBC_NAMESPACE::sprintf(buff, "%#.39Lg",1970 0x1.ff41f8aa97e676e95b1a6a7751fap+16366L);1971 ASSERT_STREQ_LEN(written, buff,1972 "9.06377119787295161934827646572467920486e+4926");1973 written = LIBC_NAMESPACE::sprintf(buff, "%#.39Lg",1974 0x1.4770bf66ccafd7d80ac9bb3dded7p-1843L);1975 ASSERT_STREQ_LEN(written, buff,1976 "2.03521509642091239545213340619368190283e-555");1977 1978#endif // LIBC_TYPES_LONG_DOUBLE_IS_FLOAT1281979}1980 1981TEST(LlvmLibcSPrintfTest, FloatExponentConv) {1982 char buff[1000];1983 int written;1984 1985 ForceRoundingMode r(RoundingMode::Nearest);1986 double inf = LIBC_NAMESPACE::fputil::FPBits<double>::inf().get_val();1987 double nan = LIBC_NAMESPACE::fputil::FPBits<double>::quiet_nan().get_val();1988 1989 written = LIBC_NAMESPACE::sprintf(buff, "%e", 1.0);1990 ASSERT_STREQ_LEN(written, buff, "1.000000e+00");1991 1992 written = LIBC_NAMESPACE::sprintf(buff, "%E", -1.0);1993 ASSERT_STREQ_LEN(written, buff, "-1.000000E+00");1994 1995 written = LIBC_NAMESPACE::sprintf(buff, "%e", -1.234567);1996 ASSERT_STREQ_LEN(written, buff, "-1.234567e+00");1997 1998 written = LIBC_NAMESPACE::sprintf(buff, "%e", 0.0);1999 ASSERT_STREQ_LEN(written, buff, "0.000000e+00");2000 2001 written = LIBC_NAMESPACE::sprintf(buff, "%e", 1.5);2002 ASSERT_STREQ_LEN(written, buff, "1.500000e+00");2003 2004 written = LIBC_NAMESPACE::sprintf(buff, "%e", 1e300);2005 ASSERT_STREQ_LEN(written, buff, "1.000000e+300");2006 2007 written = LIBC_NAMESPACE::sprintf(buff, "%e", 0.1);2008 ASSERT_STREQ_LEN(written, buff, "1.000000e-01");2009 2010 written = LIBC_NAMESPACE::sprintf(buff, "%e", 0.001);2011 ASSERT_STREQ_LEN(written, buff, "1.000000e-03");2012 2013 written = LIBC_NAMESPACE::sprintf(buff, "%e", 0.00001);2014 ASSERT_STREQ_LEN(written, buff, "1.000000e-05");2015 2016 written = LIBC_NAMESPACE::sprintf(buff, "%e", 0.0000001);2017 ASSERT_STREQ_LEN(written, buff, "1.000000e-07");2018 2019 written = LIBC_NAMESPACE::sprintf(buff, "%e", 0.000000001);2020 ASSERT_STREQ_LEN(written, buff, "1.000000e-09");2021 2022 written = LIBC_NAMESPACE::sprintf(buff, "%e", 1.0e-20);2023 ASSERT_STREQ_LEN(written, buff, "1.000000e-20");2024 2025 written = LIBC_NAMESPACE::sprintf(buff, "%e", 1234567890123456789.0);2026 ASSERT_STREQ_LEN(written, buff, "1.234568e+18");2027 2028 written = LIBC_NAMESPACE::sprintf(buff, "%e", 9999999000000.00);2029 ASSERT_STREQ_LEN(written, buff, "9.999999e+12");2030 2031 // Simple Subnormal Tests.2032 2033 written = LIBC_NAMESPACE::sprintf(buff, "%e", 0x1.0p-1027);2034 ASSERT_STREQ_LEN(written, buff, "6.953356e-310");2035 2036 written = LIBC_NAMESPACE::sprintf(buff, "%e", 0x1.0p-1074);2037 ASSERT_STREQ_LEN(written, buff, "4.940656e-324");2038 2039 // Inf/Nan Tests.2040 2041 written = LIBC_NAMESPACE::sprintf(buff, "%e", inf);2042 ASSERT_STREQ_LEN(written, buff, "inf");2043 2044 written = LIBC_NAMESPACE::sprintf(buff, "%E", -inf);2045 ASSERT_STREQ_LEN(written, buff, "-INF");2046 2047 written = LIBC_NAMESPACE::sprintf(buff, "%e", nan);2048 ASSERT_STREQ_LEN(written, buff, "nan");2049 2050 written = LIBC_NAMESPACE::sprintf(buff, "%E", -nan);2051 ASSERT_STREQ_LEN(written, buff, "-NAN");2052 2053 // Min Width Tests.2054 2055 written = LIBC_NAMESPACE::sprintf(buff, "%15e", 1.0);2056 ASSERT_STREQ_LEN(written, buff, " 1.000000e+00");2057 2058 written = LIBC_NAMESPACE::sprintf(buff, "%15e", -1.0);2059 ASSERT_STREQ_LEN(written, buff, " -1.000000e+00");2060 2061 written = LIBC_NAMESPACE::sprintf(buff, "%15e", 1.0e5);2062 ASSERT_STREQ_LEN(written, buff, " 1.000000e+05");2063 2064 written = LIBC_NAMESPACE::sprintf(buff, "%15e", -1.0e5);2065 ASSERT_STREQ_LEN(written, buff, " -1.000000e+05");2066 2067 written = LIBC_NAMESPACE::sprintf(buff, "%10e", 1.0e-5);2068 ASSERT_STREQ_LEN(written, buff, "1.000000e-05");2069 2070 // Precision Tests.2071 2072 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.0);2073 ASSERT_STREQ_LEN(written, buff, "1.0e+00");2074 2075 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 0.0);2076 ASSERT_STREQ_LEN(written, buff, "0.0e+00");2077 2078 written = LIBC_NAMESPACE::sprintf(buff, "%.0e", 0.0);2079 ASSERT_STREQ_LEN(written, buff, "0e+00");2080 2081 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 0.1);2082 ASSERT_STREQ_LEN(written, buff, "1.0e-01");2083 2084 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.09);2085 ASSERT_STREQ_LEN(written, buff, "1.1e+00");2086 2087 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.04);2088 ASSERT_STREQ_LEN(written, buff, "1.0e+00");2089 2090 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.19);2091 ASSERT_STREQ_LEN(written, buff, "1.2e+00");2092 2093 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.99);2094 ASSERT_STREQ_LEN(written, buff, "2.0e+00");2095 2096 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 9.99);2097 ASSERT_STREQ_LEN(written, buff, "1.0e+01");2098 2099 written = LIBC_NAMESPACE::sprintf(buff, "%.2e", 99.9);2100 ASSERT_STREQ_LEN(written, buff, "9.99e+01");2101 2102 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 99.9);2103 ASSERT_STREQ_LEN(written, buff, "1.0e+02");2104 2105 written = LIBC_NAMESPACE::sprintf(buff, "%.5e", 1.25);2106 ASSERT_STREQ_LEN(written, buff, "1.25000e+00");2107 2108 written = LIBC_NAMESPACE::sprintf(buff, "%.0e", 1.25);2109 ASSERT_STREQ_LEN(written, buff, "1e+00");2110 2111 written = LIBC_NAMESPACE::sprintf(buff, "%.0e", 1.75);2112 ASSERT_STREQ_LEN(written, buff, "2e+00");2113 2114 written = LIBC_NAMESPACE::sprintf(buff, "%.20e", 1.234e-10);2115 ASSERT_STREQ_LEN(written, buff, "1.23400000000000008140e-10");2116 2117 written = LIBC_NAMESPACE::sprintf(buff, "%.2e", -9.99);2118 ASSERT_STREQ_LEN(written, buff, "-9.99e+00");2119 2120 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -9.99);2121 ASSERT_STREQ_LEN(written, buff, "-1.0e+01");2122 2123 written = LIBC_NAMESPACE::sprintf(buff, "%.5e", 0.0);2124 ASSERT_STREQ_LEN(written, buff, "0.00000e+00");2125 2126 written = LIBC_NAMESPACE::sprintf(buff, "%.5e", 1.008);2127 ASSERT_STREQ_LEN(written, buff, "1.00800e+00");2128 2129 written = LIBC_NAMESPACE::sprintf(buff, "%.5e", 1.008e3);2130 ASSERT_STREQ_LEN(written, buff, "1.00800e+03");2131 2132 // These tests also focus on rounding. Almost all of them have a 5 right after2133 // the printed string (e.g. 9.5 with precision 0 prints 0 digits after the2134 // decimal point). This is again because rounding a number with a 5 after the2135 // printed section means that more digits have to be checked to determine if2136 // this should be rounded up (if there are non-zero digits after the 5) or to2137 // even (if the 5 is the last non-zero digit). Additionally, the algorithm for2138 // checking if a number is all 0s after the decimal point may not work since2139 // the decimal point moves in this representation.2140 written = LIBC_NAMESPACE::sprintf(buff, "%.0e", 2.5812229360061737E+200);2141 ASSERT_STREQ_LEN(written, buff, "3e+200");2142 2143 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 9.059E+200);2144 ASSERT_STREQ_LEN(written, buff, "9.1e+200");2145 2146 written = LIBC_NAMESPACE::sprintf(buff, "%.0e", 9.059E+200);2147 ASSERT_STREQ_LEN(written, buff, "9e+200");2148 2149#ifndef LIBC_COPT_FLOAT_TO_STR_REDUCED_PRECISION2150 written = LIBC_NAMESPACE::sprintf(buff, "%.166e", 1.131959884853339E-72);2151 ASSERT_STREQ_LEN(written, buff,2152 "1."2153 "13195988485333904593863991136097397258531639976739227369782"2154 "68612419376648241056393424414314951197624317440549121097287"2155 "069853416091591569170304865110665559768676757812e-72");2156#endif2157 2158 written = LIBC_NAMESPACE::sprintf(buff, "%.0e", 9.5);2159 ASSERT_STREQ_LEN(written, buff, "1e+01");2160 2161 written = LIBC_NAMESPACE::sprintf(buff, "%.10e", 1.9999999999890936);2162 ASSERT_STREQ_LEN(written, buff, "2.0000000000e+00");2163 2164 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 745362143563.03894);2165 ASSERT_STREQ_LEN(written, buff, "7.5e+11");2166 2167 written = LIBC_NAMESPACE::sprintf(buff, "%.0e", 45181042688.0);2168 ASSERT_STREQ_LEN(written, buff, "5e+10");2169 2170 written = LIBC_NAMESPACE::sprintf(buff, "%.35e", 1.3752441369139243);2171 ASSERT_STREQ_LEN(written, buff, "1.37524413691392433101157166674965993e+00");2172 2173 // Subnormal Precision Tests2174 2175#ifndef LIBC_COPT_FLOAT_TO_STR_REDUCED_PRECISION2176 written = LIBC_NAMESPACE::sprintf(buff, "%.310e", 0x1.0p-1022);2177 ASSERT_STREQ_LEN(2178 written, buff,2179 "2."2180 "225073858507201383090232717332404064219215980462331830553327416887204434"2181 "813918195854283159012511020564067339731035811005152434161553460108856012"2182 "385377718821130777993532002330479610147442583636071921565046942503734208"2183 "375250806650616658158948720491179968591639648500635908770118304874799780"2184 "8877537499494515804516e-308");2185#endif2186 2187 written = LIBC_NAMESPACE::sprintf(buff, "%.30e", 0x1.0p-1022);2188 ASSERT_STREQ_LEN(written, buff, "2.225073858507201383090232717332e-308");2189 2190#ifndef LIBC_COPT_FLOAT_TO_STR_REDUCED_PRECISION2191 written = LIBC_NAMESPACE::sprintf(buff, "%.310e", 0x1.0p-1023);2192 ASSERT_STREQ_LEN(2193 written, buff,2194 "1."2195 "112536929253600691545116358666202032109607990231165915276663708443602217"2196 "406959097927141579506255510282033669865517905502576217080776730054428006"2197 "192688859410565388996766001165239805073721291818035960782523471251867104"2198 "187625403325308329079474360245589984295819824250317954385059152437399890"2199 "4438768749747257902258e-308");2200#endif2201 2202 written = LIBC_NAMESPACE::sprintf(buff, "%.6e", 9.99999e-310);2203 ASSERT_STREQ_LEN(written, buff, "9.999990e-310");2204 2205 written = LIBC_NAMESPACE::sprintf(buff, "%.5e", 9.99999e-310);2206 ASSERT_STREQ_LEN(written, buff, "9.99999e-310");2207 2208 written = LIBC_NAMESPACE::sprintf(buff, "%.4e", 9.99999e-310);2209 ASSERT_STREQ_LEN(written, buff, "1.0000e-309");2210 2211 written = LIBC_NAMESPACE::sprintf(buff, "%.3e", 9.99999e-310);2212 ASSERT_STREQ_LEN(written, buff, "1.000e-309");2213 2214 written = LIBC_NAMESPACE::sprintf(buff, "%.2e", 9.99999e-310);2215 ASSERT_STREQ_LEN(written, buff, "1.00e-309");2216 2217 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 9.99999e-310);2218 ASSERT_STREQ_LEN(written, buff, "1.0e-309");2219 2220 written = LIBC_NAMESPACE::sprintf(buff, "%.0e", 9.99999e-310);2221 ASSERT_STREQ_LEN(written, buff, "1e-309");2222 2223 written = LIBC_NAMESPACE::sprintf(buff, "%.10e", 0x1.0p-1074);2224 ASSERT_STREQ_LEN(written, buff, "4.9406564584e-324");2225 2226 // Rounding Mode Tests.2227 2228 if (ForceRoundingMode r(RoundingMode::Nearest); r.success) {2229 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.75);2230 ASSERT_STREQ_LEN(written, buff, "1.8e+00");2231 2232 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.25);2233 ASSERT_STREQ_LEN(written, buff, "1.2e+00");2234 2235 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.125);2236 ASSERT_STREQ_LEN(written, buff, "1.1e+00");2237 2238 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.625);2239 ASSERT_STREQ_LEN(written, buff, "1.6e+00");2240 2241 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.375);2242 ASSERT_STREQ_LEN(written, buff, "1.4e+00");2243 2244 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.875);2245 ASSERT_STREQ_LEN(written, buff, "1.9e+00");2246 2247 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -1.75);2248 ASSERT_STREQ_LEN(written, buff, "-1.8e+00");2249 2250 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -1.25);2251 ASSERT_STREQ_LEN(written, buff, "-1.2e+00");2252 2253 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -1.125);2254 ASSERT_STREQ_LEN(written, buff, "-1.1e+00");2255 2256 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -1.625);2257 ASSERT_STREQ_LEN(written, buff, "-1.6e+00");2258 2259 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -1.375);2260 ASSERT_STREQ_LEN(written, buff, "-1.4e+00");2261 2262 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -1.875);2263 ASSERT_STREQ_LEN(written, buff, "-1.9e+00");2264 }2265 2266 if (ForceRoundingMode r(RoundingMode::Upward); r.success) {2267 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.75);2268 ASSERT_STREQ_LEN(written, buff, "1.8e+00");2269 2270 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.25);2271 ASSERT_STREQ_LEN(written, buff, "1.3e+00");2272 2273 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.125);2274 ASSERT_STREQ_LEN(written, buff, "1.2e+00");2275 2276 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.625);2277 ASSERT_STREQ_LEN(written, buff, "1.7e+00");2278 2279 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.375);2280 ASSERT_STREQ_LEN(written, buff, "1.4e+00");2281 2282 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.875);2283 ASSERT_STREQ_LEN(written, buff, "1.9e+00");2284 2285 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -1.75);2286 ASSERT_STREQ_LEN(written, buff, "-1.7e+00");2287 2288 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -1.25);2289 ASSERT_STREQ_LEN(written, buff, "-1.2e+00");2290 2291 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -1.125);2292 ASSERT_STREQ_LEN(written, buff, "-1.1e+00");2293 2294 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -1.625);2295 ASSERT_STREQ_LEN(written, buff, "-1.6e+00");2296 2297 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -1.375);2298 ASSERT_STREQ_LEN(written, buff, "-1.3e+00");2299 2300 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -1.875);2301 ASSERT_STREQ_LEN(written, buff, "-1.8e+00");2302 }2303 2304 if (ForceRoundingMode r(RoundingMode::Downward); r.success) {2305 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.75);2306 ASSERT_STREQ_LEN(written, buff, "1.7e+00");2307 2308 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.25);2309 ASSERT_STREQ_LEN(written, buff, "1.2e+00");2310 2311 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.125);2312 ASSERT_STREQ_LEN(written, buff, "1.1e+00");2313 2314 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.625);2315 ASSERT_STREQ_LEN(written, buff, "1.6e+00");2316 2317 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.375);2318 ASSERT_STREQ_LEN(written, buff, "1.3e+00");2319 2320 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.875);2321 ASSERT_STREQ_LEN(written, buff, "1.8e+00");2322 2323 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -1.75);2324 ASSERT_STREQ_LEN(written, buff, "-1.8e+00");2325 2326 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -1.25);2327 ASSERT_STREQ_LEN(written, buff, "-1.3e+00");2328 2329 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -1.125);2330 ASSERT_STREQ_LEN(written, buff, "-1.2e+00");2331 2332 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -1.625);2333 ASSERT_STREQ_LEN(written, buff, "-1.7e+00");2334 2335 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -1.375);2336 ASSERT_STREQ_LEN(written, buff, "-1.4e+00");2337 2338 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -1.875);2339 ASSERT_STREQ_LEN(written, buff, "-1.9e+00");2340 }2341 2342 if (ForceRoundingMode r(RoundingMode::TowardZero); r.success) {2343 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.75);2344 ASSERT_STREQ_LEN(written, buff, "1.7e+00");2345 2346 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.25);2347 ASSERT_STREQ_LEN(written, buff, "1.2e+00");2348 2349 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.125);2350 ASSERT_STREQ_LEN(written, buff, "1.1e+00");2351 2352 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.625);2353 ASSERT_STREQ_LEN(written, buff, "1.6e+00");2354 2355 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.375);2356 ASSERT_STREQ_LEN(written, buff, "1.3e+00");2357 2358 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.875);2359 ASSERT_STREQ_LEN(written, buff, "1.8e+00");2360 2361 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -1.75);2362 ASSERT_STREQ_LEN(written, buff, "-1.7e+00");2363 2364 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -1.25);2365 ASSERT_STREQ_LEN(written, buff, "-1.2e+00");2366 2367 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -1.125);2368 ASSERT_STREQ_LEN(written, buff, "-1.1e+00");2369 2370 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -1.625);2371 ASSERT_STREQ_LEN(written, buff, "-1.6e+00");2372 2373 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -1.375);2374 ASSERT_STREQ_LEN(written, buff, "-1.3e+00");2375 2376 written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -1.875);2377 ASSERT_STREQ_LEN(written, buff, "-1.8e+00");2378 }2379 2380 // Flag Tests.2381 written = LIBC_NAMESPACE::sprintf(buff, "%+e", 1.0);2382 ASSERT_STREQ_LEN(written, buff, "+1.000000e+00");2383 2384 written = LIBC_NAMESPACE::sprintf(buff, "%+e", -1.0);2385 ASSERT_STREQ_LEN(written, buff, "-1.000000e+00");2386 2387 written = LIBC_NAMESPACE::sprintf(buff, "% e", 1.0);2388 ASSERT_STREQ_LEN(written, buff, " 1.000000e+00");2389 2390 written = LIBC_NAMESPACE::sprintf(buff, "% e", -1.0);2391 ASSERT_STREQ_LEN(written, buff, "-1.000000e+00");2392 2393 written = LIBC_NAMESPACE::sprintf(buff, "%-15e", 1.5);2394 ASSERT_STREQ_LEN(written, buff, "1.500000e+00 ");2395 2396 written = LIBC_NAMESPACE::sprintf(buff, "%#.e", 1.0);2397 ASSERT_STREQ_LEN(written, buff, "1.e+00");2398 2399 written = LIBC_NAMESPACE::sprintf(buff, "%#.0e", 1.5);2400 ASSERT_STREQ_LEN(written, buff, "2.e+00");2401 2402 written = LIBC_NAMESPACE::sprintf(buff, "%015e", 1.5);2403 ASSERT_STREQ_LEN(written, buff, "0001.500000e+00");2404 2405 written = LIBC_NAMESPACE::sprintf(buff, "%015e", -1.5);2406 ASSERT_STREQ_LEN(written, buff, "-001.500000e+00");2407 2408 written = LIBC_NAMESPACE::sprintf(buff, "%+- #0e", 0.0);2409 ASSERT_STREQ_LEN(written, buff, "+0.000000e+00");2410 2411 // Combined Tests.2412 2413 written = LIBC_NAMESPACE::sprintf(buff, "%10.2e", 9.99);2414 ASSERT_STREQ_LEN(written, buff, " 9.99e+00");2415 2416 written = LIBC_NAMESPACE::sprintf(buff, "%10.1e", 9.99);2417 ASSERT_STREQ_LEN(written, buff, " 1.0e+01");2418 2419 written = LIBC_NAMESPACE::sprintf(buff, "%10.0e", 9.99);2420 ASSERT_STREQ_LEN(written, buff, " 1e+01");2421 2422 written = LIBC_NAMESPACE::sprintf(buff, "%10.0e", 0.0999);2423 ASSERT_STREQ_LEN(written, buff, " 1e-01");2424 2425 written = LIBC_NAMESPACE::sprintf(buff, "%-10.2e", 9.99);2426 ASSERT_STREQ_LEN(written, buff, "9.99e+00 ");2427 2428 written = LIBC_NAMESPACE::sprintf(buff, "%-10.1e", 9.99);2429 ASSERT_STREQ_LEN(written, buff, "1.0e+01 ");2430 2431 written = LIBC_NAMESPACE::sprintf(buff, "%-10.1e", 1.0e-50);2432 ASSERT_STREQ_LEN(written, buff, "1.0e-50 ");2433 2434 written = LIBC_NAMESPACE::sprintf(buff, "%30e", 1234567890123456789.0);2435 ASSERT_STREQ_LEN(written, buff, " 1.234568e+18");2436 2437 written = LIBC_NAMESPACE::sprintf(buff, "%-30e", 1234567890123456789.0);2438 ASSERT_STREQ_LEN(written, buff, "1.234568e+18 ");2439 2440 written = LIBC_NAMESPACE::sprintf(buff, "%25.14e", 9999999999999.99);2441 ASSERT_STREQ_LEN(written, buff, " 9.99999999999999e+12");2442 2443 written = LIBC_NAMESPACE::sprintf(buff, "%25.13e", 9999999999999.99);2444 ASSERT_STREQ_LEN(written, buff, " 1.0000000000000e+13");2445 2446 written = LIBC_NAMESPACE::sprintf(buff, "%25.12e", 9999999999999.99);2447 ASSERT_STREQ_LEN(written, buff, " 1.000000000000e+13");2448 2449 written = LIBC_NAMESPACE::sprintf(buff, "%12.3e %-12.3e", 0.1, 256.0);2450 ASSERT_STREQ_LEN(written, buff, " 1.000e-01 2.560e+02 ");2451 2452 written = LIBC_NAMESPACE::sprintf(buff, "%+-#12.3e % 012.3e", 0.1256, 1256.0);2453 ASSERT_STREQ_LEN(written, buff, "+1.256e-01 001.256e+03");2454}2455 2456TEST(LlvmLibcSPrintfTest, FloatExponentLongDoubleConv) {2457 char buff[1000];2458 int written;2459 2460 ForceRoundingMode r(RoundingMode::Nearest);2461 // Length Modifier Tests.2462 2463 written = LIBC_NAMESPACE::sprintf(buff, "%.9Le", 1000000000500000000.1L);2464 ASSERT_STREQ_LEN(written, buff, "1.000000001e+18");2465 2466 written = LIBC_NAMESPACE::sprintf(buff, "%.9Le", 1000000000500000000.0L);2467 ASSERT_STREQ_LEN(written, buff, "1.000000000e+18");2468 2469 written = LIBC_NAMESPACE::sprintf(buff, "%Le", 1e100L);2470 ASSERT_STREQ_LEN(written, buff, "1.000000e+100");2471 2472 written = LIBC_NAMESPACE::sprintf(buff, "%Le", 1.0L);2473 ASSERT_STREQ_LEN(written, buff, "1.000000e+00");2474 2475#if !defined(LIBC_TYPES_LONG_DOUBLE_IS_DOUBLE)2476 written = LIBC_NAMESPACE::sprintf(buff, "%Le", 0xf.fffffffffffffffp+16380L);2477 ASSERT_STREQ_LEN(written, buff, "1.189731e+4932");2478 2479 written = LIBC_NAMESPACE::sprintf(buff, "%Le", 1e1000L);2480 ASSERT_STREQ_LEN(written, buff, "1.000000e+1000");2481 2482 written = LIBC_NAMESPACE::sprintf(buff, "%Le", 1e4900L);2483 ASSERT_STREQ_LEN(written, buff, "1.000000e+4900");2484 2485 written = LIBC_NAMESPACE::sprintf(buff, "%Le", 1.2345678e4900L);2486 ASSERT_STREQ_LEN(written, buff, "1.234568e+4900");2487#endif2488}2489 2490TEST(LlvmLibcSPrintfTest, FloatAutoConv) {2491 char buff[1000];2492 int written;2493 2494 ForceRoundingMode r(RoundingMode::Nearest);2495 double inf = LIBC_NAMESPACE::fputil::FPBits<double>::inf().get_val();2496 double nan = LIBC_NAMESPACE::fputil::FPBits<double>::quiet_nan().get_val();2497 2498 written = LIBC_NAMESPACE::sprintf(buff, "%g", 1.0);2499 ASSERT_STREQ_LEN(written, buff, "1");2500 2501 written = LIBC_NAMESPACE::sprintf(buff, "%G", -1.0);2502 ASSERT_STREQ_LEN(written, buff, "-1");2503 2504 written = LIBC_NAMESPACE::sprintf(buff, "%g", -1.234567);2505 ASSERT_STREQ_LEN(written, buff, "-1.23457");2506 2507 written = LIBC_NAMESPACE::sprintf(buff, "%g", 0.0);2508 ASSERT_STREQ_LEN(written, buff, "0");2509 2510 written = LIBC_NAMESPACE::sprintf(buff, "%g", -0.0);2511 ASSERT_STREQ_LEN(written, buff, "-0");2512 2513 written = LIBC_NAMESPACE::sprintf(buff, "%g", 1.5);2514 ASSERT_STREQ_LEN(written, buff, "1.5");2515 2516 written = LIBC_NAMESPACE::sprintf(buff, "%g", 1e300);2517 ASSERT_STREQ_LEN(written, buff, "1e+300");2518 2519 written = LIBC_NAMESPACE::sprintf(buff, "%g", 0.1);2520 ASSERT_STREQ_LEN(written, buff, "0.1");2521 2522 written = LIBC_NAMESPACE::sprintf(buff, "%g", 0.001);2523 ASSERT_STREQ_LEN(written, buff, "0.001");2524 2525 written = LIBC_NAMESPACE::sprintf(buff, "%g", 0.00001);2526 ASSERT_STREQ_LEN(written, buff, "1e-05");2527 2528 written = LIBC_NAMESPACE::sprintf(buff, "%g", 0.0000001);2529 ASSERT_STREQ_LEN(written, buff, "1e-07");2530 2531 written = LIBC_NAMESPACE::sprintf(buff, "%g", 0.000000001);2532 ASSERT_STREQ_LEN(written, buff, "1e-09");2533 2534 written = LIBC_NAMESPACE::sprintf(buff, "%g", 1.0e-20);2535 ASSERT_STREQ_LEN(written, buff, "1e-20");2536 2537 written = LIBC_NAMESPACE::sprintf(buff, "%g", 1234567890123456789.0);2538 ASSERT_STREQ_LEN(written, buff, "1.23457e+18");2539 2540 written = LIBC_NAMESPACE::sprintf(buff, "%g", 9999990000000.00);2541 ASSERT_STREQ_LEN(written, buff, "9.99999e+12");2542 2543 written = LIBC_NAMESPACE::sprintf(buff, "%g", 9999999000000.00);2544 ASSERT_STREQ_LEN(written, buff, "1e+13");2545 2546 written = LIBC_NAMESPACE::sprintf(buff, "%g", 0xa.aaaaaaaaaaaaaabp-7);2547 ASSERT_STREQ_LEN(written, buff, "0.0833333");2548 2549 // Simple Subnormal Tests.2550 2551 written = LIBC_NAMESPACE::sprintf(buff, "%g", 0x1.0p-1027);2552 ASSERT_STREQ_LEN(written, buff, "6.95336e-310");2553 2554 written = LIBC_NAMESPACE::sprintf(buff, "%g", 0x1.0p-1074);2555 ASSERT_STREQ_LEN(written, buff, "4.94066e-324");2556 2557 // Inf/Nan Tests.2558 2559 written = LIBC_NAMESPACE::sprintf(buff, "%g", inf);2560 ASSERT_STREQ_LEN(written, buff, "inf");2561 2562 written = LIBC_NAMESPACE::sprintf(buff, "%G", -inf);2563 ASSERT_STREQ_LEN(written, buff, "-INF");2564 2565 written = LIBC_NAMESPACE::sprintf(buff, "%g", nan);2566 ASSERT_STREQ_LEN(written, buff, "nan");2567 2568 written = LIBC_NAMESPACE::sprintf(buff, "%G", -nan);2569 ASSERT_STREQ_LEN(written, buff, "-NAN");2570 2571 // Min Width Tests.2572 2573 written = LIBC_NAMESPACE::sprintf(buff, "%15g", 1.0);2574 ASSERT_STREQ_LEN(written, buff, " 1");2575 2576 written = LIBC_NAMESPACE::sprintf(buff, "%15g", -1.0);2577 ASSERT_STREQ_LEN(written, buff, " -1");2578 2579 written = LIBC_NAMESPACE::sprintf(buff, "%15g", 1.0e5);2580 ASSERT_STREQ_LEN(written, buff, " 100000");2581 2582 written = LIBC_NAMESPACE::sprintf(buff, "%15g", -1.0e5);2583 ASSERT_STREQ_LEN(written, buff, " -100000");2584 2585 written = LIBC_NAMESPACE::sprintf(buff, "%10g", 1.0e-5);2586 ASSERT_STREQ_LEN(written, buff, " 1e-05");2587 2588 // Precision Tests.2589 2590 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.23456789);2591 ASSERT_STREQ_LEN(written, buff, "1.2");2592 2593 // Trimming trailing zeroes causes the precision to be ignored here.2594 written = LIBC_NAMESPACE::sprintf(buff, "%.1g", 0.0);2595 ASSERT_STREQ_LEN(written, buff, "0");2596 2597 written = LIBC_NAMESPACE::sprintf(buff, "%.0g", 0.0);2598 ASSERT_STREQ_LEN(written, buff, "0");2599 2600 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 0.1);2601 ASSERT_STREQ_LEN(written, buff, "0.1");2602 2603 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.09);2604 ASSERT_STREQ_LEN(written, buff, "1.1");2605 2606 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.04);2607 ASSERT_STREQ_LEN(written, buff, "1");2608 2609 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.19);2610 ASSERT_STREQ_LEN(written, buff, "1.2");2611 2612 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.99);2613 ASSERT_STREQ_LEN(written, buff, "2");2614 2615 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 9.99);2616 ASSERT_STREQ_LEN(written, buff, "10");2617 2618 written = LIBC_NAMESPACE::sprintf(buff, "%.3g", 99.9);2619 ASSERT_STREQ_LEN(written, buff, "99.9");2620 2621 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 99.9);2622 ASSERT_STREQ_LEN(written, buff, "1e+02");2623 2624 written = LIBC_NAMESPACE::sprintf(buff, "%.1g", 99.9);2625 ASSERT_STREQ_LEN(written, buff, "1e+02");2626 2627 written = LIBC_NAMESPACE::sprintf(buff, "%.5g", 1.25);2628 ASSERT_STREQ_LEN(written, buff, "1.25");2629 2630 written = LIBC_NAMESPACE::sprintf(buff, "%.0g", 1.25);2631 ASSERT_STREQ_LEN(written, buff, "1");2632 2633 written = LIBC_NAMESPACE::sprintf(buff, "%.0g", 1.75);2634 ASSERT_STREQ_LEN(written, buff, "2");2635 2636 written = LIBC_NAMESPACE::sprintf(buff, "%.20g", 1.234e-10);2637 ASSERT_STREQ_LEN(written, buff, "1.2340000000000000814e-10");2638 2639 written = LIBC_NAMESPACE::sprintf(buff, "%.3g", -9.99);2640 ASSERT_STREQ_LEN(written, buff, "-9.99");2641 2642 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -9.99);2643 ASSERT_STREQ_LEN(written, buff, "-10");2644 2645 written = LIBC_NAMESPACE::sprintf(buff, "%.1g", -9.99);2646 ASSERT_STREQ_LEN(written, buff, "-1e+01");2647 2648 written = LIBC_NAMESPACE::sprintf(buff, "%.5g", 1.008);2649 ASSERT_STREQ_LEN(written, buff, "1.008");2650 2651 written = LIBC_NAMESPACE::sprintf(buff, "%.5g", 1.008e3);2652 ASSERT_STREQ_LEN(written, buff, "1008");2653 2654 written = LIBC_NAMESPACE::sprintf(buff, "%.4g", 9999.0);2655 ASSERT_STREQ_LEN(written, buff, "9999");2656 2657 written = LIBC_NAMESPACE::sprintf(buff, "%.3g", 9999.0);2658 ASSERT_STREQ_LEN(written, buff, "1e+04");2659 2660 written = LIBC_NAMESPACE::sprintf(buff, "%.3g", 1256.0);2661 ASSERT_STREQ_LEN(written, buff, "1.26e+03");2662 2663 // Found through large scale testing.2664 written = LIBC_NAMESPACE::sprintf(buff, "%.15g", 22.25);2665 ASSERT_STREQ_LEN(written, buff, "22.25");2666 2667 // These tests also focus on rounding, but only in how it relates to the base2668 // 10 exponent. The %g conversion selects between being a %f or %e conversion2669 // based on what the exponent would be if it was %e. If we call the precision2670 // P (equal to 6 if the precision is not set, 0 if the provided precision is2671 // 0, and provided precision - 1 otherwise) and the exponent X, then the style2672 // is %f with an effective precision of P - X + 1 if P > X >= -4, else the2673 // style is %e with effective precision P - 1. Additionally, it attempts to2674 // trim zeros that would be displayed after the decimal point.2675 written = LIBC_NAMESPACE::sprintf(buff, "%.1g", 9.059E+200);2676 ASSERT_STREQ_LEN(written, buff, "9e+200");2677 2678 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 9.059E+200);2679 ASSERT_STREQ_LEN(written, buff, "9.1e+200");2680 2681 // For this test, P = 0 and X = 1, so P > X >= -4 is false, giving a %e style.2682 written = LIBC_NAMESPACE::sprintf(buff, "%.0g", 9.5);2683 ASSERT_STREQ_LEN(written, buff, "1e+01");2684 2685 // Subnormal Precision Tests2686#ifndef LIBC_COPT_FLOAT_TO_STR_REDUCED_PRECISION2687 written = LIBC_NAMESPACE::sprintf(buff, "%.310g", 0x1.0p-1022);2688 ASSERT_STREQ_LEN(2689 written, buff,2690 "2."2691 "225073858507201383090232717332404064219215980462331830553327416887204434"2692 "813918195854283159012511020564067339731035811005152434161553460108856012"2693 "385377718821130777993532002330479610147442583636071921565046942503734208"2694 "375250806650616658158948720491179968591639648500635908770118304874799780"2695 "887753749949451580452e-308");2696#endif2697 2698 written = LIBC_NAMESPACE::sprintf(buff, "%.30g", 0x1.0p-1022);2699 ASSERT_STREQ_LEN(written, buff, "2.22507385850720138309023271733e-308");2700 2701#ifndef LIBC_COPT_FLOAT_TO_STR_REDUCED_PRECISION2702 written = LIBC_NAMESPACE::sprintf(buff, "%.310g", 0x1.0p-1023);2703 ASSERT_STREQ_LEN(2704 written, buff,2705 "1."2706 "112536929253600691545116358666202032109607990231165915276663708443602217"2707 "406959097927141579506255510282033669865517905502576217080776730054428006"2708 "192688859410565388996766001165239805073721291818035960782523471251867104"2709 "187625403325308329079474360245589984295819824250317954385059152437399890"2710 "443876874974725790226e-308");2711#endif2712 2713 written = LIBC_NAMESPACE::sprintf(buff, "%.7g", 9.99999e-310);2714 ASSERT_STREQ_LEN(written, buff, "9.99999e-310");2715 2716 written = LIBC_NAMESPACE::sprintf(buff, "%.6g", 9.99999e-310);2717 ASSERT_STREQ_LEN(written, buff, "9.99999e-310");2718 2719 written = LIBC_NAMESPACE::sprintf(buff, "%.5g", 9.99999e-310);2720 ASSERT_STREQ_LEN(written, buff, "1e-309");2721 2722 written = LIBC_NAMESPACE::sprintf(buff, "%.4g", 9.99999e-310);2723 ASSERT_STREQ_LEN(written, buff, "1e-309");2724 2725 written = LIBC_NAMESPACE::sprintf(buff, "%.3g", 9.99999e-310);2726 ASSERT_STREQ_LEN(written, buff, "1e-309");2727 2728 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 9.99999e-310);2729 ASSERT_STREQ_LEN(written, buff, "1e-309");2730 2731 written = LIBC_NAMESPACE::sprintf(buff, "%.1g", 9.99999e-310);2732 ASSERT_STREQ_LEN(written, buff, "1e-309");2733 2734 written = LIBC_NAMESPACE::sprintf(buff, "%.0g", 9.99999e-310);2735 ASSERT_STREQ_LEN(written, buff, "1e-309");2736 2737 written = LIBC_NAMESPACE::sprintf(buff, "%.10g", 0x1.0p-1074);2738 ASSERT_STREQ_LEN(written, buff, "4.940656458e-324");2739 2740 // Rounding Mode Tests.2741 2742 if (ForceRoundingMode r(RoundingMode::Nearest); r.success) {2743 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.75);2744 ASSERT_STREQ_LEN(written, buff, "1.8");2745 2746 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.25);2747 ASSERT_STREQ_LEN(written, buff, "1.2");2748 2749 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.125);2750 ASSERT_STREQ_LEN(written, buff, "1.1");2751 2752 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.625);2753 ASSERT_STREQ_LEN(written, buff, "1.6");2754 2755 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.375);2756 ASSERT_STREQ_LEN(written, buff, "1.4");2757 2758 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.875);2759 ASSERT_STREQ_LEN(written, buff, "1.9");2760 2761 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -1.75);2762 ASSERT_STREQ_LEN(written, buff, "-1.8");2763 2764 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -1.25);2765 ASSERT_STREQ_LEN(written, buff, "-1.2");2766 2767 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -1.125);2768 ASSERT_STREQ_LEN(written, buff, "-1.1");2769 2770 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -1.625);2771 ASSERT_STREQ_LEN(written, buff, "-1.6");2772 2773 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -1.375);2774 ASSERT_STREQ_LEN(written, buff, "-1.4");2775 2776 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -1.875);2777 ASSERT_STREQ_LEN(written, buff, "-1.9");2778 }2779 2780 if (ForceRoundingMode r(RoundingMode::Upward); r.success) {2781 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.75);2782 ASSERT_STREQ_LEN(written, buff, "1.8");2783 2784 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.25);2785 ASSERT_STREQ_LEN(written, buff, "1.3");2786 2787 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.125);2788 ASSERT_STREQ_LEN(written, buff, "1.2");2789 2790 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.625);2791 ASSERT_STREQ_LEN(written, buff, "1.7");2792 2793 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.375);2794 ASSERT_STREQ_LEN(written, buff, "1.4");2795 2796 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.875);2797 ASSERT_STREQ_LEN(written, buff, "1.9");2798 2799 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -1.75);2800 ASSERT_STREQ_LEN(written, buff, "-1.7");2801 2802 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -1.25);2803 ASSERT_STREQ_LEN(written, buff, "-1.2");2804 2805 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -1.125);2806 ASSERT_STREQ_LEN(written, buff, "-1.1");2807 2808 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -1.625);2809 ASSERT_STREQ_LEN(written, buff, "-1.6");2810 2811 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -1.375);2812 ASSERT_STREQ_LEN(written, buff, "-1.3");2813 2814 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -1.875);2815 ASSERT_STREQ_LEN(written, buff, "-1.8");2816 }2817 2818 if (ForceRoundingMode r(RoundingMode::Downward); r.success) {2819 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.75);2820 ASSERT_STREQ_LEN(written, buff, "1.7");2821 2822 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.25);2823 ASSERT_STREQ_LEN(written, buff, "1.2");2824 2825 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.125);2826 ASSERT_STREQ_LEN(written, buff, "1.1");2827 2828 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.625);2829 ASSERT_STREQ_LEN(written, buff, "1.6");2830 2831 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.375);2832 ASSERT_STREQ_LEN(written, buff, "1.3");2833 2834 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.875);2835 ASSERT_STREQ_LEN(written, buff, "1.8");2836 2837 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -1.75);2838 ASSERT_STREQ_LEN(written, buff, "-1.8");2839 2840 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -1.25);2841 ASSERT_STREQ_LEN(written, buff, "-1.3");2842 2843 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -1.125);2844 ASSERT_STREQ_LEN(written, buff, "-1.2");2845 2846 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -1.625);2847 ASSERT_STREQ_LEN(written, buff, "-1.7");2848 2849 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -1.375);2850 ASSERT_STREQ_LEN(written, buff, "-1.4");2851 2852 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -1.875);2853 ASSERT_STREQ_LEN(written, buff, "-1.9");2854 }2855 2856 if (ForceRoundingMode r(RoundingMode::TowardZero); r.success) {2857 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.75);2858 ASSERT_STREQ_LEN(written, buff, "1.7");2859 2860 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.25);2861 ASSERT_STREQ_LEN(written, buff, "1.2");2862 2863 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.125);2864 ASSERT_STREQ_LEN(written, buff, "1.1");2865 2866 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.625);2867 ASSERT_STREQ_LEN(written, buff, "1.6");2868 2869 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.375);2870 ASSERT_STREQ_LEN(written, buff, "1.3");2871 2872 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.875);2873 ASSERT_STREQ_LEN(written, buff, "1.8");2874 2875 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -1.75);2876 ASSERT_STREQ_LEN(written, buff, "-1.7");2877 2878 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -1.25);2879 ASSERT_STREQ_LEN(written, buff, "-1.2");2880 2881 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -1.125);2882 ASSERT_STREQ_LEN(written, buff, "-1.1");2883 2884 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -1.625);2885 ASSERT_STREQ_LEN(written, buff, "-1.6");2886 2887 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -1.375);2888 ASSERT_STREQ_LEN(written, buff, "-1.3");2889 2890 written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -1.875);2891 ASSERT_STREQ_LEN(written, buff, "-1.8");2892 }2893 2894 // Flag Tests.2895 written = LIBC_NAMESPACE::sprintf(buff, "%+g", 1.0);2896 ASSERT_STREQ_LEN(written, buff, "+1");2897 2898 written = LIBC_NAMESPACE::sprintf(buff, "%+g", -1.0);2899 ASSERT_STREQ_LEN(written, buff, "-1");2900 2901 written = LIBC_NAMESPACE::sprintf(buff, "% g", 1.0);2902 ASSERT_STREQ_LEN(written, buff, " 1");2903 2904 written = LIBC_NAMESPACE::sprintf(buff, "% g", -1.0);2905 ASSERT_STREQ_LEN(written, buff, "-1");2906 2907 written = LIBC_NAMESPACE::sprintf(buff, "%-15g", 1.5);2908 ASSERT_STREQ_LEN(written, buff, "1.5 ");2909 2910 written = LIBC_NAMESPACE::sprintf(buff, "%#.g", 1.0);2911 ASSERT_STREQ_LEN(written, buff, "1.");2912 2913 written = LIBC_NAMESPACE::sprintf(buff, "%#g", 1.0);2914 ASSERT_STREQ_LEN(written, buff, "1.00000");2915 2916 written = LIBC_NAMESPACE::sprintf(buff, "%#.0g", 1.5);2917 ASSERT_STREQ_LEN(written, buff, "2.");2918 2919 written = LIBC_NAMESPACE::sprintf(buff, "%015g", 1.5);2920 ASSERT_STREQ_LEN(written, buff, "0000000000001.5");2921 2922 written = LIBC_NAMESPACE::sprintf(buff, "%015g", -1.5);2923 ASSERT_STREQ_LEN(written, buff, "-000000000001.5");2924 2925 written = LIBC_NAMESPACE::sprintf(buff, "%+- #0g", 0.0);2926 ASSERT_STREQ_LEN(written, buff, "+0.00000");2927 2928 // Combined Tests.2929 2930 written = LIBC_NAMESPACE::sprintf(buff, "%10.3g", 9.99);2931 ASSERT_STREQ_LEN(written, buff, " 9.99");2932 2933 written = LIBC_NAMESPACE::sprintf(buff, "%10.2g", 9.99);2934 ASSERT_STREQ_LEN(written, buff, " 10");2935 2936 written = LIBC_NAMESPACE::sprintf(buff, "%10.1g", 9.99);2937 ASSERT_STREQ_LEN(written, buff, " 1e+01");2938 2939 written = LIBC_NAMESPACE::sprintf(buff, "%-10.3g", 9.99);2940 ASSERT_STREQ_LEN(written, buff, "9.99 ");2941 2942 written = LIBC_NAMESPACE::sprintf(buff, "%-10.2g", 9.99);2943 ASSERT_STREQ_LEN(written, buff, "10 ");2944 2945 written = LIBC_NAMESPACE::sprintf(buff, "%-10.1g", 9.99);2946 ASSERT_STREQ_LEN(written, buff, "1e+01 ");2947 2948 written = LIBC_NAMESPACE::sprintf(buff, "%-10.1g", 1.0e-50);2949 ASSERT_STREQ_LEN(written, buff, "1e-50 ");2950 2951 written = LIBC_NAMESPACE::sprintf(buff, "%30g", 1234567890123456789.0);2952 ASSERT_STREQ_LEN(written, buff, " 1.23457e+18");2953 2954 written = LIBC_NAMESPACE::sprintf(buff, "%-30g", 1234567890123456789.0);2955 ASSERT_STREQ_LEN(written, buff, "1.23457e+18 ");2956 2957 written = LIBC_NAMESPACE::sprintf(buff, "%25.15g", 9999999999999.99);2958 ASSERT_STREQ_LEN(written, buff, " 9999999999999.99");2959 2960 written = LIBC_NAMESPACE::sprintf(buff, "%25.14g", 9999999999999.99);2961 ASSERT_STREQ_LEN(written, buff, " 10000000000000");2962 2963 written = LIBC_NAMESPACE::sprintf(buff, "%25.13g", 9999999999999.99);2964 ASSERT_STREQ_LEN(written, buff, " 1e+13");2965 2966 written = LIBC_NAMESPACE::sprintf(buff, "%#12.3g %-12.3g", 0.1, 256.0);2967 ASSERT_STREQ_LEN(written, buff, " 0.100 256 ");2968 2969 written = LIBC_NAMESPACE::sprintf(buff, "%+-#12.3g % 012.3g", 0.1256, 1256.0);2970 ASSERT_STREQ_LEN(written, buff, "+0.126 0001.26e+03");2971}2972 2973TEST(LlvmLibcSPrintfTest, FloatAutoLongDoubleConv) {2974 char buff[1000];2975 int written;2976 2977 ForceRoundingMode r(RoundingMode::Nearest);2978 2979 // Length Modifier Tests.2980 2981// TODO: Tests for other long double types2982#if defined(LIBC_TYPES_LONG_DOUBLE_IS_X86_FLOAT80)2983 2984 written = LIBC_NAMESPACE::sprintf(buff, "%Lg", 0xf.fffffffffffffffp+16380L);2985 ASSERT_STREQ_LEN(written, buff, "1.18973e+4932");2986 2987 // Minimum normal2988 written = LIBC_NAMESPACE::sprintf(buff, "%Lg", 3.36210314311209350626E-4932L);2989 ASSERT_STREQ_LEN(written, buff, "3.3621e-4932");2990 2991 written = LIBC_NAMESPACE::sprintf(buff, "%Lg", 0xa.aaaaaaaaaaaaaabp-7L);2992 ASSERT_STREQ_LEN(written, buff, "0.0833333");2993 2994#ifndef LIBC_COPT_FLOAT_TO_STR_REDUCED_PRECISION2995 written = LIBC_NAMESPACE::sprintf(buff, "%.60Lg", 0xa.aaaaaaaaaaaaaabp-7L);2996 ASSERT_STREQ_LEN(2997 written, buff,2998 "0.0833333333333333333355920878593448009041821933351457118988037");2999#endif3000 3001#endif // LIBC_TYPES_LONG_DOUBLE_IS_X86_FLOAT803002 3003 written = LIBC_NAMESPACE::sprintf(buff, "%Lg", 9.99999999999e-100L);3004 ASSERT_STREQ_LEN(written, buff, "1e-99");3005 3006 written = LIBC_NAMESPACE::sprintf(buff, "%Lg", 1e100L);3007 ASSERT_STREQ_LEN(written, buff, "1e+100");3008 3009 written = LIBC_NAMESPACE::sprintf(buff, "%Lg", 1.0L);3010 ASSERT_STREQ_LEN(written, buff, "1");3011 3012 written = LIBC_NAMESPACE::sprintf(buff, "%Lg", 0.1L);3013 ASSERT_STREQ_LEN(written, buff, "0.1");3014 3015 char big_buff[10000];3016 written = LIBC_NAMESPACE::sprintf(big_buff, "%Lg", 1e1000L);3017 ASSERT_STREQ_LEN(written, big_buff, "1e+1000");3018 3019 written = LIBC_NAMESPACE::sprintf(big_buff, "%Lg", 1e4900L);3020 ASSERT_STREQ_LEN(written, big_buff, "1e+4900");3021}3022 3023#endif // LIBC_COPT_PRINTF_DISABLE_FLOAT3024 3025#if defined(LIBC_COMPILER_HAS_FIXED_POINT) && \3026 !defined(LIBC_COPT_PRINTF_DISABLE_FIXED_POINT)3027TEST(LlvmLibcSPrintfTest, FixedConv) {3028 char buff[1000];3029 int written;3030 3031 // These numeric tests are potentially a little weak, but the fuzz test is3032 // more thorough than my handwritten tests tend to be.3033 3034 // TODO: Replace hex literals with their appropriate fixed point literals.3035 3036 written = LIBC_NAMESPACE::sprintf(buff, "%k", 0x0); // 0.03037 ASSERT_STREQ_LEN(written, buff, "0.000000");3038 3039 written = LIBC_NAMESPACE::sprintf(buff, "%k", 0x80000000); // -0.03040 ASSERT_STREQ_LEN(written, buff, "-0.000000");3041 3042 written = LIBC_NAMESPACE::sprintf(buff, "%r", 0xffff); // -fract max3043 ASSERT_STREQ_LEN(written, buff, "-0.999969");3044 3045 written = LIBC_NAMESPACE::sprintf(buff, "%R", 0xffff); // unsigned fract max3046 ASSERT_STREQ_LEN(written, buff, "0.999985");3047 3048 written = LIBC_NAMESPACE::sprintf(buff, "%k", 0xffffffff); // -accum max3049 ASSERT_STREQ_LEN(written, buff, "-65535.999969");3050 3051 written =3052 LIBC_NAMESPACE::sprintf(buff, "%K", 0xffffffff); // unsigned accum max3053 ASSERT_STREQ_LEN(written, buff, "65535.999985");3054 3055 written = LIBC_NAMESPACE::sprintf(buff, "%r", 0x7fff); // fract max3056 ASSERT_STREQ_LEN(written, buff, "0.999969");3057 3058 written = LIBC_NAMESPACE::sprintf(buff, "%k", 0x7fffffff); // accum max3059 ASSERT_STREQ_LEN(written, buff, "65535.999969");3060 3061 // Length Modifier Tests.3062 3063 written = LIBC_NAMESPACE::sprintf(buff, "%hk", 0x0); // 0.03064 ASSERT_STREQ_LEN(written, buff, "0.000000");3065 3066 written = LIBC_NAMESPACE::sprintf(buff, "%hk", 0xffff); // -short accum max3067 ASSERT_STREQ_LEN(written, buff, "-255.992188");3068 3069 written = LIBC_NAMESPACE::sprintf(buff, "%hr", 0x0); // 0.03070 ASSERT_STREQ_LEN(written, buff, "0.000000");3071 3072 written = LIBC_NAMESPACE::sprintf(buff, "%hr", 0xff); // -short fract max3073 ASSERT_STREQ_LEN(written, buff, "-0.992188");3074 3075 written = LIBC_NAMESPACE::sprintf(buff, "%hK", 0x0); // 0.03076 ASSERT_STREQ_LEN(written, buff, "0.000000");3077 3078 written =3079 LIBC_NAMESPACE::sprintf(buff, "%hK", 0xffff); // unsigned short accum max3080 ASSERT_STREQ_LEN(written, buff, "255.996094");3081 3082 written = LIBC_NAMESPACE::sprintf(buff, "%hR", 0x0); // 0.03083 ASSERT_STREQ_LEN(written, buff, "0.000000");3084 3085 written =3086 LIBC_NAMESPACE::sprintf(buff, "%hR", 0xff); // unsigned short fract max3087 ASSERT_STREQ_LEN(written, buff, "0.996094");3088 3089 written = LIBC_NAMESPACE::sprintf(buff, "%lk", 0x0ll); // 0.03090 ASSERT_STREQ_LEN(written, buff, "0.000000");3091 3092 written = LIBC_NAMESPACE::sprintf(buff, "%lk",3093 0xffffffffffffffff); //-long accum max3094 ASSERT_STREQ_LEN(written, buff, "-4294967296.000000");3095 3096 written = LIBC_NAMESPACE::sprintf(buff, "%lr", 0x0); // 0.03097 ASSERT_STREQ_LEN(written, buff, "0.000000");3098 3099 written = LIBC_NAMESPACE::sprintf(buff, "%lr",3100 0xffffffff); //-long fract max3101 ASSERT_STREQ_LEN(written, buff, "-1.000000");3102 3103 written = LIBC_NAMESPACE::sprintf(buff, "%lK", 0x0ll); // 0.03104 ASSERT_STREQ_LEN(written, buff, "0.000000");3105 3106 written =3107 LIBC_NAMESPACE::sprintf(buff, "%lK",3108 0xffffffffffffffff); // unsigned long accum max3109 ASSERT_STREQ_LEN(written, buff, "4294967296.000000");3110 3111 written = LIBC_NAMESPACE::sprintf(buff, "%lR", 0x0); // 0.03112 ASSERT_STREQ_LEN(written, buff, "0.000000");3113 3114 written = LIBC_NAMESPACE::sprintf(buff, "%lR",3115 0xffffffff); // unsigned long fract max3116 ASSERT_STREQ_LEN(written, buff, "1.000000");3117 3118 // Min Width Tests.3119 3120 written = LIBC_NAMESPACE::sprintf(buff, "%10k", 0x0000a000); // 1.253121 ASSERT_STREQ_LEN(written, buff, " 1.250000");3122 3123 written = LIBC_NAMESPACE::sprintf(buff, "%10k", 0x8000a000); //-1.253124 ASSERT_STREQ_LEN(written, buff, " -1.250000");3125 3126 written = LIBC_NAMESPACE::sprintf(buff, "%8k", 0x0000a000); // 1.253127 ASSERT_STREQ_LEN(written, buff, "1.250000");3128 3129 written = LIBC_NAMESPACE::sprintf(buff, "%9k", 0x8000a000); //-1.253130 ASSERT_STREQ_LEN(written, buff, "-1.250000");3131 3132 written = LIBC_NAMESPACE::sprintf(buff, "%4k", 0x0000a000); // 1.253133 ASSERT_STREQ_LEN(written, buff, "1.250000");3134 3135 written = LIBC_NAMESPACE::sprintf(buff, "%4k", 0x8000a000); //-1.253136 ASSERT_STREQ_LEN(written, buff, "-1.250000");3137 3138 // Precision Tests.3139 3140 written =3141 LIBC_NAMESPACE::sprintf(buff, "%.16K", 0xFFFFFFFF); // unsigned accum max3142 ASSERT_STREQ_LEN(written, buff, "65535.9999847412109375");3143 3144 written = LIBC_NAMESPACE::sprintf(3145 buff, "%.32lK", 0xFFFFFFFFFFFFFFFF); // unsigned long accum max3146 ASSERT_STREQ_LEN(written, buff,3147 "4294967295.99999999976716935634613037109375");3148 3149 written =3150 LIBC_NAMESPACE::sprintf(buff, "%.0K", 0xFFFFFFFF); // unsigned accum max3151 ASSERT_STREQ_LEN(written, buff, "65536");3152 3153 written = LIBC_NAMESPACE::sprintf(buff, "%.0R", 0xFFFF); // unsigned fract max3154 ASSERT_STREQ_LEN(written, buff, "1");3155 3156 // Flag Tests.3157 3158 written = LIBC_NAMESPACE::sprintf(buff, "%+k", 0x0000a000); // 1.253159 ASSERT_STREQ_LEN(written, buff, "+1.250000");3160 3161 written = LIBC_NAMESPACE::sprintf(buff, "%+k", 0x8000a000); //-1.253162 ASSERT_STREQ_LEN(written, buff, "-1.250000");3163 3164 written = LIBC_NAMESPACE::sprintf(buff, "% k", 0x0000a000); // 1.253165 ASSERT_STREQ_LEN(written, buff, " 1.250000");3166 3167 written = LIBC_NAMESPACE::sprintf(buff, "% k", 0x8000a000); //-1.253168 ASSERT_STREQ_LEN(written, buff, "-1.250000");3169 3170 // unsigned variants ignore sign flags.3171 written = LIBC_NAMESPACE::sprintf(buff, "%+K", 0x00014000); // 1.253172 ASSERT_STREQ_LEN(written, buff, "1.250000");3173 3174 written = LIBC_NAMESPACE::sprintf(buff, "% K", 0x00014000); // 1.253175 ASSERT_STREQ_LEN(written, buff, "1.250000");3176 3177 written = LIBC_NAMESPACE::sprintf(buff, "%-10k", 0x0000c000); // 1.53178 ASSERT_STREQ_LEN(written, buff, "1.500000 ");3179 3180 written = LIBC_NAMESPACE::sprintf(buff, "%#.k", 0x00008000); // 1.03181 ASSERT_STREQ_LEN(written, buff, "1.");3182 3183 written = LIBC_NAMESPACE::sprintf(buff, "%#.0k", 0x0000c000); // 1.53184 ASSERT_STREQ_LEN(written, buff, "2.");3185 3186 written = LIBC_NAMESPACE::sprintf(buff, "%010k", 0x0000c000); // 1.53187 ASSERT_STREQ_LEN(written, buff, "001.500000");3188 3189 written = LIBC_NAMESPACE::sprintf(buff, "%010k", 0x8000c000); //-1.53190 ASSERT_STREQ_LEN(written, buff, "-01.500000");3191 3192 written = LIBC_NAMESPACE::sprintf(buff, "%+- #0k", 0); // 0.03193 ASSERT_STREQ_LEN(written, buff, "+0.000000");3194 3195 // Combined Tests.3196 3197 written = LIBC_NAMESPACE::sprintf(buff, "%10.2k", 0x0004feb8); // 9.993198 ASSERT_STREQ_LEN(written, buff, " 9.99");3199 3200 written = LIBC_NAMESPACE::sprintf(buff, "%5.1k", 0x0004feb8); // 9.993201 ASSERT_STREQ_LEN(written, buff, " 10.0");3202 3203 written = LIBC_NAMESPACE::sprintf(buff, "%-10.2k", 0x0004feb8); // 9.993204 ASSERT_STREQ_LEN(written, buff, "9.99 ");3205 3206 written = LIBC_NAMESPACE::sprintf(buff, "%-5.1k", 0x0004feb8); // 9.993207 ASSERT_STREQ_LEN(written, buff, "10.0 ");3208 3209 written = LIBC_NAMESPACE::sprintf(buff, "%-5.1k", 0x00000001); // accum min3210 ASSERT_STREQ_LEN(written, buff, "0.0 ");3211 3212 written = LIBC_NAMESPACE::sprintf(buff, "%30k", 0x7fffffff); // accum max3213 ASSERT_STREQ_LEN(written, buff, " 65535.999969");3214 3215 written = LIBC_NAMESPACE::sprintf(buff, "%-30k", 0x7fffffff); // accum max3216 ASSERT_STREQ_LEN(written, buff, "65535.999969 ");3217 3218 written = LIBC_NAMESPACE::sprintf(buff, "%20.2lK",3219 0x3b9ac9ffFD70A3D7); // 999999999.993220 ASSERT_STREQ_LEN(written, buff, " 999999999.99");3221 3222 written = LIBC_NAMESPACE::sprintf(buff, "%20.1lK",3223 0x3b9ac9ffFD70A3D7); // 999999999.993224 ASSERT_STREQ_LEN(written, buff, " 1000000000.0");3225 3226 written = LIBC_NAMESPACE::sprintf(buff, "%12.3R %-12.3k", 0x1999,3227 0x00800000); // 0.1, 256.03228 ASSERT_STREQ_LEN(written, buff, " 0.100 256.000 ");3229 3230 written =3231 LIBC_NAMESPACE::sprintf(buff, "%+-#12.3lk % 012.3k", 0x000000001013a92all,3232 0x02740000); // 0.126, 1256.03233 ASSERT_STREQ_LEN(written, buff, "+0.126 0001256.000");3234}3235#endif // defined(LIBC_COMPILER_HAS_FIXED_POINT) &&3236 // !defined(LIBC_COPT_PRINTF_DISABLE_FIXED_POINT)3237 3238#ifndef LIBC_COPT_PRINTF_DISABLE_STRERROR3239TEST(LlvmLibcSPrintfTest, StrerrorConv) {3240 char buff[1000];3241 int written;3242 3243 libc_errno = 0;3244 written = LIBC_NAMESPACE::sprintf(buff, "%m");3245 ASSERT_STREQ_LEN(written, buff, "Success");3246 3247 libc_errno = ERANGE;3248 written = LIBC_NAMESPACE::sprintf(buff, "%m");3249 ASSERT_STREQ_LEN(written, buff, "Numerical result out of range");3250 3251 // Check that it correctly consumes no arguments.3252 libc_errno = 0;3253 written = LIBC_NAMESPACE::sprintf(buff, "%m %d", 1);3254 ASSERT_STREQ_LEN(written, buff, "Success 1");3255 3256 // Width Tests3257 3258 libc_errno = 0;3259 written = LIBC_NAMESPACE::sprintf(buff, "%10m");3260 ASSERT_STREQ_LEN(written, buff, " Success");3261 3262 libc_errno = ERANGE;3263 written = LIBC_NAMESPACE::sprintf(buff, "%10m");3264 ASSERT_STREQ_LEN(written, buff, "Numerical result out of range");3265 3266 // Precision Tests3267 3268 libc_errno = 0;3269 written = LIBC_NAMESPACE::sprintf(buff, "%.10m");3270 ASSERT_STREQ_LEN(written, buff, "Success");3271 3272 libc_errno = ERANGE;3273 written = LIBC_NAMESPACE::sprintf(buff, "%.10m");3274 ASSERT_STREQ_LEN(written, buff, "Numerical ");3275 3276 // Flag Tests (Only '-' since the others only affect ints)3277 3278 libc_errno = 0;3279 written = LIBC_NAMESPACE::sprintf(buff, "%-10m");3280 ASSERT_STREQ_LEN(written, buff, "Success ");3281 3282 libc_errno = ERANGE;3283 written = LIBC_NAMESPACE::sprintf(buff, "%-10m");3284 ASSERT_STREQ_LEN(written, buff, "Numerical result out of range");3285 3286 // Alt Mode Tests3287 // Since alt mode here is effectively a completely separate conversion, it3288 // gets separate tests.3289 3290 libc_errno = 0;3291 written = LIBC_NAMESPACE::sprintf(buff, "%#m");3292 ASSERT_STREQ_LEN(written, buff, "0");3293 3294 libc_errno = ERANGE;3295 written = LIBC_NAMESPACE::sprintf(buff, "%#m");3296 ASSERT_STREQ_LEN(written, buff, "ERANGE");3297 3298 libc_errno = -9999;3299 written = LIBC_NAMESPACE::sprintf(buff, "%#m");3300 ASSERT_STREQ_LEN(written, buff, "-9999");3301 3302 // Alt Mode Width3303 3304 libc_errno = 0;3305 written = LIBC_NAMESPACE::sprintf(buff, "%#10m");3306 ASSERT_STREQ_LEN(written, buff, " 0");3307 3308 libc_errno = ERANGE;3309 written = LIBC_NAMESPACE::sprintf(buff, "%#10m");3310 ASSERT_STREQ_LEN(written, buff, " ERANGE");3311 3312 libc_errno = -9999;3313 written = LIBC_NAMESPACE::sprintf(buff, "%#10m");3314 ASSERT_STREQ_LEN(written, buff, " -9999");3315 3316 libc_errno = ERANGE;3317 written = LIBC_NAMESPACE::sprintf(buff, "%#3m");3318 ASSERT_STREQ_LEN(written, buff, "ERANGE");3319 3320 libc_errno = -9999;3321 written = LIBC_NAMESPACE::sprintf(buff, "%#3m");3322 ASSERT_STREQ_LEN(written, buff, "-9999");3323 3324 // Alt Mode Precision3325 3326 libc_errno = ERANGE;3327 written = LIBC_NAMESPACE::sprintf(buff, "%#.10m");3328 ASSERT_STREQ_LEN(written, buff, "ERANGE");3329 3330 libc_errno = -9999;3331 written = LIBC_NAMESPACE::sprintf(buff, "%#.10m");3332 ASSERT_STREQ_LEN(written, buff, "-0000009999");3333 3334 libc_errno = ERANGE;3335 written = LIBC_NAMESPACE::sprintf(buff, "%#.3m");3336 ASSERT_STREQ_LEN(written, buff, "ERA");3337 3338 libc_errno = -9999;3339 written = LIBC_NAMESPACE::sprintf(buff, "%#.3m");3340 ASSERT_STREQ_LEN(written, buff, "-9999");3341 3342 // We don't test precision (or int flags) on errno = 0 because it behaves3343 // weirdly, see the docs for more information.3344 libc_errno = 0;3345 written = LIBC_NAMESPACE::sprintf(buff, "%#.1m");3346 ASSERT_STREQ_LEN(written, buff, "0");3347 3348 // Alt Mode Flags3349 3350 // '-' flag3351 libc_errno = 0;3352 written = LIBC_NAMESPACE::sprintf(buff, "%#-10m");3353 ASSERT_STREQ_LEN(written, buff, "0 ");3354 3355 libc_errno = ERANGE;3356 written = LIBC_NAMESPACE::sprintf(buff, "%#-10m");3357 ASSERT_STREQ_LEN(written, buff, "ERANGE ");3358 3359 libc_errno = -9999;3360 written = LIBC_NAMESPACE::sprintf(buff, "%#-10m");3361 ASSERT_STREQ_LEN(written, buff, "-9999 ");3362 3363 libc_errno = ERANGE;3364 written = LIBC_NAMESPACE::sprintf(buff, "%#-3m");3365 ASSERT_STREQ_LEN(written, buff, "ERANGE");3366 3367 libc_errno = -9999;3368 written = LIBC_NAMESPACE::sprintf(buff, "%#-3m");3369 ASSERT_STREQ_LEN(written, buff, "-9999");3370 3371 // '+' flag3372 libc_errno = ERANGE;3373 written = LIBC_NAMESPACE::sprintf(buff, "%#+m");3374 ASSERT_STREQ_LEN(written, buff, "ERANGE");3375 3376 libc_errno = -9999;3377 written = LIBC_NAMESPACE::sprintf(buff, "%#+m");3378 ASSERT_STREQ_LEN(written, buff, "-9999");3379 3380 // Technically 9999 could be a valid error, since the standard just says errno3381 // macros are "distinct positive values". In practice I don't expect this to3382 // come up, but I've avoided it for the other %m tests for ease of3383 // refactoring if necessary. Here it needs to be positive to test that the3384 // flags that only affect positive signed integers are properly passed along.3385 libc_errno = 9999;3386 written = LIBC_NAMESPACE::sprintf(buff, "%#+m");3387 ASSERT_STREQ_LEN(written, buff, "+9999");3388 3389 // ' ' flag3390 libc_errno = ERANGE;3391 written = LIBC_NAMESPACE::sprintf(buff, "%# m");3392 ASSERT_STREQ_LEN(written, buff, "ERANGE");3393 3394 libc_errno = -9999;3395 written = LIBC_NAMESPACE::sprintf(buff, "%# m");3396 ASSERT_STREQ_LEN(written, buff, "-9999");3397 3398 libc_errno = 9999;3399 written = LIBC_NAMESPACE::sprintf(buff, "%# m");3400 ASSERT_STREQ_LEN(written, buff, " 9999");3401 3402 // '0' flag3403 3404 libc_errno = ERANGE;3405 written = LIBC_NAMESPACE::sprintf(buff, "%#010m");3406 ASSERT_STREQ_LEN(written, buff, " ERANGE");3407 3408 libc_errno = -9999;3409 written = LIBC_NAMESPACE::sprintf(buff, "%#010m");3410 ASSERT_STREQ_LEN(written, buff, "-000009999");3411 3412 libc_errno = ERANGE;3413 written = LIBC_NAMESPACE::sprintf(buff, "%#03m");3414 ASSERT_STREQ_LEN(written, buff, "ERANGE");3415 3416 libc_errno = -9999;3417 written = LIBC_NAMESPACE::sprintf(buff, "%#03m");3418 ASSERT_STREQ_LEN(written, buff, "-9999");3419}3420#endif // LIBC_COPT_PRINTF_DISABLE_STRERROR3421 3422#ifndef LIBC_COPT_PRINTF_DISABLE_WRITE_INT3423TEST(LlvmLibcSPrintfTest, WriteIntConv) {3424 char buff[64];3425 int written;3426 int test_val = -1;3427 3428 test_val = -1;3429 written = LIBC_NAMESPACE::sprintf(buff, "12345%n67890", &test_val);3430 EXPECT_EQ(test_val, 5);3431 ASSERT_STREQ_LEN(written, buff, "1234567890");3432 3433 test_val = -1;3434 written = LIBC_NAMESPACE::sprintf(buff, "%n", &test_val);3435 EXPECT_EQ(test_val, 0);3436 ASSERT_STREQ_LEN(written, buff, "");3437 3438 test_val = 0x100;3439 written = LIBC_NAMESPACE::sprintf(buff, "ABC%hhnDEF", &test_val);3440 EXPECT_EQ(test_val, 0x103);3441 ASSERT_STREQ_LEN(written, buff, "ABCDEF");3442 3443 test_val = -1;3444 written = LIBC_NAMESPACE::sprintf(buff, "%s%n", "87654321", &test_val);3445 EXPECT_EQ(test_val, 8);3446 ASSERT_STREQ_LEN(written, buff, "87654321");3447 3448#ifndef LIBC_COPT_PRINTF_NO_NULLPTR_CHECKS3449 written = LIBC_NAMESPACE::sprintf(buff, "abc123%n", nullptr);3450 EXPECT_LT(written, 0);3451#endif // LIBC_COPT_PRINTF_NO_NULLPTR_CHECKS3452}3453#endif // LIBC_COPT_PRINTF_DISABLE_WRITE_INT3454 3455#ifndef LIBC_COPT_PRINTF_DISABLE_INDEX_MODE3456TEST(LlvmLibcSPrintfTest, IndexModeParsing) {3457 char buff[64];3458 int written;3459 3460 written = LIBC_NAMESPACE::sprintf(buff, "%1$s", "abcDEF123");3461 ASSERT_STREQ_LEN(written, buff, "abcDEF123");3462 3463 written = LIBC_NAMESPACE::sprintf(buff, "%1$s %%", "abcDEF123");3464 ASSERT_STREQ_LEN(written, buff, "abcDEF123 %");3465 3466 written =3467 LIBC_NAMESPACE::sprintf(buff, "%3$s %1$s %2$s", "is", "hard", "ordering");3468 ASSERT_STREQ_LEN(written, buff, "ordering is hard");3469 3470 written = LIBC_NAMESPACE::sprintf(3471 buff, "%10$s %9$s %8$c %7$s %6$s, %6$s %5$s %4$-*1$s %3$.*11$s %2$s. %%",3472 6, "pain", "alphabetical", "such", "is", "this", "do", 'u', "would",3473 "why", 1);3474 ASSERT_STREQ_LEN(written, buff,3475 "why would u do this, this is such a pain. %");3476}3477#endif // LIBC_COPT_PRINTF_DISABLE_INDEX_MODE3478