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 
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 
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 
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 
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 
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 
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 
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 
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 
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
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
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