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