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