michael@0: /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ michael@0: /* This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this file, michael@0: * You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: #include "mozilla/Assertions.h" michael@0: #include "mozilla/IntegerPrintfMacros.h" // this must pick up michael@0: michael@0: #include michael@0: #include michael@0: #include michael@0: michael@0: /* Output array and poisoning method shared by all tests. */ michael@0: static char output[32]; michael@0: michael@0: static void michael@0: PoisonOutput() michael@0: { michael@0: memset(output, 0xDA, sizeof(output)); michael@0: } michael@0: michael@0: /* michael@0: * The fprintf macros for signed integers are: michael@0: * michael@0: * PRIdN PRIdLEASTN PRIdFASTN PRIdMAX PRIdPTR michael@0: * PRIiN PRIiLEASTN PRIiFASTN PRIiMAX PRIiPTR michael@0: * michael@0: * In these names N is the width of the type as described in C99 7.18.1. michael@0: */ michael@0: michael@0: static void michael@0: TestPrintSigned8() michael@0: { michael@0: PoisonOutput(); michael@0: sprintf(output, "%" PRId8, int8_t(-17)); michael@0: MOZ_RELEASE_ASSERT(!strcmp(output, "-17")); michael@0: michael@0: PoisonOutput(); michael@0: sprintf(output, "%" PRIi8, int8_t(42)); michael@0: MOZ_RELEASE_ASSERT(!strcmp(output, "42")); michael@0: } michael@0: michael@0: static void michael@0: TestPrintSigned16() michael@0: { michael@0: PoisonOutput(); michael@0: sprintf(output, "%" PRId16, int16_t(-289)); michael@0: MOZ_RELEASE_ASSERT(!strcmp(output, "-289")); michael@0: michael@0: PoisonOutput(); michael@0: sprintf(output, "%" PRIi16, int16_t(728)); michael@0: MOZ_RELEASE_ASSERT(!strcmp(output, "728")); michael@0: } michael@0: michael@0: static void michael@0: TestPrintSigned32() michael@0: { michael@0: PoisonOutput(); michael@0: sprintf(output, "%" PRId32, int32_t(-342178)); michael@0: MOZ_RELEASE_ASSERT(!strcmp(output, "-342178")); michael@0: michael@0: PoisonOutput(); michael@0: sprintf(output, "%" PRIi32, int32_t(5719283)); michael@0: MOZ_RELEASE_ASSERT(!strcmp(output, "5719283")); michael@0: } michael@0: michael@0: static void michael@0: TestPrintSigned64() michael@0: { michael@0: PoisonOutput(); michael@0: sprintf(output, "%" PRId64, int64_t(-INT64_C(432157943248732))); michael@0: MOZ_RELEASE_ASSERT(!strcmp(output, "-432157943248732")); michael@0: michael@0: PoisonOutput(); michael@0: sprintf(output, "%" PRIi64, int64_t(INT64_C(325719232983))); michael@0: MOZ_RELEASE_ASSERT(!strcmp(output, "325719232983")); michael@0: } michael@0: michael@0: static void michael@0: TestPrintSignedN() michael@0: { michael@0: TestPrintSigned8(); michael@0: TestPrintSigned16(); michael@0: TestPrintSigned32(); michael@0: TestPrintSigned64(); michael@0: } michael@0: michael@0: static void michael@0: TestPrintSignedLeast8() michael@0: { michael@0: PoisonOutput(); michael@0: sprintf(output, "%" PRIdLEAST8, int_least8_t(-17)); michael@0: MOZ_RELEASE_ASSERT(!strcmp(output, "-17")); michael@0: michael@0: PoisonOutput(); michael@0: sprintf(output, "%" PRIiLEAST8, int_least8_t(42)); michael@0: MOZ_RELEASE_ASSERT(!strcmp(output, "42")); michael@0: } michael@0: michael@0: static void michael@0: TestPrintSignedLeast16() michael@0: { michael@0: PoisonOutput(); michael@0: sprintf(output, "%" PRIdLEAST16, int_least16_t(-289)); michael@0: MOZ_RELEASE_ASSERT(!strcmp(output, "-289")); michael@0: michael@0: PoisonOutput(); michael@0: sprintf(output, "%" PRIiLEAST16, int_least16_t(728)); michael@0: MOZ_RELEASE_ASSERT(!strcmp(output, "728")); michael@0: } michael@0: michael@0: static void michael@0: TestPrintSignedLeast32() michael@0: { michael@0: PoisonOutput(); michael@0: sprintf(output, "%" PRIdLEAST32, int_least32_t(-342178)); michael@0: MOZ_RELEASE_ASSERT(!strcmp(output, "-342178")); michael@0: michael@0: PoisonOutput(); michael@0: sprintf(output, "%" PRIiLEAST32, int_least32_t(5719283)); michael@0: MOZ_RELEASE_ASSERT(!strcmp(output, "5719283")); michael@0: } michael@0: michael@0: static void michael@0: TestPrintSignedLeast64() michael@0: { michael@0: PoisonOutput(); michael@0: sprintf(output, "%" PRIdLEAST64, int_least64_t(-INT64_C(432157943248732))); michael@0: MOZ_RELEASE_ASSERT(!strcmp(output, "-432157943248732")); michael@0: michael@0: PoisonOutput(); michael@0: sprintf(output, "%" PRIiLEAST64, int_least64_t(INT64_C(325719232983))); michael@0: MOZ_RELEASE_ASSERT(!strcmp(output, "325719232983")); michael@0: } michael@0: michael@0: static void michael@0: TestPrintSignedLeastN() michael@0: { michael@0: TestPrintSignedLeast8(); michael@0: TestPrintSignedLeast16(); michael@0: TestPrintSignedLeast32(); michael@0: TestPrintSignedLeast64(); michael@0: } michael@0: michael@0: static void michael@0: TestPrintSignedFast8() michael@0: { michael@0: PoisonOutput(); michael@0: sprintf(output, "%" PRIdFAST8, int_fast8_t(-17)); michael@0: MOZ_RELEASE_ASSERT(!strcmp(output, "-17")); michael@0: michael@0: PoisonOutput(); michael@0: sprintf(output, "%" PRIiFAST8, int_fast8_t(42)); michael@0: MOZ_RELEASE_ASSERT(!strcmp(output, "42")); michael@0: } michael@0: michael@0: static void michael@0: TestPrintSignedFast16() michael@0: { michael@0: PoisonOutput(); michael@0: sprintf(output, "%" PRIdFAST16, int_fast16_t(-289)); michael@0: MOZ_RELEASE_ASSERT(!strcmp(output, "-289")); michael@0: michael@0: PoisonOutput(); michael@0: sprintf(output, "%" PRIiFAST16, int_fast16_t(728)); michael@0: MOZ_RELEASE_ASSERT(!strcmp(output, "728")); michael@0: } michael@0: michael@0: static void michael@0: TestPrintSignedFast32() michael@0: { michael@0: PoisonOutput(); michael@0: sprintf(output, "%" PRIdFAST32, int_fast32_t(-342178)); michael@0: MOZ_RELEASE_ASSERT(!strcmp(output, "-342178")); michael@0: michael@0: PoisonOutput(); michael@0: sprintf(output, "%" PRIiFAST32, int_fast32_t(5719283)); michael@0: MOZ_RELEASE_ASSERT(!strcmp(output, "5719283")); michael@0: } michael@0: michael@0: static void michael@0: TestPrintSignedFast64() michael@0: { michael@0: PoisonOutput(); michael@0: sprintf(output, "%" PRIdFAST64, int_fast64_t(-INT64_C(432157943248732))); michael@0: MOZ_RELEASE_ASSERT(!strcmp(output, "-432157943248732")); michael@0: michael@0: PoisonOutput(); michael@0: sprintf(output, "%" PRIiFAST64, int_fast64_t(INT64_C(325719232983))); michael@0: MOZ_RELEASE_ASSERT(!strcmp(output, "325719232983")); michael@0: } michael@0: michael@0: static void michael@0: TestPrintSignedFastN() michael@0: { michael@0: TestPrintSignedFast8(); michael@0: TestPrintSignedFast16(); michael@0: TestPrintSignedFast32(); michael@0: TestPrintSignedFast64(); michael@0: } michael@0: michael@0: static void michael@0: TestPrintSignedMax() michael@0: { michael@0: PoisonOutput(); michael@0: sprintf(output, "%" PRIdMAX, intmax_t(-INTMAX_C(432157943248732))); michael@0: MOZ_RELEASE_ASSERT(!strcmp(output, "-432157943248732")); michael@0: michael@0: PoisonOutput(); michael@0: sprintf(output, "%" PRIiMAX, intmax_t(INTMAX_C(325719232983))); michael@0: MOZ_RELEASE_ASSERT(!strcmp(output, "325719232983")); michael@0: } michael@0: michael@0: static void michael@0: TestPrintSignedPtr() michael@0: { michael@0: PoisonOutput(); michael@0: sprintf(output, "%" PRIdPTR, intptr_t(reinterpret_cast(12345678))); michael@0: MOZ_RELEASE_ASSERT(!strcmp(output, "12345678")); michael@0: michael@0: PoisonOutput(); michael@0: sprintf(output, "%" PRIiPTR, intptr_t(reinterpret_cast(87654321))); michael@0: MOZ_RELEASE_ASSERT(!strcmp(output, "87654321")); michael@0: } michael@0: michael@0: static void michael@0: TestPrintSigned() michael@0: { michael@0: TestPrintSignedN(); michael@0: TestPrintSignedLeastN(); michael@0: TestPrintSignedFastN(); michael@0: TestPrintSignedMax(); michael@0: TestPrintSignedPtr(); michael@0: } michael@0: michael@0: /* michael@0: * The fprintf macros for unsigned integers are: michael@0: * michael@0: * PRIoN PRIoLEASTN PRIoFASTN PRIoMAX PRIoPTR michael@0: * PRIuN PRIuLEASTN PRIuFASTN PRIuMAX PRIuPTR michael@0: * PRIxN PRIxLEASTN PRIxFASTN PRIxMAX PRIxPTR michael@0: * PRIXN PRIXLEASTN PRIXFASTN PRIXMAX PRIXPTR michael@0: * michael@0: * In these names N is the width of the type as described in C99 7.18.1. michael@0: */ michael@0: michael@0: static void michael@0: TestPrintUnsigned8() michael@0: { michael@0: PoisonOutput(); michael@0: sprintf(output, "%" PRIo8, uint8_t(042)); michael@0: MOZ_RELEASE_ASSERT(!strcmp(output, "42")); michael@0: michael@0: PoisonOutput(); michael@0: sprintf(output, "%" PRIu8, uint8_t(17)); michael@0: MOZ_RELEASE_ASSERT(!strcmp(output, "17")); michael@0: michael@0: PoisonOutput(); michael@0: sprintf(output, "%" PRIx8, uint8_t(0x2a)); michael@0: MOZ_RELEASE_ASSERT(!strcmp(output, "2a")); michael@0: michael@0: PoisonOutput(); michael@0: sprintf(output, "%" PRIX8, uint8_t(0xCD)); michael@0: MOZ_RELEASE_ASSERT(!strcmp(output, "CD")); michael@0: } michael@0: michael@0: static void michael@0: TestPrintUnsigned16() michael@0: { michael@0: PoisonOutput(); michael@0: sprintf(output, "%" PRIo16, uint16_t(04242)); michael@0: MOZ_RELEASE_ASSERT(!strcmp(output, "4242")); michael@0: michael@0: PoisonOutput(); michael@0: sprintf(output, "%" PRIu16, uint16_t(1717)); michael@0: MOZ_RELEASE_ASSERT(!strcmp(output, "1717")); michael@0: michael@0: PoisonOutput(); michael@0: sprintf(output, "%" PRIx16, uint16_t(0x2a2a)); michael@0: MOZ_RELEASE_ASSERT(!strcmp(output, "2a2a")); michael@0: michael@0: PoisonOutput(); michael@0: sprintf(output, "%" PRIX16, uint16_t(0xCDCD)); michael@0: MOZ_RELEASE_ASSERT(!strcmp(output, "CDCD")); michael@0: } michael@0: michael@0: static void michael@0: TestPrintUnsigned32() michael@0: { michael@0: PoisonOutput(); michael@0: sprintf(output, "%" PRIo32, uint32_t(0424242)); michael@0: MOZ_RELEASE_ASSERT(!strcmp(output, "424242")); michael@0: michael@0: PoisonOutput(); michael@0: sprintf(output, "%" PRIu32, uint32_t(171717)); michael@0: MOZ_RELEASE_ASSERT(!strcmp(output, "171717")); michael@0: michael@0: PoisonOutput(); michael@0: sprintf(output, "%" PRIx32, uint32_t(0x2a2a2a)); michael@0: MOZ_RELEASE_ASSERT(!strcmp(output, "2a2a2a")); michael@0: michael@0: PoisonOutput(); michael@0: sprintf(output, "%" PRIX32, uint32_t(0xCDCDCD)); michael@0: MOZ_RELEASE_ASSERT(!strcmp(output, "CDCDCD")); michael@0: } michael@0: michael@0: static void michael@0: TestPrintUnsigned64() michael@0: { michael@0: PoisonOutput(); michael@0: sprintf(output, "%" PRIo64, uint64_t(UINT64_C(0424242424242))); michael@0: MOZ_RELEASE_ASSERT(!strcmp(output, "424242424242")); michael@0: michael@0: PoisonOutput(); michael@0: sprintf(output, "%" PRIu64, uint64_t(UINT64_C(17171717171717171717))); michael@0: MOZ_RELEASE_ASSERT(!strcmp(output, "17171717171717171717")); michael@0: michael@0: PoisonOutput(); michael@0: sprintf(output, "%" PRIx64, uint64_t(UINT64_C(0x2a2a2a2a2a2a2a))); michael@0: MOZ_RELEASE_ASSERT(!strcmp(output, "2a2a2a2a2a2a2a")); michael@0: michael@0: PoisonOutput(); michael@0: sprintf(output, "%" PRIX64, uint64_t(UINT64_C(0xCDCDCDCDCDCD))); michael@0: MOZ_RELEASE_ASSERT(!strcmp(output, "CDCDCDCDCDCD")); michael@0: } michael@0: michael@0: static void michael@0: TestPrintUnsignedN() michael@0: { michael@0: TestPrintUnsigned8(); michael@0: TestPrintUnsigned16(); michael@0: TestPrintUnsigned32(); michael@0: TestPrintUnsigned64(); michael@0: } michael@0: michael@0: static void michael@0: TestPrintUnsignedLeast8() michael@0: { michael@0: PoisonOutput(); michael@0: sprintf(output, "%" PRIoLEAST8, uint_least8_t(042)); michael@0: MOZ_RELEASE_ASSERT(!strcmp(output, "42")); michael@0: michael@0: PoisonOutput(); michael@0: sprintf(output, "%" PRIuLEAST8, uint_least8_t(17)); michael@0: MOZ_RELEASE_ASSERT(!strcmp(output, "17")); michael@0: michael@0: PoisonOutput(); michael@0: sprintf(output, "%" PRIxLEAST8, uint_least8_t(0x2a)); michael@0: MOZ_RELEASE_ASSERT(!strcmp(output, "2a")); michael@0: michael@0: PoisonOutput(); michael@0: sprintf(output, "%" PRIXLEAST8, uint_least8_t(0xCD)); michael@0: MOZ_RELEASE_ASSERT(!strcmp(output, "CD")); michael@0: } michael@0: michael@0: static void michael@0: TestPrintUnsignedLeast16() michael@0: { michael@0: PoisonOutput(); michael@0: sprintf(output, "%" PRIoLEAST16, uint_least16_t(04242)); michael@0: MOZ_RELEASE_ASSERT(!strcmp(output, "4242")); michael@0: michael@0: PoisonOutput(); michael@0: sprintf(output, "%" PRIuLEAST16, uint_least16_t(1717)); michael@0: MOZ_RELEASE_ASSERT(!strcmp(output, "1717")); michael@0: michael@0: PoisonOutput(); michael@0: sprintf(output, "%" PRIxLEAST16, uint_least16_t(0x2a2a)); michael@0: MOZ_RELEASE_ASSERT(!strcmp(output, "2a2a")); michael@0: michael@0: PoisonOutput(); michael@0: sprintf(output, "%" PRIXLEAST16, uint_least16_t(0xCDCD)); michael@0: MOZ_RELEASE_ASSERT(!strcmp(output, "CDCD")); michael@0: } michael@0: michael@0: static void michael@0: TestPrintUnsignedLeast32() michael@0: { michael@0: PoisonOutput(); michael@0: sprintf(output, "%" PRIoLEAST32, uint_least32_t(0424242)); michael@0: MOZ_RELEASE_ASSERT(!strcmp(output, "424242")); michael@0: michael@0: PoisonOutput(); michael@0: sprintf(output, "%" PRIuLEAST32, uint_least32_t(171717)); michael@0: MOZ_RELEASE_ASSERT(!strcmp(output, "171717")); michael@0: michael@0: PoisonOutput(); michael@0: sprintf(output, "%" PRIxLEAST32, uint_least32_t(0x2a2a2a)); michael@0: MOZ_RELEASE_ASSERT(!strcmp(output, "2a2a2a")); michael@0: michael@0: PoisonOutput(); michael@0: sprintf(output, "%" PRIXLEAST32, uint_least32_t(0xCDCDCD)); michael@0: MOZ_RELEASE_ASSERT(!strcmp(output, "CDCDCD")); michael@0: } michael@0: michael@0: static void michael@0: TestPrintUnsignedLeast64() michael@0: { michael@0: PoisonOutput(); michael@0: sprintf(output, "%" PRIoLEAST64, uint_least64_t(UINT64_C(0424242424242))); michael@0: MOZ_RELEASE_ASSERT(!strcmp(output, "424242424242")); michael@0: michael@0: PoisonOutput(); michael@0: sprintf(output, "%" PRIuLEAST64, uint_least64_t(UINT64_C(17171717171717171717))); michael@0: MOZ_RELEASE_ASSERT(!strcmp(output, "17171717171717171717")); michael@0: michael@0: PoisonOutput(); michael@0: sprintf(output, "%" PRIxLEAST64, uint_least64_t(UINT64_C(0x2a2a2a2a2a2a2a))); michael@0: MOZ_RELEASE_ASSERT(!strcmp(output, "2a2a2a2a2a2a2a")); michael@0: michael@0: PoisonOutput(); michael@0: sprintf(output, "%" PRIXLEAST64, uint_least64_t(UINT64_C(0xCDCDCDCDCDCD))); michael@0: MOZ_RELEASE_ASSERT(!strcmp(output, "CDCDCDCDCDCD")); michael@0: } michael@0: michael@0: static void michael@0: TestPrintUnsignedLeastN() michael@0: { michael@0: TestPrintUnsignedLeast8(); michael@0: TestPrintUnsignedLeast16(); michael@0: TestPrintUnsignedLeast32(); michael@0: TestPrintUnsignedLeast64(); michael@0: } michael@0: michael@0: static void michael@0: TestPrintUnsignedFast8() michael@0: { michael@0: PoisonOutput(); michael@0: sprintf(output, "%" PRIoFAST8, uint_fast8_t(042)); michael@0: MOZ_RELEASE_ASSERT(!strcmp(output, "42")); michael@0: michael@0: PoisonOutput(); michael@0: sprintf(output, "%" PRIuFAST8, uint_fast8_t(17)); michael@0: MOZ_RELEASE_ASSERT(!strcmp(output, "17")); michael@0: michael@0: PoisonOutput(); michael@0: sprintf(output, "%" PRIxFAST8, uint_fast8_t(0x2a)); michael@0: MOZ_RELEASE_ASSERT(!strcmp(output, "2a")); michael@0: michael@0: PoisonOutput(); michael@0: sprintf(output, "%" PRIXFAST8, uint_fast8_t(0xCD)); michael@0: MOZ_RELEASE_ASSERT(!strcmp(output, "CD")); michael@0: } michael@0: michael@0: static void michael@0: TestPrintUnsignedFast16() michael@0: { michael@0: PoisonOutput(); michael@0: sprintf(output, "%" PRIoFAST16, uint_fast16_t(04242)); michael@0: MOZ_RELEASE_ASSERT(!strcmp(output, "4242")); michael@0: michael@0: PoisonOutput(); michael@0: sprintf(output, "%" PRIuFAST16, uint_fast16_t(1717)); michael@0: MOZ_RELEASE_ASSERT(!strcmp(output, "1717")); michael@0: michael@0: PoisonOutput(); michael@0: sprintf(output, "%" PRIxFAST16, uint_fast16_t(0x2a2a)); michael@0: MOZ_RELEASE_ASSERT(!strcmp(output, "2a2a")); michael@0: michael@0: PoisonOutput(); michael@0: sprintf(output, "%" PRIXFAST16, uint_fast16_t(0xCDCD)); michael@0: MOZ_RELEASE_ASSERT(!strcmp(output, "CDCD")); michael@0: } michael@0: michael@0: static void michael@0: TestPrintUnsignedFast32() michael@0: { michael@0: PoisonOutput(); michael@0: sprintf(output, "%" PRIoFAST32, uint_fast32_t(0424242)); michael@0: MOZ_RELEASE_ASSERT(!strcmp(output, "424242")); michael@0: michael@0: PoisonOutput(); michael@0: sprintf(output, "%" PRIuFAST32, uint_fast32_t(171717)); michael@0: MOZ_RELEASE_ASSERT(!strcmp(output, "171717")); michael@0: michael@0: PoisonOutput(); michael@0: sprintf(output, "%" PRIxFAST32, uint_fast32_t(0x2a2a2a)); michael@0: MOZ_RELEASE_ASSERT(!strcmp(output, "2a2a2a")); michael@0: michael@0: PoisonOutput(); michael@0: sprintf(output, "%" PRIXFAST32, uint_fast32_t(0xCDCDCD)); michael@0: MOZ_RELEASE_ASSERT(!strcmp(output, "CDCDCD")); michael@0: } michael@0: michael@0: static void michael@0: TestPrintUnsignedFast64() michael@0: { michael@0: PoisonOutput(); michael@0: sprintf(output, "%" PRIoFAST64, uint_fast64_t(UINT64_C(0424242424242))); michael@0: MOZ_RELEASE_ASSERT(!strcmp(output, "424242424242")); michael@0: michael@0: PoisonOutput(); michael@0: sprintf(output, "%" PRIuFAST64, uint_fast64_t(UINT64_C(17171717171717171717))); michael@0: MOZ_RELEASE_ASSERT(!strcmp(output, "17171717171717171717")); michael@0: michael@0: PoisonOutput(); michael@0: sprintf(output, "%" PRIxFAST64, uint_fast64_t(UINT64_C(0x2a2a2a2a2a2a2a))); michael@0: MOZ_RELEASE_ASSERT(!strcmp(output, "2a2a2a2a2a2a2a")); michael@0: michael@0: PoisonOutput(); michael@0: sprintf(output, "%" PRIXFAST64, uint_fast64_t(UINT64_C(0xCDCDCDCDCDCD))); michael@0: MOZ_RELEASE_ASSERT(!strcmp(output, "CDCDCDCDCDCD")); michael@0: } michael@0: michael@0: static void michael@0: TestPrintUnsignedFastN() michael@0: { michael@0: TestPrintUnsignedFast8(); michael@0: TestPrintUnsignedFast16(); michael@0: TestPrintUnsignedFast32(); michael@0: TestPrintUnsignedFast64(); michael@0: } michael@0: michael@0: static void michael@0: TestPrintUnsignedMax() michael@0: { michael@0: PoisonOutput(); michael@0: sprintf(output, "%" PRIoMAX, uintmax_t(UINTMAX_C(432157943248732))); michael@0: MOZ_RELEASE_ASSERT(!strcmp(output, "14220563454333534")); michael@0: michael@0: PoisonOutput(); michael@0: sprintf(output, "%" PRIuMAX, uintmax_t(UINTMAX_C(325719232983))); michael@0: MOZ_RELEASE_ASSERT(!strcmp(output, "325719232983")); michael@0: michael@0: PoisonOutput(); michael@0: sprintf(output, "%" PRIxMAX, uintmax_t(UINTMAX_C(327281321873))); michael@0: MOZ_RELEASE_ASSERT(!strcmp(output, "4c337ca791")); michael@0: michael@0: PoisonOutput(); michael@0: sprintf(output, "%" PRIXMAX, uintmax_t(UINTMAX_C(912389523743523))); michael@0: MOZ_RELEASE_ASSERT(!strcmp(output, "33DD03D75A323")); michael@0: } michael@0: michael@0: static void michael@0: TestPrintUnsignedPtr() michael@0: { michael@0: PoisonOutput(); michael@0: sprintf(output, "%" PRIoPTR, uintptr_t(reinterpret_cast(12345678))); michael@0: MOZ_RELEASE_ASSERT(!strcmp(output, "57060516")); michael@0: michael@0: PoisonOutput(); michael@0: sprintf(output, "%" PRIuPTR, uintptr_t(reinterpret_cast(87654321))); michael@0: MOZ_RELEASE_ASSERT(!strcmp(output, "87654321")); michael@0: michael@0: PoisonOutput(); michael@0: sprintf(output, "%" PRIxPTR, uintptr_t(reinterpret_cast(0x4c3a791))); michael@0: MOZ_RELEASE_ASSERT(!strcmp(output, "4c3a791")); michael@0: michael@0: PoisonOutput(); michael@0: sprintf(output, "%" PRIXPTR, uintptr_t(reinterpret_cast(0xF328DB))); michael@0: MOZ_RELEASE_ASSERT(!strcmp(output, "F328DB")); michael@0: } michael@0: michael@0: static void michael@0: TestPrintUnsigned() michael@0: { michael@0: TestPrintUnsignedN(); michael@0: TestPrintUnsignedLeastN(); michael@0: TestPrintUnsignedFastN(); michael@0: TestPrintUnsignedMax(); michael@0: TestPrintUnsignedPtr(); michael@0: } michael@0: michael@0: static void michael@0: TestPrint() michael@0: { michael@0: TestPrintSigned(); michael@0: TestPrintUnsigned(); michael@0: } michael@0: michael@0: /* michael@0: * The fscanf macros for signed integers are: michael@0: * michael@0: * SCNdN SCNdLEASTN SCNdFASTN SCNdMAX SCNdPTR michael@0: * SCNiN SCNiLEASTN SCNiFASTN SCNiMAX SCNiPTR michael@0: * michael@0: * In these names N is the width of the type as described in C99 7.18.1. michael@0: */ michael@0: michael@0: /* michael@0: * MSVC's scanf is insufficiently powerful to implement all the SCN* macros. michael@0: * Rather than support some subset of them, we instead support none of them. michael@0: * See the comment at the top of IntegerPrintfMacros.h. But in case we ever do michael@0: * support them, the following tests should adequately test implementation michael@0: * correctness. (Indeed, these tests *revealed* MSVC's limitations.) michael@0: * michael@0: * That said, even if MSVC ever picks up complete support, we still probably michael@0: * don't want to support these, because of the undefined-behavior issue noted michael@0: * further down in the comment atop IntegerPrintfMacros.h. michael@0: */ michael@0: #define SHOULD_TEST_SCANF_MACROS 0 michael@0: michael@0: #if SHOULD_TEST_SCANF_MACROS michael@0: michael@0: /* michael@0: * glibc header definitions for SCN{d,i,o,u,x}{,LEAST,FAST}8 use the "hh" length michael@0: * modifier, which is new in C99 (and C++11, by reference). We compile this michael@0: * file as C++11, so if "hh" is used in these macros, it's standard. But some michael@0: * versions of gcc wrongly think it isn't and warn about a "non-standard" michael@0: * modifier. And since these tests mostly exist to verify format-macro/type michael@0: * consistency (particularly through compiler warnings about incorrect formats), michael@0: * these warnings are unacceptable. So for now, compile tests for those macros michael@0: * only if we aren't compiling with gcc. michael@0: */ michael@0: #define SHOULD_TEST_8BIT_FORMAT_MACROS (!(MOZ_IS_GCC)) michael@0: michael@0: template michael@0: union Input michael@0: { michael@0: T i; michael@0: unsigned char pun[16]; michael@0: }; michael@0: michael@0: template michael@0: static void michael@0: PoisonInput(Input& input) michael@0: { michael@0: memset(input.pun, 0xDA, sizeof(input.pun)); michael@0: } michael@0: michael@0: template michael@0: static bool michael@0: ExtraBitsUntouched(const Input& input) michael@0: { michael@0: for (size_t i = sizeof(input.i); i < sizeof(input); i++) { michael@0: if (input.pun[i] != 0xDA) michael@0: return false; michael@0: } michael@0: michael@0: return true; michael@0: } michael@0: michael@0: static void michael@0: TestScanSigned8() michael@0: { michael@0: #if SHOULD_TEST_8BIT_FORMAT_MACROS michael@0: Input u; michael@0: michael@0: PoisonInput(u); michael@0: sscanf("-17", "%" SCNd8, &u.i); michael@0: MOZ_RELEASE_ASSERT(u.i == -17); michael@0: MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); michael@0: michael@0: PoisonInput(u); michael@0: sscanf("042", "%" SCNi8, &u.i); michael@0: MOZ_RELEASE_ASSERT(u.i == 042); michael@0: MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); michael@0: #endif michael@0: } michael@0: michael@0: static void michael@0: TestScanSigned16() michael@0: { michael@0: Input u; michael@0: michael@0: PoisonInput(u); michael@0: sscanf("-1742", "%" SCNd16, &u.i); michael@0: MOZ_RELEASE_ASSERT(u.i == -1742); michael@0: MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); michael@0: michael@0: PoisonInput(u); michael@0: sscanf("04217", "%" SCNi16, &u.i); michael@0: MOZ_RELEASE_ASSERT(u.i == 04217); michael@0: MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); michael@0: } michael@0: michael@0: static void michael@0: TestScanSigned32() michael@0: { michael@0: Input u; michael@0: michael@0: PoisonInput(u); michael@0: sscanf("-174257", "%" SCNd32, &u.i); michael@0: MOZ_RELEASE_ASSERT(u.i == -174257); michael@0: MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); michael@0: michael@0: PoisonInput(u); michael@0: sscanf("0423571", "%" SCNi32, &u.i); michael@0: MOZ_RELEASE_ASSERT(u.i == 0423571); michael@0: MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); michael@0: } michael@0: michael@0: static void michael@0: TestScanSigned64() michael@0: { michael@0: Input u; michael@0: michael@0: PoisonInput(u); michael@0: sscanf("-17425238927232", "%" SCNd64, &u.i); michael@0: MOZ_RELEASE_ASSERT(u.i == -INT64_C(17425238927232)); michael@0: MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); michael@0: michael@0: PoisonInput(u); michael@0: sscanf("042333576571", "%" SCNi64, &u.i); michael@0: MOZ_RELEASE_ASSERT(u.i == INT64_C(042333576571)); michael@0: MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); michael@0: } michael@0: michael@0: static void michael@0: TestScanSignedN() michael@0: { michael@0: TestScanSigned8(); michael@0: TestScanSigned16(); michael@0: TestScanSigned32(); michael@0: TestScanSigned64(); michael@0: } michael@0: michael@0: static void michael@0: TestScanSignedLeast8() michael@0: { michael@0: #if SHOULD_TEST_8BIT_FORMAT_MACROS michael@0: Input u; michael@0: michael@0: PoisonInput(u); michael@0: sscanf("-17", "%" SCNdLEAST8, &u.i); michael@0: MOZ_RELEASE_ASSERT(u.i == -17); michael@0: MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); michael@0: michael@0: PoisonInput(u); michael@0: sscanf("042", "%" SCNiLEAST8, &u.i); michael@0: MOZ_RELEASE_ASSERT(u.i == 042); michael@0: MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); michael@0: #endif michael@0: } michael@0: michael@0: static void michael@0: TestScanSignedLeast16() michael@0: { michael@0: Input u; michael@0: michael@0: PoisonInput(u); michael@0: sscanf("-1742", "%" SCNdLEAST16, &u.i); michael@0: MOZ_RELEASE_ASSERT(u.i == -1742); michael@0: MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); michael@0: michael@0: PoisonInput(u); michael@0: sscanf("04217", "%" SCNiLEAST16, &u.i); michael@0: MOZ_RELEASE_ASSERT(u.i == 04217); michael@0: MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); michael@0: } michael@0: michael@0: static void michael@0: TestScanSignedLeast32() michael@0: { michael@0: Input u; michael@0: michael@0: PoisonInput(u); michael@0: sscanf("-174257", "%" SCNdLEAST32, &u.i); michael@0: MOZ_RELEASE_ASSERT(u.i == -174257); michael@0: MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); michael@0: michael@0: PoisonInput(u); michael@0: sscanf("0423571", "%" SCNiLEAST32, &u.i); michael@0: MOZ_RELEASE_ASSERT(u.i == 0423571); michael@0: MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); michael@0: } michael@0: michael@0: static void michael@0: TestScanSignedLeast64() michael@0: { michael@0: Input u; michael@0: michael@0: PoisonInput(u); michael@0: sscanf("-17425238927232", "%" SCNdLEAST64, &u.i); michael@0: MOZ_RELEASE_ASSERT(u.i == -INT64_C(17425238927232)); michael@0: MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); michael@0: michael@0: PoisonInput(u); michael@0: sscanf("042333576571", "%" SCNiLEAST64, &u.i); michael@0: MOZ_RELEASE_ASSERT(u.i == INT64_C(042333576571)); michael@0: MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); michael@0: } michael@0: michael@0: static void michael@0: TestScanSignedLeastN() michael@0: { michael@0: TestScanSignedLeast8(); michael@0: TestScanSignedLeast16(); michael@0: TestScanSignedLeast32(); michael@0: TestScanSignedLeast64(); michael@0: } michael@0: michael@0: static void michael@0: TestScanSignedFast8() michael@0: { michael@0: #if SHOULD_TEST_8BIT_FORMAT_MACROS michael@0: Input u; michael@0: michael@0: PoisonInput(u); michael@0: sscanf("-17", "%" SCNdFAST8, &u.i); michael@0: MOZ_RELEASE_ASSERT(u.i == -17); michael@0: MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); michael@0: michael@0: PoisonInput(u); michael@0: sscanf("042", "%" SCNiFAST8, &u.i); michael@0: MOZ_RELEASE_ASSERT(u.i == 042); michael@0: MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); michael@0: #endif michael@0: } michael@0: michael@0: static void michael@0: TestScanSignedFast16() michael@0: { michael@0: Input u; michael@0: michael@0: PoisonInput(u); michael@0: sscanf("-1742", "%" SCNdFAST16, &u.i); michael@0: MOZ_RELEASE_ASSERT(u.i == -1742); michael@0: MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); michael@0: michael@0: PoisonInput(u); michael@0: sscanf("04217", "%" SCNiFAST16, &u.i); michael@0: MOZ_RELEASE_ASSERT(u.i == 04217); michael@0: MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); michael@0: } michael@0: michael@0: static void michael@0: TestScanSignedFast32() michael@0: { michael@0: Input u; michael@0: michael@0: PoisonInput(u); michael@0: sscanf("-174257", "%" SCNdFAST32, &u.i); michael@0: MOZ_RELEASE_ASSERT(u.i == -174257); michael@0: MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); michael@0: michael@0: PoisonInput(u); michael@0: sscanf("0423571", "%" SCNiFAST32, &u.i); michael@0: MOZ_RELEASE_ASSERT(u.i == 0423571); michael@0: MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); michael@0: } michael@0: michael@0: static void michael@0: TestScanSignedFast64() michael@0: { michael@0: Input u; michael@0: michael@0: PoisonInput(u); michael@0: sscanf("-17425238927232", "%" SCNdFAST64, &u.i); michael@0: MOZ_RELEASE_ASSERT(u.i == -INT64_C(17425238927232)); michael@0: MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); michael@0: michael@0: PoisonInput(u); michael@0: sscanf("042333576571", "%" SCNiFAST64, &u.i); michael@0: MOZ_RELEASE_ASSERT(u.i == INT64_C(042333576571)); michael@0: MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); michael@0: } michael@0: michael@0: static void michael@0: TestScanSignedFastN() michael@0: { michael@0: TestScanSignedFast8(); michael@0: TestScanSignedFast16(); michael@0: TestScanSignedFast32(); michael@0: TestScanSignedFast64(); michael@0: } michael@0: michael@0: static void michael@0: TestScanSignedMax() michael@0: { michael@0: Input u; michael@0: michael@0: PoisonInput(u); michael@0: sscanf("-432157943248732", "%" SCNdMAX, &u.i); michael@0: MOZ_RELEASE_ASSERT(u.i == -INTMAX_C(432157943248732)); michael@0: MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); michael@0: michael@0: PoisonInput(u); michael@0: sscanf("04233357236571", "%" SCNiMAX, &u.i); michael@0: MOZ_RELEASE_ASSERT(u.i == INTMAX_C(04233357236571)); michael@0: MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); michael@0: } michael@0: michael@0: static void michael@0: TestScanSignedPtr() michael@0: { michael@0: Input u; michael@0: michael@0: PoisonInput(u); michael@0: sscanf("12345678", "%" SCNdPTR, &u.i); michael@0: MOZ_RELEASE_ASSERT(u.i == intptr_t(reinterpret_cast(12345678))); michael@0: MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); michael@0: michael@0: PoisonInput(u); michael@0: sscanf("04233357236", "%" SCNiPTR, &u.i); michael@0: MOZ_RELEASE_ASSERT(u.i == intptr_t(reinterpret_cast(04233357236))); michael@0: MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); michael@0: } michael@0: michael@0: static void michael@0: TestScanSigned() michael@0: { michael@0: TestScanSignedN(); michael@0: TestScanSignedLeastN(); michael@0: TestScanSignedFastN(); michael@0: TestScanSignedMax(); michael@0: TestScanSignedPtr(); michael@0: } michael@0: michael@0: /* michael@0: * The fscanf macros for unsigned integers are: michael@0: * michael@0: * SCNoN SCNoLEASTN SCNoFASTN SCNoMAX SCNoPTR michael@0: * SCNuN SCNuLEASTN SCNuFASTN SCNuMAX SCNuPTR michael@0: * SCNxN SCNxLEASTN SCNxFASTN SCNxMAX SCNxPTR michael@0: * michael@0: * In these names N is the width of the type as described in C99 7.18.1. michael@0: */ michael@0: michael@0: static void michael@0: TestScanUnsigned8() michael@0: { michael@0: #if SHOULD_TEST_8BIT_FORMAT_MACROS michael@0: Input u; michael@0: michael@0: PoisonInput(u); michael@0: sscanf("17", "%" SCNo8, &u.i); michael@0: MOZ_RELEASE_ASSERT(u.i == 017); michael@0: MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); michael@0: michael@0: PoisonInput(u); michael@0: sscanf("42", "%" SCNu8, &u.i); michael@0: MOZ_RELEASE_ASSERT(u.i == 42); michael@0: MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); michael@0: michael@0: PoisonInput(u); michael@0: sscanf("2A", "%" SCNx8, &u.i); michael@0: MOZ_RELEASE_ASSERT(u.i == 0x2A); michael@0: MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); michael@0: #endif michael@0: } michael@0: michael@0: static void michael@0: TestScanUnsigned16() michael@0: { michael@0: Input u; michael@0: michael@0: PoisonInput(u); michael@0: sscanf("1742", "%" SCNo16, &u.i); michael@0: MOZ_RELEASE_ASSERT(u.i == 01742); michael@0: MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); michael@0: michael@0: PoisonInput(u); michael@0: sscanf("4217", "%" SCNu16, &u.i); michael@0: MOZ_RELEASE_ASSERT(u.i == 4217); michael@0: MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); michael@0: michael@0: PoisonInput(u); michael@0: sscanf("2ABC", "%" SCNx16, &u.i); michael@0: MOZ_RELEASE_ASSERT(u.i == 0x2ABC); michael@0: MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); michael@0: } michael@0: michael@0: static void michael@0: TestScanUnsigned32() michael@0: { michael@0: Input u; michael@0: michael@0: PoisonInput(u); michael@0: sscanf("17421742", "%" SCNo32, &u.i); michael@0: MOZ_RELEASE_ASSERT(u.i == 017421742); michael@0: MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); michael@0: michael@0: PoisonInput(u); michael@0: sscanf("4217867", "%" SCNu32, &u.i); michael@0: MOZ_RELEASE_ASSERT(u.i == 4217867); michael@0: MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); michael@0: michael@0: PoisonInput(u); michael@0: sscanf("2ABCBEEF", "%" SCNx32, &u.i); michael@0: MOZ_RELEASE_ASSERT(u.i == 0x2ABCBEEF); michael@0: MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); michael@0: } michael@0: michael@0: static void michael@0: TestScanUnsigned64() michael@0: { michael@0: Input u; michael@0: michael@0: PoisonInput(u); michael@0: sscanf("17421742173", "%" SCNo64, &u.i); michael@0: MOZ_RELEASE_ASSERT(u.i == UINT64_C(017421742173)); michael@0: MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); michael@0: michael@0: PoisonInput(u); michael@0: sscanf("421786713579", "%" SCNu64, &u.i); michael@0: MOZ_RELEASE_ASSERT(u.i == UINT64_C(421786713579)); michael@0: MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); michael@0: michael@0: PoisonInput(u); michael@0: sscanf("DEADBEEF7457E", "%" SCNx64, &u.i); michael@0: MOZ_RELEASE_ASSERT(u.i == UINT64_C(0xDEADBEEF7457E)); michael@0: MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); michael@0: } michael@0: michael@0: static void michael@0: TestScanUnsignedN() michael@0: { michael@0: TestScanUnsigned8(); michael@0: TestScanUnsigned16(); michael@0: TestScanUnsigned32(); michael@0: TestScanUnsigned64(); michael@0: } michael@0: michael@0: static void michael@0: TestScanUnsignedLeast8() michael@0: { michael@0: #if SHOULD_TEST_8BIT_FORMAT_MACROS michael@0: Input u; michael@0: michael@0: PoisonInput(u); michael@0: sscanf("17", "%" SCNoLEAST8, &u.i); michael@0: MOZ_RELEASE_ASSERT(u.i == 017); michael@0: MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); michael@0: michael@0: PoisonInput(u); michael@0: sscanf("42", "%" SCNuLEAST8, &u.i); michael@0: MOZ_RELEASE_ASSERT(u.i == 42); michael@0: MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); michael@0: michael@0: PoisonInput(u); michael@0: sscanf("2A", "%" SCNxLEAST8, &u.i); michael@0: MOZ_RELEASE_ASSERT(u.i == 0x2A); michael@0: MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); michael@0: #endif michael@0: } michael@0: michael@0: static void michael@0: TestScanUnsignedLeast16() michael@0: { michael@0: Input u; michael@0: michael@0: PoisonInput(u); michael@0: sscanf("1742", "%" SCNoLEAST16, &u.i); michael@0: MOZ_RELEASE_ASSERT(u.i == 01742); michael@0: MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); michael@0: michael@0: PoisonInput(u); michael@0: sscanf("4217", "%" SCNuLEAST16, &u.i); michael@0: MOZ_RELEASE_ASSERT(u.i == 4217); michael@0: MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); michael@0: michael@0: PoisonInput(u); michael@0: sscanf("2ABC", "%" SCNxLEAST16, &u.i); michael@0: MOZ_RELEASE_ASSERT(u.i == 0x2ABC); michael@0: MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); michael@0: } michael@0: michael@0: static void michael@0: TestScanUnsignedLeast32() michael@0: { michael@0: Input u; michael@0: michael@0: PoisonInput(u); michael@0: sscanf("17421742", "%" SCNoLEAST32, &u.i); michael@0: MOZ_RELEASE_ASSERT(u.i == 017421742); michael@0: MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); michael@0: michael@0: PoisonInput(u); michael@0: sscanf("4217867", "%" SCNuLEAST32, &u.i); michael@0: MOZ_RELEASE_ASSERT(u.i == 4217867); michael@0: MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); michael@0: michael@0: PoisonInput(u); michael@0: sscanf("2ABCBEEF", "%" SCNxLEAST32, &u.i); michael@0: MOZ_RELEASE_ASSERT(u.i == 0x2ABCBEEF); michael@0: MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); michael@0: } michael@0: michael@0: static void michael@0: TestScanUnsignedLeast64() michael@0: { michael@0: Input u; michael@0: michael@0: PoisonInput(u); michael@0: sscanf("17421742173", "%" SCNoLEAST64, &u.i); michael@0: MOZ_RELEASE_ASSERT(u.i == UINT64_C(017421742173)); michael@0: MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); michael@0: michael@0: PoisonInput(u); michael@0: sscanf("421786713579", "%" SCNuLEAST64, &u.i); michael@0: MOZ_RELEASE_ASSERT(u.i == UINT64_C(421786713579)); michael@0: MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); michael@0: michael@0: PoisonInput(u); michael@0: sscanf("DEADBEEF7457E", "%" SCNxLEAST64, &u.i); michael@0: MOZ_RELEASE_ASSERT(u.i == UINT64_C(0xDEADBEEF7457E)); michael@0: MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); michael@0: } michael@0: michael@0: static void michael@0: TestScanUnsignedLeastN() michael@0: { michael@0: TestScanUnsignedLeast8(); michael@0: TestScanUnsignedLeast16(); michael@0: TestScanUnsignedLeast32(); michael@0: TestScanUnsignedLeast64(); michael@0: } michael@0: michael@0: static void michael@0: TestScanUnsignedFast8() michael@0: { michael@0: #if SHOULD_TEST_8BIT_FORMAT_MACROS michael@0: Input u; michael@0: michael@0: PoisonInput(u); michael@0: sscanf("17", "%" SCNoFAST8, &u.i); michael@0: MOZ_RELEASE_ASSERT(u.i == 017); michael@0: MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); michael@0: michael@0: PoisonInput(u); michael@0: sscanf("42", "%" SCNuFAST8, &u.i); michael@0: MOZ_RELEASE_ASSERT(u.i == 42); michael@0: MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); michael@0: michael@0: PoisonInput(u); michael@0: sscanf("2A", "%" SCNxFAST8, &u.i); michael@0: MOZ_RELEASE_ASSERT(u.i == 0x2A); michael@0: MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); michael@0: #endif michael@0: } michael@0: michael@0: static void michael@0: TestScanUnsignedFast16() michael@0: { michael@0: Input u; michael@0: michael@0: PoisonInput(u); michael@0: sscanf("1742", "%" SCNoFAST16, &u.i); michael@0: MOZ_RELEASE_ASSERT(u.i == 01742); michael@0: MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); michael@0: michael@0: PoisonInput(u); michael@0: sscanf("4217", "%" SCNuFAST16, &u.i); michael@0: MOZ_RELEASE_ASSERT(u.i == 4217); michael@0: MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); michael@0: michael@0: PoisonInput(u); michael@0: sscanf("2ABC", "%" SCNxFAST16, &u.i); michael@0: MOZ_RELEASE_ASSERT(u.i == 0x2ABC); michael@0: MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); michael@0: } michael@0: michael@0: static void michael@0: TestScanUnsignedFast32() michael@0: { michael@0: Input u; michael@0: michael@0: PoisonInput(u); michael@0: sscanf("17421742", "%" SCNoFAST32, &u.i); michael@0: MOZ_RELEASE_ASSERT(u.i == 017421742); michael@0: MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); michael@0: michael@0: PoisonInput(u); michael@0: sscanf("4217867", "%" SCNuFAST32, &u.i); michael@0: MOZ_RELEASE_ASSERT(u.i == 4217867); michael@0: MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); michael@0: michael@0: PoisonInput(u); michael@0: sscanf("2ABCBEEF", "%" SCNxFAST32, &u.i); michael@0: MOZ_RELEASE_ASSERT(u.i == 0x2ABCBEEF); michael@0: MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); michael@0: } michael@0: michael@0: static void michael@0: TestScanUnsignedFast64() michael@0: { michael@0: Input u; michael@0: michael@0: PoisonInput(u); michael@0: sscanf("17421742173", "%" SCNoFAST64, &u.i); michael@0: MOZ_RELEASE_ASSERT(u.i == UINT64_C(017421742173)); michael@0: MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); michael@0: michael@0: PoisonInput(u); michael@0: sscanf("421786713579", "%" SCNuFAST64, &u.i); michael@0: MOZ_RELEASE_ASSERT(u.i == UINT64_C(421786713579)); michael@0: MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); michael@0: michael@0: PoisonInput(u); michael@0: sscanf("DEADBEEF7457E", "%" SCNxFAST64, &u.i); michael@0: MOZ_RELEASE_ASSERT(u.i == UINT64_C(0xDEADBEEF7457E)); michael@0: MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); michael@0: } michael@0: michael@0: static void michael@0: TestScanUnsignedFastN() michael@0: { michael@0: TestScanUnsignedFast8(); michael@0: TestScanUnsignedFast16(); michael@0: TestScanUnsignedFast32(); michael@0: TestScanUnsignedFast64(); michael@0: } michael@0: michael@0: static void michael@0: TestScanUnsignedMax() michael@0: { michael@0: Input u; michael@0: michael@0: PoisonInput(u); michael@0: sscanf("14220563454333534", "%" SCNoMAX, &u.i); michael@0: MOZ_RELEASE_ASSERT(u.i == UINTMAX_C(432157943248732)); michael@0: MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); michael@0: michael@0: PoisonInput(u); michael@0: sscanf("432157943248732", "%" SCNuMAX, &u.i); michael@0: MOZ_RELEASE_ASSERT(u.i == UINTMAX_C(432157943248732)); michael@0: MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); michael@0: michael@0: PoisonInput(u); michael@0: sscanf("4c337ca791", "%" SCNxMAX, &u.i); michael@0: MOZ_RELEASE_ASSERT(u.i == UINTMAX_C(327281321873)); michael@0: MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); michael@0: } michael@0: michael@0: static void michael@0: TestScanUnsignedPtr() michael@0: { michael@0: Input u; michael@0: michael@0: PoisonInput(u); michael@0: sscanf("57060516", "%" SCNoPTR, &u.i); michael@0: MOZ_RELEASE_ASSERT(u.i == uintptr_t(reinterpret_cast(12345678))); michael@0: MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); michael@0: michael@0: PoisonInput(u); michael@0: sscanf("87654321", "%" SCNuPTR, &u.i); michael@0: MOZ_RELEASE_ASSERT(u.i == uintptr_t(reinterpret_cast(87654321))); michael@0: MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); michael@0: michael@0: PoisonInput(u); michael@0: sscanf("4c3a791", "%" SCNxPTR, &u.i); michael@0: MOZ_RELEASE_ASSERT(u.i == uintptr_t(reinterpret_cast(0x4c3a791))); michael@0: MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); michael@0: } michael@0: michael@0: static void michael@0: TestScanUnsigned() michael@0: { michael@0: TestScanUnsignedN(); michael@0: TestScanUnsignedLeastN(); michael@0: TestScanUnsignedFastN(); michael@0: TestScanUnsignedMax(); michael@0: TestScanUnsignedPtr(); michael@0: } michael@0: michael@0: static void michael@0: TestScan() michael@0: { michael@0: TestScanSigned(); michael@0: TestScanUnsigned(); michael@0: } michael@0: michael@0: #endif /* SHOULD_TEST_SCANF_MACROS */ michael@0: michael@0: int michael@0: main() michael@0: { michael@0: TestPrint(); michael@0: #if SHOULD_TEST_SCANF_MACROS michael@0: TestScan(); michael@0: #endif michael@0: return 0; michael@0: }