1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */
3 /* This Source Code Form is subject to the terms of the Mozilla Public
4 * License, v. 2.0. If a copy of the MPL was not distributed with this file,
5 * You can obtain one at http://mozilla.org/MPL/2.0/. */
7 #include "mozilla/Assertions.h"
8 #include "mozilla/IntegerPrintfMacros.h" // this must pick up <stdint.h>
14 /* Output array and poisoning method shared by all tests. */
15 static char gOutput
[32];
20 memset(gOutput
, 0xDA, sizeof(gOutput
));
24 * The fprintf macros for signed integers are:
26 * PRIdN PRIdLEASTN PRIdFASTN PRIdMAX PRIdPTR
27 * PRIiN PRIiLEASTN PRIiFASTN PRIiMAX PRIiPTR
29 * In these names N is the width of the type as described in C99 7.18.1.
36 sprintf(gOutput
, "%" PRId8
, int8_t(-17));
37 MOZ_RELEASE_ASSERT(!strcmp(gOutput
, "-17"));
40 sprintf(gOutput
, "%" PRIi8
, int8_t(42));
41 MOZ_RELEASE_ASSERT(!strcmp(gOutput
, "42"));
48 sprintf(gOutput
, "%" PRId16
, int16_t(-289));
49 MOZ_RELEASE_ASSERT(!strcmp(gOutput
, "-289"));
52 sprintf(gOutput
, "%" PRIi16
, int16_t(728));
53 MOZ_RELEASE_ASSERT(!strcmp(gOutput
, "728"));
60 sprintf(gOutput
, "%" PRId32
, int32_t(-342178));
61 MOZ_RELEASE_ASSERT(!strcmp(gOutput
, "-342178"));
64 sprintf(gOutput
, "%" PRIi32
, int32_t(5719283));
65 MOZ_RELEASE_ASSERT(!strcmp(gOutput
, "5719283"));
72 sprintf(gOutput
, "%" PRId64
, int64_t(-INT64_C(432157943248732)));
73 MOZ_RELEASE_ASSERT(!strcmp(gOutput
, "-432157943248732"));
76 sprintf(gOutput
, "%" PRIi64
, int64_t(INT64_C(325719232983)));
77 MOZ_RELEASE_ASSERT(!strcmp(gOutput
, "325719232983"));
90 TestPrintSignedLeast8()
93 sprintf(gOutput
, "%" PRIdLEAST8
, int_least8_t(-17));
94 MOZ_RELEASE_ASSERT(!strcmp(gOutput
, "-17"));
97 sprintf(gOutput
, "%" PRIiLEAST8
, int_least8_t(42));
98 MOZ_RELEASE_ASSERT(!strcmp(gOutput
, "42"));
102 TestPrintSignedLeast16()
105 sprintf(gOutput
, "%" PRIdLEAST16
, int_least16_t(-289));
106 MOZ_RELEASE_ASSERT(!strcmp(gOutput
, "-289"));
109 sprintf(gOutput
, "%" PRIiLEAST16
, int_least16_t(728));
110 MOZ_RELEASE_ASSERT(!strcmp(gOutput
, "728"));
114 TestPrintSignedLeast32()
117 sprintf(gOutput
, "%" PRIdLEAST32
, int_least32_t(-342178));
118 MOZ_RELEASE_ASSERT(!strcmp(gOutput
, "-342178"));
121 sprintf(gOutput
, "%" PRIiLEAST32
, int_least32_t(5719283));
122 MOZ_RELEASE_ASSERT(!strcmp(gOutput
, "5719283"));
126 TestPrintSignedLeast64()
129 sprintf(gOutput
, "%" PRIdLEAST64
, int_least64_t(-INT64_C(432157943248732)));
130 MOZ_RELEASE_ASSERT(!strcmp(gOutput
, "-432157943248732"));
133 sprintf(gOutput
, "%" PRIiLEAST64
, int_least64_t(INT64_C(325719232983)));
134 MOZ_RELEASE_ASSERT(!strcmp(gOutput
, "325719232983"));
138 TestPrintSignedLeastN()
140 TestPrintSignedLeast8();
141 TestPrintSignedLeast16();
142 TestPrintSignedLeast32();
143 TestPrintSignedLeast64();
147 TestPrintSignedFast8()
150 sprintf(gOutput
, "%" PRIdFAST8
, int_fast8_t(-17));
151 MOZ_RELEASE_ASSERT(!strcmp(gOutput
, "-17"));
154 sprintf(gOutput
, "%" PRIiFAST8
, int_fast8_t(42));
155 MOZ_RELEASE_ASSERT(!strcmp(gOutput
, "42"));
159 TestPrintSignedFast16()
162 sprintf(gOutput
, "%" PRIdFAST16
, int_fast16_t(-289));
163 MOZ_RELEASE_ASSERT(!strcmp(gOutput
, "-289"));
166 sprintf(gOutput
, "%" PRIiFAST16
, int_fast16_t(728));
167 MOZ_RELEASE_ASSERT(!strcmp(gOutput
, "728"));
171 TestPrintSignedFast32()
174 sprintf(gOutput
, "%" PRIdFAST32
, int_fast32_t(-342178));
175 MOZ_RELEASE_ASSERT(!strcmp(gOutput
, "-342178"));
178 sprintf(gOutput
, "%" PRIiFAST32
, int_fast32_t(5719283));
179 MOZ_RELEASE_ASSERT(!strcmp(gOutput
, "5719283"));
183 TestPrintSignedFast64()
186 sprintf(gOutput
, "%" PRIdFAST64
, int_fast64_t(-INT64_C(432157943248732)));
187 MOZ_RELEASE_ASSERT(!strcmp(gOutput
, "-432157943248732"));
190 sprintf(gOutput
, "%" PRIiFAST64
, int_fast64_t(INT64_C(325719232983)));
191 MOZ_RELEASE_ASSERT(!strcmp(gOutput
, "325719232983"));
195 TestPrintSignedFastN()
197 TestPrintSignedFast8();
198 TestPrintSignedFast16();
199 TestPrintSignedFast32();
200 TestPrintSignedFast64();
207 sprintf(gOutput
, "%" PRIdMAX
, intmax_t(-INTMAX_C(432157943248732)));
208 MOZ_RELEASE_ASSERT(!strcmp(gOutput
, "-432157943248732"));
211 sprintf(gOutput
, "%" PRIiMAX
, intmax_t(INTMAX_C(325719232983)));
212 MOZ_RELEASE_ASSERT(!strcmp(gOutput
, "325719232983"));
219 sprintf(gOutput
, "%" PRIdPTR
, intptr_t(reinterpret_cast<void*>(12345678)));
220 MOZ_RELEASE_ASSERT(!strcmp(gOutput
, "12345678"));
223 sprintf(gOutput
, "%" PRIiPTR
, intptr_t(reinterpret_cast<void*>(87654321)));
224 MOZ_RELEASE_ASSERT(!strcmp(gOutput
, "87654321"));
231 TestPrintSignedLeastN();
232 TestPrintSignedFastN();
233 TestPrintSignedMax();
234 TestPrintSignedPtr();
238 * The fprintf macros for unsigned integers are:
240 * PRIoN PRIoLEASTN PRIoFASTN PRIoMAX PRIoPTR
241 * PRIuN PRIuLEASTN PRIuFASTN PRIuMAX PRIuPTR
242 * PRIxN PRIxLEASTN PRIxFASTN PRIxMAX PRIxPTR
243 * PRIXN PRIXLEASTN PRIXFASTN PRIXMAX PRIXPTR
245 * In these names N is the width of the type as described in C99 7.18.1.
252 sprintf(gOutput
, "%" PRIo8
, uint8_t(042));
253 MOZ_RELEASE_ASSERT(!strcmp(gOutput
, "42"));
256 sprintf(gOutput
, "%" PRIu8
, uint8_t(17));
257 MOZ_RELEASE_ASSERT(!strcmp(gOutput
, "17"));
260 sprintf(gOutput
, "%" PRIx8
, uint8_t(0x2a));
261 MOZ_RELEASE_ASSERT(!strcmp(gOutput
, "2a"));
264 sprintf(gOutput
, "%" PRIX8
, uint8_t(0xCD));
265 MOZ_RELEASE_ASSERT(!strcmp(gOutput
, "CD"));
269 TestPrintUnsigned16()
272 sprintf(gOutput
, "%" PRIo16
, uint16_t(04242));
273 MOZ_RELEASE_ASSERT(!strcmp(gOutput
, "4242"));
276 sprintf(gOutput
, "%" PRIu16
, uint16_t(1717));
277 MOZ_RELEASE_ASSERT(!strcmp(gOutput
, "1717"));
280 sprintf(gOutput
, "%" PRIx16
, uint16_t(0x2a2a));
281 MOZ_RELEASE_ASSERT(!strcmp(gOutput
, "2a2a"));
284 sprintf(gOutput
, "%" PRIX16
, uint16_t(0xCDCD));
285 MOZ_RELEASE_ASSERT(!strcmp(gOutput
, "CDCD"));
289 TestPrintUnsigned32()
292 sprintf(gOutput
, "%" PRIo32
, uint32_t(0424242));
293 MOZ_RELEASE_ASSERT(!strcmp(gOutput
, "424242"));
296 sprintf(gOutput
, "%" PRIu32
, uint32_t(171717));
297 MOZ_RELEASE_ASSERT(!strcmp(gOutput
, "171717"));
300 sprintf(gOutput
, "%" PRIx32
, uint32_t(0x2a2a2a));
301 MOZ_RELEASE_ASSERT(!strcmp(gOutput
, "2a2a2a"));
304 sprintf(gOutput
, "%" PRIX32
, uint32_t(0xCDCDCD));
305 MOZ_RELEASE_ASSERT(!strcmp(gOutput
, "CDCDCD"));
309 TestPrintUnsigned64()
312 sprintf(gOutput
, "%" PRIo64
, uint64_t(UINT64_C(0424242424242)));
313 MOZ_RELEASE_ASSERT(!strcmp(gOutput
, "424242424242"));
316 sprintf(gOutput
, "%" PRIu64
, uint64_t(UINT64_C(17171717171717171717)));
317 MOZ_RELEASE_ASSERT(!strcmp(gOutput
, "17171717171717171717"));
320 sprintf(gOutput
, "%" PRIx64
, uint64_t(UINT64_C(0x2a2a2a2a2a2a2a)));
321 MOZ_RELEASE_ASSERT(!strcmp(gOutput
, "2a2a2a2a2a2a2a"));
324 sprintf(gOutput
, "%" PRIX64
, uint64_t(UINT64_C(0xCDCDCDCDCDCD)));
325 MOZ_RELEASE_ASSERT(!strcmp(gOutput
, "CDCDCDCDCDCD"));
331 TestPrintUnsigned8();
332 TestPrintUnsigned16();
333 TestPrintUnsigned32();
334 TestPrintUnsigned64();
338 TestPrintUnsignedLeast8()
341 sprintf(gOutput
, "%" PRIoLEAST8
, uint_least8_t(042));
342 MOZ_RELEASE_ASSERT(!strcmp(gOutput
, "42"));
345 sprintf(gOutput
, "%" PRIuLEAST8
, uint_least8_t(17));
346 MOZ_RELEASE_ASSERT(!strcmp(gOutput
, "17"));
349 sprintf(gOutput
, "%" PRIxLEAST8
, uint_least8_t(0x2a));
350 MOZ_RELEASE_ASSERT(!strcmp(gOutput
, "2a"));
353 sprintf(gOutput
, "%" PRIXLEAST8
, uint_least8_t(0xCD));
354 MOZ_RELEASE_ASSERT(!strcmp(gOutput
, "CD"));
358 TestPrintUnsignedLeast16()
361 sprintf(gOutput
, "%" PRIoLEAST16
, uint_least16_t(04242));
362 MOZ_RELEASE_ASSERT(!strcmp(gOutput
, "4242"));
365 sprintf(gOutput
, "%" PRIuLEAST16
, uint_least16_t(1717));
366 MOZ_RELEASE_ASSERT(!strcmp(gOutput
, "1717"));
369 sprintf(gOutput
, "%" PRIxLEAST16
, uint_least16_t(0x2a2a));
370 MOZ_RELEASE_ASSERT(!strcmp(gOutput
, "2a2a"));
373 sprintf(gOutput
, "%" PRIXLEAST16
, uint_least16_t(0xCDCD));
374 MOZ_RELEASE_ASSERT(!strcmp(gOutput
, "CDCD"));
378 TestPrintUnsignedLeast32()
381 sprintf(gOutput
, "%" PRIoLEAST32
, uint_least32_t(0424242));
382 MOZ_RELEASE_ASSERT(!strcmp(gOutput
, "424242"));
385 sprintf(gOutput
, "%" PRIuLEAST32
, uint_least32_t(171717));
386 MOZ_RELEASE_ASSERT(!strcmp(gOutput
, "171717"));
389 sprintf(gOutput
, "%" PRIxLEAST32
, uint_least32_t(0x2a2a2a));
390 MOZ_RELEASE_ASSERT(!strcmp(gOutput
, "2a2a2a"));
393 sprintf(gOutput
, "%" PRIXLEAST32
, uint_least32_t(0xCDCDCD));
394 MOZ_RELEASE_ASSERT(!strcmp(gOutput
, "CDCDCD"));
398 TestPrintUnsignedLeast64()
401 sprintf(gOutput
, "%" PRIoLEAST64
, uint_least64_t(UINT64_C(0424242424242)));
402 MOZ_RELEASE_ASSERT(!strcmp(gOutput
, "424242424242"));
405 sprintf(gOutput
, "%" PRIuLEAST64
,
406 uint_least64_t(UINT64_C(17171717171717171717)));
407 MOZ_RELEASE_ASSERT(!strcmp(gOutput
, "17171717171717171717"));
410 sprintf(gOutput
, "%" PRIxLEAST64
, uint_least64_t(UINT64_C(0x2a2a2a2a2a2a2a)));
411 MOZ_RELEASE_ASSERT(!strcmp(gOutput
, "2a2a2a2a2a2a2a"));
414 sprintf(gOutput
, "%" PRIXLEAST64
, uint_least64_t(UINT64_C(0xCDCDCDCDCDCD)));
415 MOZ_RELEASE_ASSERT(!strcmp(gOutput
, "CDCDCDCDCDCD"));
419 TestPrintUnsignedLeastN()
421 TestPrintUnsignedLeast8();
422 TestPrintUnsignedLeast16();
423 TestPrintUnsignedLeast32();
424 TestPrintUnsignedLeast64();
428 TestPrintUnsignedFast8()
431 sprintf(gOutput
, "%" PRIoFAST8
, uint_fast8_t(042));
432 MOZ_RELEASE_ASSERT(!strcmp(gOutput
, "42"));
435 sprintf(gOutput
, "%" PRIuFAST8
, uint_fast8_t(17));
436 MOZ_RELEASE_ASSERT(!strcmp(gOutput
, "17"));
439 sprintf(gOutput
, "%" PRIxFAST8
, uint_fast8_t(0x2a));
440 MOZ_RELEASE_ASSERT(!strcmp(gOutput
, "2a"));
443 sprintf(gOutput
, "%" PRIXFAST8
, uint_fast8_t(0xCD));
444 MOZ_RELEASE_ASSERT(!strcmp(gOutput
, "CD"));
448 TestPrintUnsignedFast16()
451 sprintf(gOutput
, "%" PRIoFAST16
, uint_fast16_t(04242));
452 MOZ_RELEASE_ASSERT(!strcmp(gOutput
, "4242"));
455 sprintf(gOutput
, "%" PRIuFAST16
, uint_fast16_t(1717));
456 MOZ_RELEASE_ASSERT(!strcmp(gOutput
, "1717"));
459 sprintf(gOutput
, "%" PRIxFAST16
, uint_fast16_t(0x2a2a));
460 MOZ_RELEASE_ASSERT(!strcmp(gOutput
, "2a2a"));
463 sprintf(gOutput
, "%" PRIXFAST16
, uint_fast16_t(0xCDCD));
464 MOZ_RELEASE_ASSERT(!strcmp(gOutput
, "CDCD"));
468 TestPrintUnsignedFast32()
471 sprintf(gOutput
, "%" PRIoFAST32
, uint_fast32_t(0424242));
472 MOZ_RELEASE_ASSERT(!strcmp(gOutput
, "424242"));
475 sprintf(gOutput
, "%" PRIuFAST32
, uint_fast32_t(171717));
476 MOZ_RELEASE_ASSERT(!strcmp(gOutput
, "171717"));
479 sprintf(gOutput
, "%" PRIxFAST32
, uint_fast32_t(0x2a2a2a));
480 MOZ_RELEASE_ASSERT(!strcmp(gOutput
, "2a2a2a"));
483 sprintf(gOutput
, "%" PRIXFAST32
, uint_fast32_t(0xCDCDCD));
484 MOZ_RELEASE_ASSERT(!strcmp(gOutput
, "CDCDCD"));
488 TestPrintUnsignedFast64()
491 sprintf(gOutput
, "%" PRIoFAST64
, uint_fast64_t(UINT64_C(0424242424242)));
492 MOZ_RELEASE_ASSERT(!strcmp(gOutput
, "424242424242"));
495 sprintf(gOutput
, "%" PRIuFAST64
,
496 uint_fast64_t(UINT64_C(17171717171717171717)));
497 MOZ_RELEASE_ASSERT(!strcmp(gOutput
, "17171717171717171717"));
500 sprintf(gOutput
, "%" PRIxFAST64
, uint_fast64_t(UINT64_C(0x2a2a2a2a2a2a2a)));
501 MOZ_RELEASE_ASSERT(!strcmp(gOutput
, "2a2a2a2a2a2a2a"));
504 sprintf(gOutput
, "%" PRIXFAST64
, uint_fast64_t(UINT64_C(0xCDCDCDCDCDCD)));
505 MOZ_RELEASE_ASSERT(!strcmp(gOutput
, "CDCDCDCDCDCD"));
509 TestPrintUnsignedFastN()
511 TestPrintUnsignedFast8();
512 TestPrintUnsignedFast16();
513 TestPrintUnsignedFast32();
514 TestPrintUnsignedFast64();
518 TestPrintUnsignedMax()
521 sprintf(gOutput
, "%" PRIoMAX
, uintmax_t(UINTMAX_C(432157943248732)));
522 MOZ_RELEASE_ASSERT(!strcmp(gOutput
, "14220563454333534"));
525 sprintf(gOutput
, "%" PRIuMAX
, uintmax_t(UINTMAX_C(325719232983)));
526 MOZ_RELEASE_ASSERT(!strcmp(gOutput
, "325719232983"));
529 sprintf(gOutput
, "%" PRIxMAX
, uintmax_t(UINTMAX_C(327281321873)));
530 MOZ_RELEASE_ASSERT(!strcmp(gOutput
, "4c337ca791"));
533 sprintf(gOutput
, "%" PRIXMAX
, uintmax_t(UINTMAX_C(912389523743523)));
534 MOZ_RELEASE_ASSERT(!strcmp(gOutput
, "33DD03D75A323"));
538 TestPrintUnsignedPtr()
541 sprintf(gOutput
, "%" PRIoPTR
, uintptr_t(reinterpret_cast<void*>(12345678)));
542 MOZ_RELEASE_ASSERT(!strcmp(gOutput
, "57060516"));
545 sprintf(gOutput
, "%" PRIuPTR
, uintptr_t(reinterpret_cast<void*>(87654321)));
546 MOZ_RELEASE_ASSERT(!strcmp(gOutput
, "87654321"));
549 sprintf(gOutput
, "%" PRIxPTR
, uintptr_t(reinterpret_cast<void*>(0x4c3a791)));
550 MOZ_RELEASE_ASSERT(!strcmp(gOutput
, "4c3a791"));
553 sprintf(gOutput
, "%" PRIXPTR
, uintptr_t(reinterpret_cast<void*>(0xF328DB)));
554 MOZ_RELEASE_ASSERT(!strcmp(gOutput
, "F328DB"));
560 TestPrintUnsignedN();
561 TestPrintUnsignedLeastN();
562 TestPrintUnsignedFastN();
563 TestPrintUnsignedMax();
564 TestPrintUnsignedPtr();
575 * The fscanf macros for signed integers are:
577 * SCNdN SCNdLEASTN SCNdFASTN SCNdMAX SCNdPTR
578 * SCNiN SCNiLEASTN SCNiFASTN SCNiMAX SCNiPTR
580 * In these names N is the width of the type as described in C99 7.18.1.
584 * MSVC's scanf is insufficiently powerful to implement all the SCN* macros.
585 * Rather than support some subset of them, we instead support none of them.
586 * See the comment at the top of IntegerPrintfMacros.h. But in case we ever do
587 * support them, the following tests should adequately test implementation
588 * correctness. (Indeed, these tests *revealed* MSVC's limitations.)
590 * That said, even if MSVC ever picks up complete support, we still probably
591 * don't want to support these, because of the undefined-behavior issue noted
592 * further down in the comment atop IntegerPrintfMacros.h.
594 #define SHOULD_TEST_SCANF_MACROS 0
596 #if SHOULD_TEST_SCANF_MACROS
599 * glibc header definitions for SCN{d,i,o,u,x}{,LEAST,FAST}8 use the "hh" length
600 * modifier, which is new in C99 (and C++11, by reference). We compile this
601 * file as C++11, so if "hh" is used in these macros, it's standard. But some
602 * versions of gcc wrongly think it isn't and warn about a "non-standard"
603 * modifier. And since these tests mostly exist to verify format-macro/type
604 * consistency (particularly through compiler warnings about incorrect formats),
605 * these warnings are unacceptable. So for now, compile tests for those macros
606 * only if we aren't compiling with gcc.
608 #define SHOULD_TEST_8BIT_FORMAT_MACROS (!(MOZ_IS_GCC))
614 unsigned char mPun
[16];
619 PoisonInput(Input
<T
>& aInput
)
621 memset(aInput
.mPun
, 0xDA, sizeof(aInput
.mPun
));
626 ExtraBitsUntouched(const Input
<T
>& aInput
)
628 for (size_t i
= sizeof(aInput
.mI
); i
< sizeof(aInput
); i
++) {
629 if (aInput
.mPun
[i
] != 0xDA) {
640 #if SHOULD_TEST_8BIT_FORMAT_MACROS
644 sscanf("-17", "%" SCNd8
, &u
.i
);
645 MOZ_RELEASE_ASSERT(u
.i
== -17);
646 MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u
));
649 sscanf("042", "%" SCNi8
, &u
.i
);
650 MOZ_RELEASE_ASSERT(u
.i
== 042);
651 MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u
));
661 sscanf("-1742", "%" SCNd16
, &u
.i
);
662 MOZ_RELEASE_ASSERT(u
.i
== -1742);
663 MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u
));
666 sscanf("04217", "%" SCNi16
, &u
.i
);
667 MOZ_RELEASE_ASSERT(u
.i
== 04217);
668 MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u
));
677 sscanf("-174257", "%" SCNd32
, &u
.i
);
678 MOZ_RELEASE_ASSERT(u
.i
== -174257);
679 MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u
));
682 sscanf("0423571", "%" SCNi32
, &u
.i
);
683 MOZ_RELEASE_ASSERT(u
.i
== 0423571);
684 MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u
));
693 sscanf("-17425238927232", "%" SCNd64
, &u
.i
);
694 MOZ_RELEASE_ASSERT(u
.i
== -INT64_C(17425238927232));
695 MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u
));
698 sscanf("042333576571", "%" SCNi64
, &u
.i
);
699 MOZ_RELEASE_ASSERT(u
.i
== INT64_C(042333576571));
700 MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u
));
713 TestScanSignedLeast8()
715 #if SHOULD_TEST_8BIT_FORMAT_MACROS
716 Input
<int_least8_t> u
;
719 sscanf("-17", "%" SCNdLEAST8
, &u
.i
);
720 MOZ_RELEASE_ASSERT(u
.i
== -17);
721 MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u
));
724 sscanf("042", "%" SCNiLEAST8
, &u
.i
);
725 MOZ_RELEASE_ASSERT(u
.i
== 042);
726 MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u
));
731 TestScanSignedLeast16()
733 Input
<int_least16_t> u
;
736 sscanf("-1742", "%" SCNdLEAST16
, &u
.i
);
737 MOZ_RELEASE_ASSERT(u
.i
== -1742);
738 MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u
));
741 sscanf("04217", "%" SCNiLEAST16
, &u
.i
);
742 MOZ_RELEASE_ASSERT(u
.i
== 04217);
743 MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u
));
747 TestScanSignedLeast32()
749 Input
<int_least32_t> u
;
752 sscanf("-174257", "%" SCNdLEAST32
, &u
.i
);
753 MOZ_RELEASE_ASSERT(u
.i
== -174257);
754 MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u
));
757 sscanf("0423571", "%" SCNiLEAST32
, &u
.i
);
758 MOZ_RELEASE_ASSERT(u
.i
== 0423571);
759 MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u
));
763 TestScanSignedLeast64()
765 Input
<int_least64_t> u
;
768 sscanf("-17425238927232", "%" SCNdLEAST64
, &u
.i
);
769 MOZ_RELEASE_ASSERT(u
.i
== -INT64_C(17425238927232));
770 MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u
));
773 sscanf("042333576571", "%" SCNiLEAST64
, &u
.i
);
774 MOZ_RELEASE_ASSERT(u
.i
== INT64_C(042333576571));
775 MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u
));
779 TestScanSignedLeastN()
781 TestScanSignedLeast8();
782 TestScanSignedLeast16();
783 TestScanSignedLeast32();
784 TestScanSignedLeast64();
788 TestScanSignedFast8()
790 #if SHOULD_TEST_8BIT_FORMAT_MACROS
791 Input
<int_fast8_t> u
;
794 sscanf("-17", "%" SCNdFAST8
, &u
.i
);
795 MOZ_RELEASE_ASSERT(u
.i
== -17);
796 MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u
));
799 sscanf("042", "%" SCNiFAST8
, &u
.i
);
800 MOZ_RELEASE_ASSERT(u
.i
== 042);
801 MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u
));
806 TestScanSignedFast16()
808 Input
<int_fast16_t> u
;
811 sscanf("-1742", "%" SCNdFAST16
, &u
.i
);
812 MOZ_RELEASE_ASSERT(u
.i
== -1742);
813 MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u
));
816 sscanf("04217", "%" SCNiFAST16
, &u
.i
);
817 MOZ_RELEASE_ASSERT(u
.i
== 04217);
818 MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u
));
822 TestScanSignedFast32()
824 Input
<int_fast32_t> u
;
827 sscanf("-174257", "%" SCNdFAST32
, &u
.i
);
828 MOZ_RELEASE_ASSERT(u
.i
== -174257);
829 MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u
));
832 sscanf("0423571", "%" SCNiFAST32
, &u
.i
);
833 MOZ_RELEASE_ASSERT(u
.i
== 0423571);
834 MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u
));
838 TestScanSignedFast64()
840 Input
<int_fast64_t> u
;
843 sscanf("-17425238927232", "%" SCNdFAST64
, &u
.i
);
844 MOZ_RELEASE_ASSERT(u
.i
== -INT64_C(17425238927232));
845 MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u
));
848 sscanf("042333576571", "%" SCNiFAST64
, &u
.i
);
849 MOZ_RELEASE_ASSERT(u
.i
== INT64_C(042333576571));
850 MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u
));
854 TestScanSignedFastN()
856 TestScanSignedFast8();
857 TestScanSignedFast16();
858 TestScanSignedFast32();
859 TestScanSignedFast64();
868 sscanf("-432157943248732", "%" SCNdMAX
, &u
.i
);
869 MOZ_RELEASE_ASSERT(u
.i
== -INTMAX_C(432157943248732));
870 MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u
));
873 sscanf("04233357236571", "%" SCNiMAX
, &u
.i
);
874 MOZ_RELEASE_ASSERT(u
.i
== INTMAX_C(04233357236571));
875 MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u
));
884 sscanf("12345678", "%" SCNdPTR
, &u
.i
);
885 MOZ_RELEASE_ASSERT(u
.i
== intptr_t(reinterpret_cast<void*>(12345678)));
886 MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u
));
889 sscanf("04233357236", "%" SCNiPTR
, &u
.i
);
890 MOZ_RELEASE_ASSERT(u
.i
== intptr_t(reinterpret_cast<void*>(04233357236)));
891 MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u
));
898 TestScanSignedLeastN();
899 TestScanSignedFastN();
905 * The fscanf macros for unsigned integers are:
907 * SCNoN SCNoLEASTN SCNoFASTN SCNoMAX SCNoPTR
908 * SCNuN SCNuLEASTN SCNuFASTN SCNuMAX SCNuPTR
909 * SCNxN SCNxLEASTN SCNxFASTN SCNxMAX SCNxPTR
911 * In these names N is the width of the type as described in C99 7.18.1.
917 #if SHOULD_TEST_8BIT_FORMAT_MACROS
921 sscanf("17", "%" SCNo8
, &u
.i
);
922 MOZ_RELEASE_ASSERT(u
.i
== 017);
923 MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u
));
926 sscanf("42", "%" SCNu8
, &u
.i
);
927 MOZ_RELEASE_ASSERT(u
.i
== 42);
928 MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u
));
931 sscanf("2A", "%" SCNx8
, &u
.i
);
932 MOZ_RELEASE_ASSERT(u
.i
== 0x2A);
933 MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u
));
943 sscanf("1742", "%" SCNo16
, &u
.i
);
944 MOZ_RELEASE_ASSERT(u
.i
== 01742);
945 MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u
));
948 sscanf("4217", "%" SCNu16
, &u
.i
);
949 MOZ_RELEASE_ASSERT(u
.i
== 4217);
950 MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u
));
953 sscanf("2ABC", "%" SCNx16
, &u
.i
);
954 MOZ_RELEASE_ASSERT(u
.i
== 0x2ABC);
955 MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u
));
964 sscanf("17421742", "%" SCNo32
, &u
.i
);
965 MOZ_RELEASE_ASSERT(u
.i
== 017421742);
966 MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u
));
969 sscanf("4217867", "%" SCNu32
, &u
.i
);
970 MOZ_RELEASE_ASSERT(u
.i
== 4217867);
971 MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u
));
974 sscanf("2ABCBEEF", "%" SCNx32
, &u
.i
);
975 MOZ_RELEASE_ASSERT(u
.i
== 0x2ABCBEEF);
976 MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u
));
985 sscanf("17421742173", "%" SCNo64
, &u
.i
);
986 MOZ_RELEASE_ASSERT(u
.i
== UINT64_C(017421742173));
987 MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u
));
990 sscanf("421786713579", "%" SCNu64
, &u
.i
);
991 MOZ_RELEASE_ASSERT(u
.i
== UINT64_C(421786713579));
992 MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u
));
995 sscanf("DEADBEEF7457E", "%" SCNx64
, &u
.i
);
996 MOZ_RELEASE_ASSERT(u
.i
== UINT64_C(0xDEADBEEF7457E));
997 MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u
));
1003 TestScanUnsigned8();
1004 TestScanUnsigned16();
1005 TestScanUnsigned32();
1006 TestScanUnsigned64();
1010 TestScanUnsignedLeast8()
1012 #if SHOULD_TEST_8BIT_FORMAT_MACROS
1013 Input
<uint_least8_t> u
;
1016 sscanf("17", "%" SCNoLEAST8
, &u
.i
);
1017 MOZ_RELEASE_ASSERT(u
.i
== 017);
1018 MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u
));
1021 sscanf("42", "%" SCNuLEAST8
, &u
.i
);
1022 MOZ_RELEASE_ASSERT(u
.i
== 42);
1023 MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u
));
1026 sscanf("2A", "%" SCNxLEAST8
, &u
.i
);
1027 MOZ_RELEASE_ASSERT(u
.i
== 0x2A);
1028 MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u
));
1033 TestScanUnsignedLeast16()
1035 Input
<uint_least16_t> u
;
1038 sscanf("1742", "%" SCNoLEAST16
, &u
.i
);
1039 MOZ_RELEASE_ASSERT(u
.i
== 01742);
1040 MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u
));
1043 sscanf("4217", "%" SCNuLEAST16
, &u
.i
);
1044 MOZ_RELEASE_ASSERT(u
.i
== 4217);
1045 MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u
));
1048 sscanf("2ABC", "%" SCNxLEAST16
, &u
.i
);
1049 MOZ_RELEASE_ASSERT(u
.i
== 0x2ABC);
1050 MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u
));
1054 TestScanUnsignedLeast32()
1056 Input
<uint_least32_t> u
;
1059 sscanf("17421742", "%" SCNoLEAST32
, &u
.i
);
1060 MOZ_RELEASE_ASSERT(u
.i
== 017421742);
1061 MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u
));
1064 sscanf("4217867", "%" SCNuLEAST32
, &u
.i
);
1065 MOZ_RELEASE_ASSERT(u
.i
== 4217867);
1066 MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u
));
1069 sscanf("2ABCBEEF", "%" SCNxLEAST32
, &u
.i
);
1070 MOZ_RELEASE_ASSERT(u
.i
== 0x2ABCBEEF);
1071 MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u
));
1075 TestScanUnsignedLeast64()
1077 Input
<uint_least64_t> u
;
1080 sscanf("17421742173", "%" SCNoLEAST64
, &u
.i
);
1081 MOZ_RELEASE_ASSERT(u
.i
== UINT64_C(017421742173));
1082 MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u
));
1085 sscanf("421786713579", "%" SCNuLEAST64
, &u
.i
);
1086 MOZ_RELEASE_ASSERT(u
.i
== UINT64_C(421786713579));
1087 MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u
));
1090 sscanf("DEADBEEF7457E", "%" SCNxLEAST64
, &u
.i
);
1091 MOZ_RELEASE_ASSERT(u
.i
== UINT64_C(0xDEADBEEF7457E));
1092 MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u
));
1096 TestScanUnsignedLeastN()
1098 TestScanUnsignedLeast8();
1099 TestScanUnsignedLeast16();
1100 TestScanUnsignedLeast32();
1101 TestScanUnsignedLeast64();
1105 TestScanUnsignedFast8()
1107 #if SHOULD_TEST_8BIT_FORMAT_MACROS
1108 Input
<uint_fast8_t> u
;
1111 sscanf("17", "%" SCNoFAST8
, &u
.i
);
1112 MOZ_RELEASE_ASSERT(u
.i
== 017);
1113 MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u
));
1116 sscanf("42", "%" SCNuFAST8
, &u
.i
);
1117 MOZ_RELEASE_ASSERT(u
.i
== 42);
1118 MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u
));
1121 sscanf("2A", "%" SCNxFAST8
, &u
.i
);
1122 MOZ_RELEASE_ASSERT(u
.i
== 0x2A);
1123 MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u
));
1128 TestScanUnsignedFast16()
1130 Input
<uint_fast16_t> u
;
1133 sscanf("1742", "%" SCNoFAST16
, &u
.i
);
1134 MOZ_RELEASE_ASSERT(u
.i
== 01742);
1135 MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u
));
1138 sscanf("4217", "%" SCNuFAST16
, &u
.i
);
1139 MOZ_RELEASE_ASSERT(u
.i
== 4217);
1140 MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u
));
1143 sscanf("2ABC", "%" SCNxFAST16
, &u
.i
);
1144 MOZ_RELEASE_ASSERT(u
.i
== 0x2ABC);
1145 MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u
));
1149 TestScanUnsignedFast32()
1151 Input
<uint_fast32_t> u
;
1154 sscanf("17421742", "%" SCNoFAST32
, &u
.i
);
1155 MOZ_RELEASE_ASSERT(u
.i
== 017421742);
1156 MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u
));
1159 sscanf("4217867", "%" SCNuFAST32
, &u
.i
);
1160 MOZ_RELEASE_ASSERT(u
.i
== 4217867);
1161 MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u
));
1164 sscanf("2ABCBEEF", "%" SCNxFAST32
, &u
.i
);
1165 MOZ_RELEASE_ASSERT(u
.i
== 0x2ABCBEEF);
1166 MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u
));
1170 TestScanUnsignedFast64()
1172 Input
<uint_fast64_t> u
;
1175 sscanf("17421742173", "%" SCNoFAST64
, &u
.i
);
1176 MOZ_RELEASE_ASSERT(u
.i
== UINT64_C(017421742173));
1177 MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u
));
1180 sscanf("421786713579", "%" SCNuFAST64
, &u
.i
);
1181 MOZ_RELEASE_ASSERT(u
.i
== UINT64_C(421786713579));
1182 MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u
));
1185 sscanf("DEADBEEF7457E", "%" SCNxFAST64
, &u
.i
);
1186 MOZ_RELEASE_ASSERT(u
.i
== UINT64_C(0xDEADBEEF7457E));
1187 MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u
));
1191 TestScanUnsignedFastN()
1193 TestScanUnsignedFast8();
1194 TestScanUnsignedFast16();
1195 TestScanUnsignedFast32();
1196 TestScanUnsignedFast64();
1200 TestScanUnsignedMax()
1205 sscanf("14220563454333534", "%" SCNoMAX
, &u
.i
);
1206 MOZ_RELEASE_ASSERT(u
.i
== UINTMAX_C(432157943248732));
1207 MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u
));
1210 sscanf("432157943248732", "%" SCNuMAX
, &u
.i
);
1211 MOZ_RELEASE_ASSERT(u
.i
== UINTMAX_C(432157943248732));
1212 MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u
));
1215 sscanf("4c337ca791", "%" SCNxMAX
, &u
.i
);
1216 MOZ_RELEASE_ASSERT(u
.i
== UINTMAX_C(327281321873));
1217 MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u
));
1221 TestScanUnsignedPtr()
1226 sscanf("57060516", "%" SCNoPTR
, &u
.i
);
1227 MOZ_RELEASE_ASSERT(u
.i
== uintptr_t(reinterpret_cast<void*>(12345678)));
1228 MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u
));
1231 sscanf("87654321", "%" SCNuPTR
, &u
.i
);
1232 MOZ_RELEASE_ASSERT(u
.i
== uintptr_t(reinterpret_cast<void*>(87654321)));
1233 MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u
));
1236 sscanf("4c3a791", "%" SCNxPTR
, &u
.i
);
1237 MOZ_RELEASE_ASSERT(u
.i
== uintptr_t(reinterpret_cast<void*>(0x4c3a791)));
1238 MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u
));
1244 TestScanUnsignedN();
1245 TestScanUnsignedLeastN();
1246 TestScanUnsignedFastN();
1247 TestScanUnsignedMax();
1248 TestScanUnsignedPtr();
1258 #endif /* SHOULD_TEST_SCANF_MACROS */
1264 #if SHOULD_TEST_SCANF_MACROS