mfbt/tests/TestIntegerPrintfMacros.cpp

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/mfbt/tests/TestIntegerPrintfMacros.cpp	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,1264 @@
     1.4 +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
     1.5 +/* This Source Code Form is subject to the terms of the Mozilla Public
     1.6 + * License, v. 2.0. If a copy of the MPL was not distributed with this file,
     1.7 + * You can obtain one at http://mozilla.org/MPL/2.0/. */
     1.8 +
     1.9 +#include "mozilla/Assertions.h"
    1.10 +#include "mozilla/IntegerPrintfMacros.h" // this must pick up <stdint.h>
    1.11 +
    1.12 +#include <stddef.h>
    1.13 +#include <stdio.h>
    1.14 +#include <string.h>
    1.15 +
    1.16 +/* Output array and poisoning method shared by all tests. */
    1.17 +static char output[32];
    1.18 +
    1.19 +static void
    1.20 +PoisonOutput()
    1.21 +{
    1.22 +  memset(output, 0xDA, sizeof(output));
    1.23 +}
    1.24 +
    1.25 +/*
    1.26 + * The fprintf macros for signed integers are:
    1.27 + *
    1.28 + *   PRIdN   PRIdLEASTN   PRIdFASTN   PRIdMAX   PRIdPTR
    1.29 + *   PRIiN   PRIiLEASTN   PRIiFASTN   PRIiMAX   PRIiPTR
    1.30 + *
    1.31 + * In these names N is the width of the type as described in C99 7.18.1.
    1.32 + */
    1.33 +
    1.34 +static void
    1.35 +TestPrintSigned8()
    1.36 +{
    1.37 +  PoisonOutput();
    1.38 +  sprintf(output, "%" PRId8, int8_t(-17));
    1.39 +  MOZ_RELEASE_ASSERT(!strcmp(output, "-17"));
    1.40 +
    1.41 +  PoisonOutput();
    1.42 +  sprintf(output, "%" PRIi8, int8_t(42));
    1.43 +  MOZ_RELEASE_ASSERT(!strcmp(output, "42"));
    1.44 +}
    1.45 +
    1.46 +static void
    1.47 +TestPrintSigned16()
    1.48 +{
    1.49 +  PoisonOutput();
    1.50 +  sprintf(output, "%" PRId16, int16_t(-289));
    1.51 +  MOZ_RELEASE_ASSERT(!strcmp(output, "-289"));
    1.52 +
    1.53 +  PoisonOutput();
    1.54 +  sprintf(output, "%" PRIi16, int16_t(728));
    1.55 +  MOZ_RELEASE_ASSERT(!strcmp(output, "728"));
    1.56 +}
    1.57 +
    1.58 +static void
    1.59 +TestPrintSigned32()
    1.60 +{
    1.61 +  PoisonOutput();
    1.62 +  sprintf(output, "%" PRId32, int32_t(-342178));
    1.63 +  MOZ_RELEASE_ASSERT(!strcmp(output, "-342178"));
    1.64 +
    1.65 +  PoisonOutput();
    1.66 +  sprintf(output, "%" PRIi32, int32_t(5719283));
    1.67 +  MOZ_RELEASE_ASSERT(!strcmp(output, "5719283"));
    1.68 +}
    1.69 +
    1.70 +static void
    1.71 +TestPrintSigned64()
    1.72 +{
    1.73 +  PoisonOutput();
    1.74 +  sprintf(output, "%" PRId64, int64_t(-INT64_C(432157943248732)));
    1.75 +  MOZ_RELEASE_ASSERT(!strcmp(output, "-432157943248732"));
    1.76 +
    1.77 +  PoisonOutput();
    1.78 +  sprintf(output, "%" PRIi64, int64_t(INT64_C(325719232983)));
    1.79 +  MOZ_RELEASE_ASSERT(!strcmp(output, "325719232983"));
    1.80 +}
    1.81 +
    1.82 +static void
    1.83 +TestPrintSignedN()
    1.84 +{
    1.85 +  TestPrintSigned8();
    1.86 +  TestPrintSigned16();
    1.87 +  TestPrintSigned32();
    1.88 +  TestPrintSigned64();
    1.89 +}
    1.90 +
    1.91 +static void
    1.92 +TestPrintSignedLeast8()
    1.93 +{
    1.94 +  PoisonOutput();
    1.95 +  sprintf(output, "%" PRIdLEAST8, int_least8_t(-17));
    1.96 +  MOZ_RELEASE_ASSERT(!strcmp(output, "-17"));
    1.97 +
    1.98 +  PoisonOutput();
    1.99 +  sprintf(output, "%" PRIiLEAST8, int_least8_t(42));
   1.100 +  MOZ_RELEASE_ASSERT(!strcmp(output, "42"));
   1.101 +}
   1.102 +
   1.103 +static void
   1.104 +TestPrintSignedLeast16()
   1.105 +{
   1.106 +  PoisonOutput();
   1.107 +  sprintf(output, "%" PRIdLEAST16, int_least16_t(-289));
   1.108 +  MOZ_RELEASE_ASSERT(!strcmp(output, "-289"));
   1.109 +
   1.110 +  PoisonOutput();
   1.111 +  sprintf(output, "%" PRIiLEAST16, int_least16_t(728));
   1.112 +  MOZ_RELEASE_ASSERT(!strcmp(output, "728"));
   1.113 +}
   1.114 +
   1.115 +static void
   1.116 +TestPrintSignedLeast32()
   1.117 +{
   1.118 +  PoisonOutput();
   1.119 +  sprintf(output, "%" PRIdLEAST32, int_least32_t(-342178));
   1.120 +  MOZ_RELEASE_ASSERT(!strcmp(output, "-342178"));
   1.121 +
   1.122 +  PoisonOutput();
   1.123 +  sprintf(output, "%" PRIiLEAST32, int_least32_t(5719283));
   1.124 +  MOZ_RELEASE_ASSERT(!strcmp(output, "5719283"));
   1.125 +}
   1.126 +
   1.127 +static void
   1.128 +TestPrintSignedLeast64()
   1.129 +{
   1.130 +  PoisonOutput();
   1.131 +  sprintf(output, "%" PRIdLEAST64, int_least64_t(-INT64_C(432157943248732)));
   1.132 +  MOZ_RELEASE_ASSERT(!strcmp(output, "-432157943248732"));
   1.133 +
   1.134 +  PoisonOutput();
   1.135 +  sprintf(output, "%" PRIiLEAST64, int_least64_t(INT64_C(325719232983)));
   1.136 +  MOZ_RELEASE_ASSERT(!strcmp(output, "325719232983"));
   1.137 +}
   1.138 +
   1.139 +static void
   1.140 +TestPrintSignedLeastN()
   1.141 +{
   1.142 +  TestPrintSignedLeast8();
   1.143 +  TestPrintSignedLeast16();
   1.144 +  TestPrintSignedLeast32();
   1.145 +  TestPrintSignedLeast64();
   1.146 +}
   1.147 +
   1.148 +static void
   1.149 +TestPrintSignedFast8()
   1.150 +{
   1.151 +  PoisonOutput();
   1.152 +  sprintf(output, "%" PRIdFAST8, int_fast8_t(-17));
   1.153 +  MOZ_RELEASE_ASSERT(!strcmp(output, "-17"));
   1.154 +
   1.155 +  PoisonOutput();
   1.156 +  sprintf(output, "%" PRIiFAST8, int_fast8_t(42));
   1.157 +  MOZ_RELEASE_ASSERT(!strcmp(output, "42"));
   1.158 +}
   1.159 +
   1.160 +static void
   1.161 +TestPrintSignedFast16()
   1.162 +{
   1.163 +  PoisonOutput();
   1.164 +  sprintf(output, "%" PRIdFAST16, int_fast16_t(-289));
   1.165 +  MOZ_RELEASE_ASSERT(!strcmp(output, "-289"));
   1.166 +
   1.167 +  PoisonOutput();
   1.168 +  sprintf(output, "%" PRIiFAST16, int_fast16_t(728));
   1.169 +  MOZ_RELEASE_ASSERT(!strcmp(output, "728"));
   1.170 +}
   1.171 +
   1.172 +static void
   1.173 +TestPrintSignedFast32()
   1.174 +{
   1.175 +  PoisonOutput();
   1.176 +  sprintf(output, "%" PRIdFAST32, int_fast32_t(-342178));
   1.177 +  MOZ_RELEASE_ASSERT(!strcmp(output, "-342178"));
   1.178 +
   1.179 +  PoisonOutput();
   1.180 +  sprintf(output, "%" PRIiFAST32, int_fast32_t(5719283));
   1.181 +  MOZ_RELEASE_ASSERT(!strcmp(output, "5719283"));
   1.182 +}
   1.183 +
   1.184 +static void
   1.185 +TestPrintSignedFast64()
   1.186 +{
   1.187 +  PoisonOutput();
   1.188 +  sprintf(output, "%" PRIdFAST64, int_fast64_t(-INT64_C(432157943248732)));
   1.189 +  MOZ_RELEASE_ASSERT(!strcmp(output, "-432157943248732"));
   1.190 +
   1.191 +  PoisonOutput();
   1.192 +  sprintf(output, "%" PRIiFAST64, int_fast64_t(INT64_C(325719232983)));
   1.193 +  MOZ_RELEASE_ASSERT(!strcmp(output, "325719232983"));
   1.194 +}
   1.195 +
   1.196 +static void
   1.197 +TestPrintSignedFastN()
   1.198 +{
   1.199 +  TestPrintSignedFast8();
   1.200 +  TestPrintSignedFast16();
   1.201 +  TestPrintSignedFast32();
   1.202 +  TestPrintSignedFast64();
   1.203 +}
   1.204 +
   1.205 +static void
   1.206 +TestPrintSignedMax()
   1.207 +{
   1.208 +  PoisonOutput();
   1.209 +  sprintf(output, "%" PRIdMAX, intmax_t(-INTMAX_C(432157943248732)));
   1.210 +  MOZ_RELEASE_ASSERT(!strcmp(output, "-432157943248732"));
   1.211 +
   1.212 +  PoisonOutput();
   1.213 +  sprintf(output, "%" PRIiMAX, intmax_t(INTMAX_C(325719232983)));
   1.214 +  MOZ_RELEASE_ASSERT(!strcmp(output, "325719232983"));
   1.215 +}
   1.216 +
   1.217 +static void
   1.218 +TestPrintSignedPtr()
   1.219 +{
   1.220 +  PoisonOutput();
   1.221 +  sprintf(output, "%" PRIdPTR, intptr_t(reinterpret_cast<void*>(12345678)));
   1.222 +  MOZ_RELEASE_ASSERT(!strcmp(output, "12345678"));
   1.223 +
   1.224 +  PoisonOutput();
   1.225 +  sprintf(output, "%" PRIiPTR, intptr_t(reinterpret_cast<void*>(87654321)));
   1.226 +  MOZ_RELEASE_ASSERT(!strcmp(output, "87654321"));
   1.227 +}
   1.228 +
   1.229 +static void
   1.230 +TestPrintSigned()
   1.231 +{
   1.232 +  TestPrintSignedN();
   1.233 +  TestPrintSignedLeastN();
   1.234 +  TestPrintSignedFastN();
   1.235 +  TestPrintSignedMax();
   1.236 +  TestPrintSignedPtr();
   1.237 +}
   1.238 +
   1.239 +/*
   1.240 + * The fprintf macros for unsigned integers are:
   1.241 + *
   1.242 + *   PRIoN   PRIoLEASTN   PRIoFASTN   PRIoMAX   PRIoPTR
   1.243 + *   PRIuN   PRIuLEASTN   PRIuFASTN   PRIuMAX   PRIuPTR
   1.244 + *   PRIxN   PRIxLEASTN   PRIxFASTN   PRIxMAX   PRIxPTR
   1.245 + *   PRIXN   PRIXLEASTN   PRIXFASTN   PRIXMAX   PRIXPTR
   1.246 + *
   1.247 + * In these names N is the width of the type as described in C99 7.18.1.
   1.248 + */
   1.249 +
   1.250 +static void
   1.251 +TestPrintUnsigned8()
   1.252 +{
   1.253 +  PoisonOutput();
   1.254 +  sprintf(output, "%" PRIo8, uint8_t(042));
   1.255 +  MOZ_RELEASE_ASSERT(!strcmp(output, "42"));
   1.256 +
   1.257 +  PoisonOutput();
   1.258 +  sprintf(output, "%" PRIu8, uint8_t(17));
   1.259 +  MOZ_RELEASE_ASSERT(!strcmp(output, "17"));
   1.260 +
   1.261 +  PoisonOutput();
   1.262 +  sprintf(output, "%" PRIx8, uint8_t(0x2a));
   1.263 +  MOZ_RELEASE_ASSERT(!strcmp(output, "2a"));
   1.264 +
   1.265 +  PoisonOutput();
   1.266 +  sprintf(output, "%" PRIX8, uint8_t(0xCD));
   1.267 +  MOZ_RELEASE_ASSERT(!strcmp(output, "CD"));
   1.268 +}
   1.269 +
   1.270 +static void
   1.271 +TestPrintUnsigned16()
   1.272 +{
   1.273 +  PoisonOutput();
   1.274 +  sprintf(output, "%" PRIo16, uint16_t(04242));
   1.275 +  MOZ_RELEASE_ASSERT(!strcmp(output, "4242"));
   1.276 +
   1.277 +  PoisonOutput();
   1.278 +  sprintf(output, "%" PRIu16, uint16_t(1717));
   1.279 +  MOZ_RELEASE_ASSERT(!strcmp(output, "1717"));
   1.280 +
   1.281 +  PoisonOutput();
   1.282 +  sprintf(output, "%" PRIx16, uint16_t(0x2a2a));
   1.283 +  MOZ_RELEASE_ASSERT(!strcmp(output, "2a2a"));
   1.284 +
   1.285 +  PoisonOutput();
   1.286 +  sprintf(output, "%" PRIX16, uint16_t(0xCDCD));
   1.287 +  MOZ_RELEASE_ASSERT(!strcmp(output, "CDCD"));
   1.288 +}
   1.289 +
   1.290 +static void
   1.291 +TestPrintUnsigned32()
   1.292 +{
   1.293 +  PoisonOutput();
   1.294 +  sprintf(output, "%" PRIo32, uint32_t(0424242));
   1.295 +  MOZ_RELEASE_ASSERT(!strcmp(output, "424242"));
   1.296 +
   1.297 +  PoisonOutput();
   1.298 +  sprintf(output, "%" PRIu32, uint32_t(171717));
   1.299 +  MOZ_RELEASE_ASSERT(!strcmp(output, "171717"));
   1.300 +
   1.301 +  PoisonOutput();
   1.302 +  sprintf(output, "%" PRIx32, uint32_t(0x2a2a2a));
   1.303 +  MOZ_RELEASE_ASSERT(!strcmp(output, "2a2a2a"));
   1.304 +
   1.305 +  PoisonOutput();
   1.306 +  sprintf(output, "%" PRIX32, uint32_t(0xCDCDCD));
   1.307 +  MOZ_RELEASE_ASSERT(!strcmp(output, "CDCDCD"));
   1.308 +}
   1.309 +
   1.310 +static void
   1.311 +TestPrintUnsigned64()
   1.312 +{
   1.313 +  PoisonOutput();
   1.314 +  sprintf(output, "%" PRIo64, uint64_t(UINT64_C(0424242424242)));
   1.315 +  MOZ_RELEASE_ASSERT(!strcmp(output, "424242424242"));
   1.316 +
   1.317 +  PoisonOutput();
   1.318 +  sprintf(output, "%" PRIu64, uint64_t(UINT64_C(17171717171717171717)));
   1.319 +  MOZ_RELEASE_ASSERT(!strcmp(output, "17171717171717171717"));
   1.320 +
   1.321 +  PoisonOutput();
   1.322 +  sprintf(output, "%" PRIx64, uint64_t(UINT64_C(0x2a2a2a2a2a2a2a)));
   1.323 +  MOZ_RELEASE_ASSERT(!strcmp(output, "2a2a2a2a2a2a2a"));
   1.324 +
   1.325 +  PoisonOutput();
   1.326 +  sprintf(output, "%" PRIX64, uint64_t(UINT64_C(0xCDCDCDCDCDCD)));
   1.327 +  MOZ_RELEASE_ASSERT(!strcmp(output, "CDCDCDCDCDCD"));
   1.328 +}
   1.329 +
   1.330 +static void
   1.331 +TestPrintUnsignedN()
   1.332 +{
   1.333 +  TestPrintUnsigned8();
   1.334 +  TestPrintUnsigned16();
   1.335 +  TestPrintUnsigned32();
   1.336 +  TestPrintUnsigned64();
   1.337 +}
   1.338 +
   1.339 +static void
   1.340 +TestPrintUnsignedLeast8()
   1.341 +{
   1.342 +  PoisonOutput();
   1.343 +  sprintf(output, "%" PRIoLEAST8, uint_least8_t(042));
   1.344 +  MOZ_RELEASE_ASSERT(!strcmp(output, "42"));
   1.345 +
   1.346 +  PoisonOutput();
   1.347 +  sprintf(output, "%" PRIuLEAST8, uint_least8_t(17));
   1.348 +  MOZ_RELEASE_ASSERT(!strcmp(output, "17"));
   1.349 +
   1.350 +  PoisonOutput();
   1.351 +  sprintf(output, "%" PRIxLEAST8, uint_least8_t(0x2a));
   1.352 +  MOZ_RELEASE_ASSERT(!strcmp(output, "2a"));
   1.353 +
   1.354 +  PoisonOutput();
   1.355 +  sprintf(output, "%" PRIXLEAST8, uint_least8_t(0xCD));
   1.356 +  MOZ_RELEASE_ASSERT(!strcmp(output, "CD"));
   1.357 +}
   1.358 +
   1.359 +static void
   1.360 +TestPrintUnsignedLeast16()
   1.361 +{
   1.362 +  PoisonOutput();
   1.363 +  sprintf(output, "%" PRIoLEAST16, uint_least16_t(04242));
   1.364 +  MOZ_RELEASE_ASSERT(!strcmp(output, "4242"));
   1.365 +
   1.366 +  PoisonOutput();
   1.367 +  sprintf(output, "%" PRIuLEAST16, uint_least16_t(1717));
   1.368 +  MOZ_RELEASE_ASSERT(!strcmp(output, "1717"));
   1.369 +
   1.370 +  PoisonOutput();
   1.371 +  sprintf(output, "%" PRIxLEAST16, uint_least16_t(0x2a2a));
   1.372 +  MOZ_RELEASE_ASSERT(!strcmp(output, "2a2a"));
   1.373 +
   1.374 +  PoisonOutput();
   1.375 +  sprintf(output, "%" PRIXLEAST16, uint_least16_t(0xCDCD));
   1.376 +  MOZ_RELEASE_ASSERT(!strcmp(output, "CDCD"));
   1.377 +}
   1.378 +
   1.379 +static void
   1.380 +TestPrintUnsignedLeast32()
   1.381 +{
   1.382 +  PoisonOutput();
   1.383 +  sprintf(output, "%" PRIoLEAST32, uint_least32_t(0424242));
   1.384 +  MOZ_RELEASE_ASSERT(!strcmp(output, "424242"));
   1.385 +
   1.386 +  PoisonOutput();
   1.387 +  sprintf(output, "%" PRIuLEAST32, uint_least32_t(171717));
   1.388 +  MOZ_RELEASE_ASSERT(!strcmp(output, "171717"));
   1.389 +
   1.390 +  PoisonOutput();
   1.391 +  sprintf(output, "%" PRIxLEAST32, uint_least32_t(0x2a2a2a));
   1.392 +  MOZ_RELEASE_ASSERT(!strcmp(output, "2a2a2a"));
   1.393 +
   1.394 +  PoisonOutput();
   1.395 +  sprintf(output, "%" PRIXLEAST32, uint_least32_t(0xCDCDCD));
   1.396 +  MOZ_RELEASE_ASSERT(!strcmp(output, "CDCDCD"));
   1.397 +}
   1.398 +
   1.399 +static void
   1.400 +TestPrintUnsignedLeast64()
   1.401 +{
   1.402 +  PoisonOutput();
   1.403 +  sprintf(output, "%" PRIoLEAST64, uint_least64_t(UINT64_C(0424242424242)));
   1.404 +  MOZ_RELEASE_ASSERT(!strcmp(output, "424242424242"));
   1.405 +
   1.406 +  PoisonOutput();
   1.407 +  sprintf(output, "%" PRIuLEAST64, uint_least64_t(UINT64_C(17171717171717171717)));
   1.408 +  MOZ_RELEASE_ASSERT(!strcmp(output, "17171717171717171717"));
   1.409 +
   1.410 +  PoisonOutput();
   1.411 +  sprintf(output, "%" PRIxLEAST64, uint_least64_t(UINT64_C(0x2a2a2a2a2a2a2a)));
   1.412 +  MOZ_RELEASE_ASSERT(!strcmp(output, "2a2a2a2a2a2a2a"));
   1.413 +
   1.414 +  PoisonOutput();
   1.415 +  sprintf(output, "%" PRIXLEAST64, uint_least64_t(UINT64_C(0xCDCDCDCDCDCD)));
   1.416 +  MOZ_RELEASE_ASSERT(!strcmp(output, "CDCDCDCDCDCD"));
   1.417 +}
   1.418 +
   1.419 +static void
   1.420 +TestPrintUnsignedLeastN()
   1.421 +{
   1.422 +  TestPrintUnsignedLeast8();
   1.423 +  TestPrintUnsignedLeast16();
   1.424 +  TestPrintUnsignedLeast32();
   1.425 +  TestPrintUnsignedLeast64();
   1.426 +}
   1.427 +
   1.428 +static void
   1.429 +TestPrintUnsignedFast8()
   1.430 +{
   1.431 +  PoisonOutput();
   1.432 +  sprintf(output, "%" PRIoFAST8, uint_fast8_t(042));
   1.433 +  MOZ_RELEASE_ASSERT(!strcmp(output, "42"));
   1.434 +
   1.435 +  PoisonOutput();
   1.436 +  sprintf(output, "%" PRIuFAST8, uint_fast8_t(17));
   1.437 +  MOZ_RELEASE_ASSERT(!strcmp(output, "17"));
   1.438 +
   1.439 +  PoisonOutput();
   1.440 +  sprintf(output, "%" PRIxFAST8, uint_fast8_t(0x2a));
   1.441 +  MOZ_RELEASE_ASSERT(!strcmp(output, "2a"));
   1.442 +
   1.443 +  PoisonOutput();
   1.444 +  sprintf(output, "%" PRIXFAST8, uint_fast8_t(0xCD));
   1.445 +  MOZ_RELEASE_ASSERT(!strcmp(output, "CD"));
   1.446 +}
   1.447 +
   1.448 +static void
   1.449 +TestPrintUnsignedFast16()
   1.450 +{
   1.451 +  PoisonOutput();
   1.452 +  sprintf(output, "%" PRIoFAST16, uint_fast16_t(04242));
   1.453 +  MOZ_RELEASE_ASSERT(!strcmp(output, "4242"));
   1.454 +
   1.455 +  PoisonOutput();
   1.456 +  sprintf(output, "%" PRIuFAST16, uint_fast16_t(1717));
   1.457 +  MOZ_RELEASE_ASSERT(!strcmp(output, "1717"));
   1.458 +
   1.459 +  PoisonOutput();
   1.460 +  sprintf(output, "%" PRIxFAST16, uint_fast16_t(0x2a2a));
   1.461 +  MOZ_RELEASE_ASSERT(!strcmp(output, "2a2a"));
   1.462 +
   1.463 +  PoisonOutput();
   1.464 +  sprintf(output, "%" PRIXFAST16, uint_fast16_t(0xCDCD));
   1.465 +  MOZ_RELEASE_ASSERT(!strcmp(output, "CDCD"));
   1.466 +}
   1.467 +
   1.468 +static void
   1.469 +TestPrintUnsignedFast32()
   1.470 +{
   1.471 +  PoisonOutput();
   1.472 +  sprintf(output, "%" PRIoFAST32, uint_fast32_t(0424242));
   1.473 +  MOZ_RELEASE_ASSERT(!strcmp(output, "424242"));
   1.474 +
   1.475 +  PoisonOutput();
   1.476 +  sprintf(output, "%" PRIuFAST32, uint_fast32_t(171717));
   1.477 +  MOZ_RELEASE_ASSERT(!strcmp(output, "171717"));
   1.478 +
   1.479 +  PoisonOutput();
   1.480 +  sprintf(output, "%" PRIxFAST32, uint_fast32_t(0x2a2a2a));
   1.481 +  MOZ_RELEASE_ASSERT(!strcmp(output, "2a2a2a"));
   1.482 +
   1.483 +  PoisonOutput();
   1.484 +  sprintf(output, "%" PRIXFAST32, uint_fast32_t(0xCDCDCD));
   1.485 +  MOZ_RELEASE_ASSERT(!strcmp(output, "CDCDCD"));
   1.486 +}
   1.487 +
   1.488 +static void
   1.489 +TestPrintUnsignedFast64()
   1.490 +{
   1.491 +  PoisonOutput();
   1.492 +  sprintf(output, "%" PRIoFAST64, uint_fast64_t(UINT64_C(0424242424242)));
   1.493 +  MOZ_RELEASE_ASSERT(!strcmp(output, "424242424242"));
   1.494 +
   1.495 +  PoisonOutput();
   1.496 +  sprintf(output, "%" PRIuFAST64, uint_fast64_t(UINT64_C(17171717171717171717)));
   1.497 +  MOZ_RELEASE_ASSERT(!strcmp(output, "17171717171717171717"));
   1.498 +
   1.499 +  PoisonOutput();
   1.500 +  sprintf(output, "%" PRIxFAST64, uint_fast64_t(UINT64_C(0x2a2a2a2a2a2a2a)));
   1.501 +  MOZ_RELEASE_ASSERT(!strcmp(output, "2a2a2a2a2a2a2a"));
   1.502 +
   1.503 +  PoisonOutput();
   1.504 +  sprintf(output, "%" PRIXFAST64, uint_fast64_t(UINT64_C(0xCDCDCDCDCDCD)));
   1.505 +  MOZ_RELEASE_ASSERT(!strcmp(output, "CDCDCDCDCDCD"));
   1.506 +}
   1.507 +
   1.508 +static void
   1.509 +TestPrintUnsignedFastN()
   1.510 +{
   1.511 +  TestPrintUnsignedFast8();
   1.512 +  TestPrintUnsignedFast16();
   1.513 +  TestPrintUnsignedFast32();
   1.514 +  TestPrintUnsignedFast64();
   1.515 +}
   1.516 +
   1.517 +static void
   1.518 +TestPrintUnsignedMax()
   1.519 +{
   1.520 +  PoisonOutput();
   1.521 +  sprintf(output, "%" PRIoMAX, uintmax_t(UINTMAX_C(432157943248732)));
   1.522 +  MOZ_RELEASE_ASSERT(!strcmp(output, "14220563454333534"));
   1.523 +
   1.524 +  PoisonOutput();
   1.525 +  sprintf(output, "%" PRIuMAX, uintmax_t(UINTMAX_C(325719232983)));
   1.526 +  MOZ_RELEASE_ASSERT(!strcmp(output, "325719232983"));
   1.527 +
   1.528 +  PoisonOutput();
   1.529 +  sprintf(output, "%" PRIxMAX, uintmax_t(UINTMAX_C(327281321873)));
   1.530 +  MOZ_RELEASE_ASSERT(!strcmp(output, "4c337ca791"));
   1.531 +
   1.532 +  PoisonOutput();
   1.533 +  sprintf(output, "%" PRIXMAX, uintmax_t(UINTMAX_C(912389523743523)));
   1.534 +  MOZ_RELEASE_ASSERT(!strcmp(output, "33DD03D75A323"));
   1.535 +}
   1.536 +
   1.537 +static void
   1.538 +TestPrintUnsignedPtr()
   1.539 +{
   1.540 +  PoisonOutput();
   1.541 +  sprintf(output, "%" PRIoPTR, uintptr_t(reinterpret_cast<void*>(12345678)));
   1.542 +  MOZ_RELEASE_ASSERT(!strcmp(output, "57060516"));
   1.543 +
   1.544 +  PoisonOutput();
   1.545 +  sprintf(output, "%" PRIuPTR, uintptr_t(reinterpret_cast<void*>(87654321)));
   1.546 +  MOZ_RELEASE_ASSERT(!strcmp(output, "87654321"));
   1.547 +
   1.548 +  PoisonOutput();
   1.549 +  sprintf(output, "%" PRIxPTR, uintptr_t(reinterpret_cast<void*>(0x4c3a791)));
   1.550 +  MOZ_RELEASE_ASSERT(!strcmp(output, "4c3a791"));
   1.551 +
   1.552 +  PoisonOutput();
   1.553 +  sprintf(output, "%" PRIXPTR, uintptr_t(reinterpret_cast<void*>(0xF328DB)));
   1.554 +  MOZ_RELEASE_ASSERT(!strcmp(output, "F328DB"));
   1.555 +}
   1.556 +
   1.557 +static void
   1.558 +TestPrintUnsigned()
   1.559 +{
   1.560 +  TestPrintUnsignedN();
   1.561 +  TestPrintUnsignedLeastN();
   1.562 +  TestPrintUnsignedFastN();
   1.563 +  TestPrintUnsignedMax();
   1.564 +  TestPrintUnsignedPtr();
   1.565 +}
   1.566 +
   1.567 +static void
   1.568 +TestPrint()
   1.569 +{
   1.570 +  TestPrintSigned();
   1.571 +  TestPrintUnsigned();
   1.572 +}
   1.573 +
   1.574 +/*
   1.575 + * The fscanf macros for signed integers are:
   1.576 + *
   1.577 + *   SCNdN   SCNdLEASTN   SCNdFASTN   SCNdMAX   SCNdPTR
   1.578 + *   SCNiN   SCNiLEASTN   SCNiFASTN   SCNiMAX   SCNiPTR
   1.579 + *
   1.580 + * In these names N is the width of the type as described in C99 7.18.1.
   1.581 + */
   1.582 +
   1.583 +/*
   1.584 + * MSVC's scanf is insufficiently powerful to implement all the SCN* macros.
   1.585 + * Rather than support some subset of them, we instead support none of them.
   1.586 + * See the comment at the top of IntegerPrintfMacros.h.  But in case we ever do
   1.587 + * support them, the following tests should adequately test implementation
   1.588 + * correctness.  (Indeed, these tests *revealed* MSVC's limitations.)
   1.589 + *
   1.590 + * That said, even if MSVC ever picks up complete support, we still probably
   1.591 + * don't want to support these, because of the undefined-behavior issue noted
   1.592 + * further down in the comment atop IntegerPrintfMacros.h.
   1.593 + */
   1.594 +#define SHOULD_TEST_SCANF_MACROS 0
   1.595 +
   1.596 +#if SHOULD_TEST_SCANF_MACROS
   1.597 +
   1.598 +/*
   1.599 + * glibc header definitions for SCN{d,i,o,u,x}{,LEAST,FAST}8 use the "hh" length
   1.600 + * modifier, which is new in C99 (and C++11, by reference).  We compile this
   1.601 + * file as C++11, so if "hh" is used in these macros, it's standard.  But some
   1.602 + * versions of gcc wrongly think it isn't and warn about a "non-standard"
   1.603 + * modifier.  And since these tests mostly exist to verify format-macro/type
   1.604 + * consistency (particularly through compiler warnings about incorrect formats),
   1.605 + * these warnings are unacceptable.  So for now, compile tests for those macros
   1.606 + * only if we aren't compiling with gcc.
   1.607 + */
   1.608 +#define SHOULD_TEST_8BIT_FORMAT_MACROS (!(MOZ_IS_GCC))
   1.609 +
   1.610 +template<typename T>
   1.611 +union Input
   1.612 +{
   1.613 +    T i;
   1.614 +    unsigned char pun[16];
   1.615 +};
   1.616 +
   1.617 +template<typename T>
   1.618 +static void
   1.619 +PoisonInput(Input<T>& input)
   1.620 +{
   1.621 +    memset(input.pun, 0xDA, sizeof(input.pun));
   1.622 +}
   1.623 +
   1.624 +template<typename T>
   1.625 +static bool
   1.626 +ExtraBitsUntouched(const Input<T>& input)
   1.627 +{
   1.628 +  for (size_t i = sizeof(input.i); i < sizeof(input); i++) {
   1.629 +    if (input.pun[i] != 0xDA)
   1.630 +      return false;
   1.631 +  }
   1.632 +
   1.633 +  return true;
   1.634 +}
   1.635 +
   1.636 +static void
   1.637 +TestScanSigned8()
   1.638 +{
   1.639 +#if SHOULD_TEST_8BIT_FORMAT_MACROS
   1.640 +  Input<int8_t> u;
   1.641 +
   1.642 +  PoisonInput(u);
   1.643 +  sscanf("-17", "%" SCNd8, &u.i);
   1.644 +  MOZ_RELEASE_ASSERT(u.i == -17);
   1.645 +  MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u));
   1.646 +
   1.647 +  PoisonInput(u);
   1.648 +  sscanf("042", "%" SCNi8, &u.i);
   1.649 +  MOZ_RELEASE_ASSERT(u.i == 042);
   1.650 +  MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u));
   1.651 +#endif
   1.652 +}
   1.653 +
   1.654 +static void
   1.655 +TestScanSigned16()
   1.656 +{
   1.657 +  Input<int16_t> u;
   1.658 +
   1.659 +  PoisonInput(u);
   1.660 +  sscanf("-1742", "%" SCNd16, &u.i);
   1.661 +  MOZ_RELEASE_ASSERT(u.i == -1742);
   1.662 +  MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u));
   1.663 +
   1.664 +  PoisonInput(u);
   1.665 +  sscanf("04217", "%" SCNi16, &u.i);
   1.666 +  MOZ_RELEASE_ASSERT(u.i == 04217);
   1.667 +  MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u));
   1.668 +}
   1.669 +
   1.670 +static void
   1.671 +TestScanSigned32()
   1.672 +{
   1.673 +  Input<int32_t> u;
   1.674 +
   1.675 +  PoisonInput(u);
   1.676 +  sscanf("-174257", "%" SCNd32, &u.i);
   1.677 +  MOZ_RELEASE_ASSERT(u.i == -174257);
   1.678 +  MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u));
   1.679 +
   1.680 +  PoisonInput(u);
   1.681 +  sscanf("0423571", "%" SCNi32, &u.i);
   1.682 +  MOZ_RELEASE_ASSERT(u.i == 0423571);
   1.683 +  MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u));
   1.684 +}
   1.685 +
   1.686 +static void
   1.687 +TestScanSigned64()
   1.688 +{
   1.689 +  Input<int64_t> u;
   1.690 +
   1.691 +  PoisonInput(u);
   1.692 +  sscanf("-17425238927232", "%" SCNd64, &u.i);
   1.693 +  MOZ_RELEASE_ASSERT(u.i == -INT64_C(17425238927232));
   1.694 +  MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u));
   1.695 +
   1.696 +  PoisonInput(u);
   1.697 +  sscanf("042333576571", "%" SCNi64, &u.i);
   1.698 +  MOZ_RELEASE_ASSERT(u.i == INT64_C(042333576571));
   1.699 +  MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u));
   1.700 +}
   1.701 +
   1.702 +static void
   1.703 +TestScanSignedN()
   1.704 +{
   1.705 +  TestScanSigned8();
   1.706 +  TestScanSigned16();
   1.707 +  TestScanSigned32();
   1.708 +  TestScanSigned64();
   1.709 +}
   1.710 +
   1.711 +static void
   1.712 +TestScanSignedLeast8()
   1.713 +{
   1.714 +#if SHOULD_TEST_8BIT_FORMAT_MACROS
   1.715 +  Input<int_least8_t> u;
   1.716 +
   1.717 +  PoisonInput(u);
   1.718 +  sscanf("-17", "%" SCNdLEAST8, &u.i);
   1.719 +  MOZ_RELEASE_ASSERT(u.i == -17);
   1.720 +  MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u));
   1.721 +
   1.722 +  PoisonInput(u);
   1.723 +  sscanf("042", "%" SCNiLEAST8, &u.i);
   1.724 +  MOZ_RELEASE_ASSERT(u.i == 042);
   1.725 +  MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u));
   1.726 +#endif
   1.727 +}
   1.728 +
   1.729 +static void
   1.730 +TestScanSignedLeast16()
   1.731 +{
   1.732 +  Input<int_least16_t> u;
   1.733 +
   1.734 +  PoisonInput(u);
   1.735 +  sscanf("-1742", "%" SCNdLEAST16, &u.i);
   1.736 +  MOZ_RELEASE_ASSERT(u.i == -1742);
   1.737 +  MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u));
   1.738 +
   1.739 +  PoisonInput(u);
   1.740 +  sscanf("04217", "%" SCNiLEAST16, &u.i);
   1.741 +  MOZ_RELEASE_ASSERT(u.i == 04217);
   1.742 +  MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u));
   1.743 +}
   1.744 +
   1.745 +static void
   1.746 +TestScanSignedLeast32()
   1.747 +{
   1.748 +  Input<int_least32_t> u;
   1.749 +
   1.750 +  PoisonInput(u);
   1.751 +  sscanf("-174257", "%" SCNdLEAST32, &u.i);
   1.752 +  MOZ_RELEASE_ASSERT(u.i == -174257);
   1.753 +  MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u));
   1.754 +
   1.755 +  PoisonInput(u);
   1.756 +  sscanf("0423571", "%" SCNiLEAST32, &u.i);
   1.757 +  MOZ_RELEASE_ASSERT(u.i == 0423571);
   1.758 +  MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u));
   1.759 +}
   1.760 +
   1.761 +static void
   1.762 +TestScanSignedLeast64()
   1.763 +{
   1.764 +  Input<int_least64_t> u;
   1.765 +
   1.766 +  PoisonInput(u);
   1.767 +  sscanf("-17425238927232", "%" SCNdLEAST64, &u.i);
   1.768 +  MOZ_RELEASE_ASSERT(u.i == -INT64_C(17425238927232));
   1.769 +  MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u));
   1.770 +
   1.771 +  PoisonInput(u);
   1.772 +  sscanf("042333576571", "%" SCNiLEAST64, &u.i);
   1.773 +  MOZ_RELEASE_ASSERT(u.i == INT64_C(042333576571));
   1.774 +  MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u));
   1.775 +}
   1.776 +
   1.777 +static void
   1.778 +TestScanSignedLeastN()
   1.779 +{
   1.780 +  TestScanSignedLeast8();
   1.781 +  TestScanSignedLeast16();
   1.782 +  TestScanSignedLeast32();
   1.783 +  TestScanSignedLeast64();
   1.784 +}
   1.785 +
   1.786 +static void
   1.787 +TestScanSignedFast8()
   1.788 +{
   1.789 +#if SHOULD_TEST_8BIT_FORMAT_MACROS
   1.790 +  Input<int_fast8_t> u;
   1.791 +
   1.792 +  PoisonInput(u);
   1.793 +  sscanf("-17", "%" SCNdFAST8, &u.i);
   1.794 +  MOZ_RELEASE_ASSERT(u.i == -17);
   1.795 +  MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u));
   1.796 +
   1.797 +  PoisonInput(u);
   1.798 +  sscanf("042", "%" SCNiFAST8, &u.i);
   1.799 +  MOZ_RELEASE_ASSERT(u.i == 042);
   1.800 +  MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u));
   1.801 +#endif
   1.802 +}
   1.803 +
   1.804 +static void
   1.805 +TestScanSignedFast16()
   1.806 +{
   1.807 +  Input<int_fast16_t> u;
   1.808 +
   1.809 +  PoisonInput(u);
   1.810 +  sscanf("-1742", "%" SCNdFAST16, &u.i);
   1.811 +  MOZ_RELEASE_ASSERT(u.i == -1742);
   1.812 +  MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u));
   1.813 +
   1.814 +  PoisonInput(u);
   1.815 +  sscanf("04217", "%" SCNiFAST16, &u.i);
   1.816 +  MOZ_RELEASE_ASSERT(u.i == 04217);
   1.817 +  MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u));
   1.818 +}
   1.819 +
   1.820 +static void
   1.821 +TestScanSignedFast32()
   1.822 +{
   1.823 +  Input<int_fast32_t> u;
   1.824 +
   1.825 +  PoisonInput(u);
   1.826 +  sscanf("-174257", "%" SCNdFAST32, &u.i);
   1.827 +  MOZ_RELEASE_ASSERT(u.i == -174257);
   1.828 +  MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u));
   1.829 +
   1.830 +  PoisonInput(u);
   1.831 +  sscanf("0423571", "%" SCNiFAST32, &u.i);
   1.832 +  MOZ_RELEASE_ASSERT(u.i == 0423571);
   1.833 +  MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u));
   1.834 +}
   1.835 +
   1.836 +static void
   1.837 +TestScanSignedFast64()
   1.838 +{
   1.839 +  Input<int_fast64_t> u;
   1.840 +
   1.841 +  PoisonInput(u);
   1.842 +  sscanf("-17425238927232", "%" SCNdFAST64, &u.i);
   1.843 +  MOZ_RELEASE_ASSERT(u.i == -INT64_C(17425238927232));
   1.844 +  MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u));
   1.845 +
   1.846 +  PoisonInput(u);
   1.847 +  sscanf("042333576571", "%" SCNiFAST64, &u.i);
   1.848 +  MOZ_RELEASE_ASSERT(u.i == INT64_C(042333576571));
   1.849 +  MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u));
   1.850 +}
   1.851 +
   1.852 +static void
   1.853 +TestScanSignedFastN()
   1.854 +{
   1.855 +  TestScanSignedFast8();
   1.856 +  TestScanSignedFast16();
   1.857 +  TestScanSignedFast32();
   1.858 +  TestScanSignedFast64();
   1.859 +}
   1.860 +
   1.861 +static void
   1.862 +TestScanSignedMax()
   1.863 +{
   1.864 +  Input<intmax_t> u;
   1.865 +
   1.866 +  PoisonInput(u);
   1.867 +  sscanf("-432157943248732", "%" SCNdMAX, &u.i);
   1.868 +  MOZ_RELEASE_ASSERT(u.i == -INTMAX_C(432157943248732));
   1.869 +  MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u));
   1.870 +
   1.871 +  PoisonInput(u);
   1.872 +  sscanf("04233357236571", "%" SCNiMAX, &u.i);
   1.873 +  MOZ_RELEASE_ASSERT(u.i == INTMAX_C(04233357236571));
   1.874 +  MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u));
   1.875 +}
   1.876 +
   1.877 +static void
   1.878 +TestScanSignedPtr()
   1.879 +{
   1.880 +  Input<intptr_t> u;
   1.881 +
   1.882 +  PoisonInput(u);
   1.883 +  sscanf("12345678", "%" SCNdPTR, &u.i);
   1.884 +  MOZ_RELEASE_ASSERT(u.i == intptr_t(reinterpret_cast<void*>(12345678)));
   1.885 +  MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u));
   1.886 +
   1.887 +  PoisonInput(u);
   1.888 +  sscanf("04233357236", "%" SCNiPTR, &u.i);
   1.889 +  MOZ_RELEASE_ASSERT(u.i == intptr_t(reinterpret_cast<void*>(04233357236)));
   1.890 +  MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u));
   1.891 +}
   1.892 +
   1.893 +static void
   1.894 +TestScanSigned()
   1.895 +{
   1.896 +  TestScanSignedN();
   1.897 +  TestScanSignedLeastN();
   1.898 +  TestScanSignedFastN();
   1.899 +  TestScanSignedMax();
   1.900 +  TestScanSignedPtr();
   1.901 +}
   1.902 +
   1.903 +/*
   1.904 + * The fscanf macros for unsigned integers are:
   1.905 + *
   1.906 + *   SCNoN   SCNoLEASTN   SCNoFASTN   SCNoMAX   SCNoPTR
   1.907 + *   SCNuN   SCNuLEASTN   SCNuFASTN   SCNuMAX   SCNuPTR
   1.908 + *   SCNxN   SCNxLEASTN   SCNxFASTN   SCNxMAX   SCNxPTR
   1.909 + *
   1.910 + * In these names N is the width of the type as described in C99 7.18.1.
   1.911 + */
   1.912 +
   1.913 +static void
   1.914 +TestScanUnsigned8()
   1.915 +{
   1.916 +#if SHOULD_TEST_8BIT_FORMAT_MACROS
   1.917 +  Input<uint8_t> u;
   1.918 +
   1.919 +  PoisonInput(u);
   1.920 +  sscanf("17", "%" SCNo8, &u.i);
   1.921 +  MOZ_RELEASE_ASSERT(u.i == 017);
   1.922 +  MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u));
   1.923 +
   1.924 +  PoisonInput(u);
   1.925 +  sscanf("42", "%" SCNu8, &u.i);
   1.926 +  MOZ_RELEASE_ASSERT(u.i == 42);
   1.927 +  MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u));
   1.928 +
   1.929 +  PoisonInput(u);
   1.930 +  sscanf("2A", "%" SCNx8, &u.i);
   1.931 +  MOZ_RELEASE_ASSERT(u.i == 0x2A);
   1.932 +  MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u));
   1.933 +#endif
   1.934 +}
   1.935 +
   1.936 +static void
   1.937 +TestScanUnsigned16()
   1.938 +{
   1.939 +  Input<uint16_t> u;
   1.940 +
   1.941 +  PoisonInput(u);
   1.942 +  sscanf("1742", "%" SCNo16, &u.i);
   1.943 +  MOZ_RELEASE_ASSERT(u.i == 01742);
   1.944 +  MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u));
   1.945 +
   1.946 +  PoisonInput(u);
   1.947 +  sscanf("4217", "%" SCNu16, &u.i);
   1.948 +  MOZ_RELEASE_ASSERT(u.i == 4217);
   1.949 +  MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u));
   1.950 +
   1.951 +  PoisonInput(u);
   1.952 +  sscanf("2ABC", "%" SCNx16, &u.i);
   1.953 +  MOZ_RELEASE_ASSERT(u.i == 0x2ABC);
   1.954 +  MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u));
   1.955 +}
   1.956 +
   1.957 +static void
   1.958 +TestScanUnsigned32()
   1.959 +{
   1.960 +  Input<uint32_t> u;
   1.961 +
   1.962 +  PoisonInput(u);
   1.963 +  sscanf("17421742", "%" SCNo32, &u.i);
   1.964 +  MOZ_RELEASE_ASSERT(u.i == 017421742);
   1.965 +  MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u));
   1.966 +
   1.967 +  PoisonInput(u);
   1.968 +  sscanf("4217867", "%" SCNu32, &u.i);
   1.969 +  MOZ_RELEASE_ASSERT(u.i == 4217867);
   1.970 +  MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u));
   1.971 +
   1.972 +  PoisonInput(u);
   1.973 +  sscanf("2ABCBEEF", "%" SCNx32, &u.i);
   1.974 +  MOZ_RELEASE_ASSERT(u.i == 0x2ABCBEEF);
   1.975 +  MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u));
   1.976 +}
   1.977 +
   1.978 +static void
   1.979 +TestScanUnsigned64()
   1.980 +{
   1.981 +  Input<uint64_t> u;
   1.982 +
   1.983 +  PoisonInput(u);
   1.984 +  sscanf("17421742173", "%" SCNo64, &u.i);
   1.985 +  MOZ_RELEASE_ASSERT(u.i == UINT64_C(017421742173));
   1.986 +  MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u));
   1.987 +
   1.988 +  PoisonInput(u);
   1.989 +  sscanf("421786713579", "%" SCNu64, &u.i);
   1.990 +  MOZ_RELEASE_ASSERT(u.i == UINT64_C(421786713579));
   1.991 +  MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u));
   1.992 +
   1.993 +  PoisonInput(u);
   1.994 +  sscanf("DEADBEEF7457E", "%" SCNx64, &u.i);
   1.995 +  MOZ_RELEASE_ASSERT(u.i == UINT64_C(0xDEADBEEF7457E));
   1.996 +  MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u));
   1.997 +}
   1.998 +
   1.999 +static void
  1.1000 +TestScanUnsignedN()
  1.1001 +{
  1.1002 +  TestScanUnsigned8();
  1.1003 +  TestScanUnsigned16();
  1.1004 +  TestScanUnsigned32();
  1.1005 +  TestScanUnsigned64();
  1.1006 +}
  1.1007 +
  1.1008 +static void
  1.1009 +TestScanUnsignedLeast8()
  1.1010 +{
  1.1011 +#if SHOULD_TEST_8BIT_FORMAT_MACROS
  1.1012 +  Input<uint_least8_t> u;
  1.1013 +
  1.1014 +  PoisonInput(u);
  1.1015 +  sscanf("17", "%" SCNoLEAST8, &u.i);
  1.1016 +  MOZ_RELEASE_ASSERT(u.i == 017);
  1.1017 +  MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u));
  1.1018 +
  1.1019 +  PoisonInput(u);
  1.1020 +  sscanf("42", "%" SCNuLEAST8, &u.i);
  1.1021 +  MOZ_RELEASE_ASSERT(u.i == 42);
  1.1022 +  MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u));
  1.1023 +
  1.1024 +  PoisonInput(u);
  1.1025 +  sscanf("2A", "%" SCNxLEAST8, &u.i);
  1.1026 +  MOZ_RELEASE_ASSERT(u.i == 0x2A);
  1.1027 +  MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u));
  1.1028 +#endif
  1.1029 +}
  1.1030 +
  1.1031 +static void
  1.1032 +TestScanUnsignedLeast16()
  1.1033 +{
  1.1034 +  Input<uint_least16_t> u;
  1.1035 +
  1.1036 +  PoisonInput(u);
  1.1037 +  sscanf("1742", "%" SCNoLEAST16, &u.i);
  1.1038 +  MOZ_RELEASE_ASSERT(u.i == 01742);
  1.1039 +  MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u));
  1.1040 +
  1.1041 +  PoisonInput(u);
  1.1042 +  sscanf("4217", "%" SCNuLEAST16, &u.i);
  1.1043 +  MOZ_RELEASE_ASSERT(u.i == 4217);
  1.1044 +  MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u));
  1.1045 +
  1.1046 +  PoisonInput(u);
  1.1047 +  sscanf("2ABC", "%" SCNxLEAST16, &u.i);
  1.1048 +  MOZ_RELEASE_ASSERT(u.i == 0x2ABC);
  1.1049 +  MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u));
  1.1050 +}
  1.1051 +
  1.1052 +static void
  1.1053 +TestScanUnsignedLeast32()
  1.1054 +{
  1.1055 +  Input<uint_least32_t> u;
  1.1056 +
  1.1057 +  PoisonInput(u);
  1.1058 +  sscanf("17421742", "%" SCNoLEAST32, &u.i);
  1.1059 +  MOZ_RELEASE_ASSERT(u.i == 017421742);
  1.1060 +  MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u));
  1.1061 +
  1.1062 +  PoisonInput(u);
  1.1063 +  sscanf("4217867", "%" SCNuLEAST32, &u.i);
  1.1064 +  MOZ_RELEASE_ASSERT(u.i == 4217867);
  1.1065 +  MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u));
  1.1066 +
  1.1067 +  PoisonInput(u);
  1.1068 +  sscanf("2ABCBEEF", "%" SCNxLEAST32, &u.i);
  1.1069 +  MOZ_RELEASE_ASSERT(u.i == 0x2ABCBEEF);
  1.1070 +  MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u));
  1.1071 +}
  1.1072 +
  1.1073 +static void
  1.1074 +TestScanUnsignedLeast64()
  1.1075 +{
  1.1076 +  Input<uint_least64_t> u;
  1.1077 +
  1.1078 +  PoisonInput(u);
  1.1079 +  sscanf("17421742173", "%" SCNoLEAST64, &u.i);
  1.1080 +  MOZ_RELEASE_ASSERT(u.i == UINT64_C(017421742173));
  1.1081 +  MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u));
  1.1082 +
  1.1083 +  PoisonInput(u);
  1.1084 +  sscanf("421786713579", "%" SCNuLEAST64, &u.i);
  1.1085 +  MOZ_RELEASE_ASSERT(u.i == UINT64_C(421786713579));
  1.1086 +  MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u));
  1.1087 +
  1.1088 +  PoisonInput(u);
  1.1089 +  sscanf("DEADBEEF7457E", "%" SCNxLEAST64, &u.i);
  1.1090 +  MOZ_RELEASE_ASSERT(u.i == UINT64_C(0xDEADBEEF7457E));
  1.1091 +  MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u));
  1.1092 +}
  1.1093 +
  1.1094 +static void
  1.1095 +TestScanUnsignedLeastN()
  1.1096 +{
  1.1097 +  TestScanUnsignedLeast8();
  1.1098 +  TestScanUnsignedLeast16();
  1.1099 +  TestScanUnsignedLeast32();
  1.1100 +  TestScanUnsignedLeast64();
  1.1101 +}
  1.1102 +
  1.1103 +static void
  1.1104 +TestScanUnsignedFast8()
  1.1105 +{
  1.1106 +#if SHOULD_TEST_8BIT_FORMAT_MACROS
  1.1107 +  Input<uint_fast8_t> u;
  1.1108 +
  1.1109 +  PoisonInput(u);
  1.1110 +  sscanf("17", "%" SCNoFAST8, &u.i);
  1.1111 +  MOZ_RELEASE_ASSERT(u.i == 017);
  1.1112 +  MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u));
  1.1113 +
  1.1114 +  PoisonInput(u);
  1.1115 +  sscanf("42", "%" SCNuFAST8, &u.i);
  1.1116 +  MOZ_RELEASE_ASSERT(u.i == 42);
  1.1117 +  MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u));
  1.1118 +
  1.1119 +  PoisonInput(u);
  1.1120 +  sscanf("2A", "%" SCNxFAST8, &u.i);
  1.1121 +  MOZ_RELEASE_ASSERT(u.i == 0x2A);
  1.1122 +  MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u));
  1.1123 +#endif
  1.1124 +}
  1.1125 +
  1.1126 +static void
  1.1127 +TestScanUnsignedFast16()
  1.1128 +{
  1.1129 +  Input<uint_fast16_t> u;
  1.1130 +
  1.1131 +  PoisonInput(u);
  1.1132 +  sscanf("1742", "%" SCNoFAST16, &u.i);
  1.1133 +  MOZ_RELEASE_ASSERT(u.i == 01742);
  1.1134 +  MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u));
  1.1135 +
  1.1136 +  PoisonInput(u);
  1.1137 +  sscanf("4217", "%" SCNuFAST16, &u.i);
  1.1138 +  MOZ_RELEASE_ASSERT(u.i == 4217);
  1.1139 +  MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u));
  1.1140 +
  1.1141 +  PoisonInput(u);
  1.1142 +  sscanf("2ABC", "%" SCNxFAST16, &u.i);
  1.1143 +  MOZ_RELEASE_ASSERT(u.i == 0x2ABC);
  1.1144 +  MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u));
  1.1145 +}
  1.1146 +
  1.1147 +static void
  1.1148 +TestScanUnsignedFast32()
  1.1149 +{
  1.1150 +  Input<uint_fast32_t> u;
  1.1151 +
  1.1152 +  PoisonInput(u);
  1.1153 +  sscanf("17421742", "%" SCNoFAST32, &u.i);
  1.1154 +  MOZ_RELEASE_ASSERT(u.i == 017421742);
  1.1155 +  MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u));
  1.1156 +
  1.1157 +  PoisonInput(u);
  1.1158 +  sscanf("4217867", "%" SCNuFAST32, &u.i);
  1.1159 +  MOZ_RELEASE_ASSERT(u.i == 4217867);
  1.1160 +  MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u));
  1.1161 +
  1.1162 +  PoisonInput(u);
  1.1163 +  sscanf("2ABCBEEF", "%" SCNxFAST32, &u.i);
  1.1164 +  MOZ_RELEASE_ASSERT(u.i == 0x2ABCBEEF);
  1.1165 +  MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u));
  1.1166 +}
  1.1167 +
  1.1168 +static void
  1.1169 +TestScanUnsignedFast64()
  1.1170 +{
  1.1171 +  Input<uint_fast64_t> u;
  1.1172 +
  1.1173 +  PoisonInput(u);
  1.1174 +  sscanf("17421742173", "%" SCNoFAST64, &u.i);
  1.1175 +  MOZ_RELEASE_ASSERT(u.i == UINT64_C(017421742173));
  1.1176 +  MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u));
  1.1177 +
  1.1178 +  PoisonInput(u);
  1.1179 +  sscanf("421786713579", "%" SCNuFAST64, &u.i);
  1.1180 +  MOZ_RELEASE_ASSERT(u.i == UINT64_C(421786713579));
  1.1181 +  MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u));
  1.1182 +
  1.1183 +  PoisonInput(u);
  1.1184 +  sscanf("DEADBEEF7457E", "%" SCNxFAST64, &u.i);
  1.1185 +  MOZ_RELEASE_ASSERT(u.i == UINT64_C(0xDEADBEEF7457E));
  1.1186 +  MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u));
  1.1187 +}
  1.1188 +
  1.1189 +static void
  1.1190 +TestScanUnsignedFastN()
  1.1191 +{
  1.1192 +  TestScanUnsignedFast8();
  1.1193 +  TestScanUnsignedFast16();
  1.1194 +  TestScanUnsignedFast32();
  1.1195 +  TestScanUnsignedFast64();
  1.1196 +}
  1.1197 +
  1.1198 +static void
  1.1199 +TestScanUnsignedMax()
  1.1200 +{
  1.1201 +  Input<uintmax_t> u;
  1.1202 +
  1.1203 +  PoisonInput(u);
  1.1204 +  sscanf("14220563454333534", "%" SCNoMAX, &u.i);
  1.1205 +  MOZ_RELEASE_ASSERT(u.i == UINTMAX_C(432157943248732));
  1.1206 +  MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u));
  1.1207 +
  1.1208 +  PoisonInput(u);
  1.1209 +  sscanf("432157943248732", "%" SCNuMAX, &u.i);
  1.1210 +  MOZ_RELEASE_ASSERT(u.i == UINTMAX_C(432157943248732));
  1.1211 +  MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u));
  1.1212 +
  1.1213 +  PoisonInput(u);
  1.1214 +  sscanf("4c337ca791", "%" SCNxMAX, &u.i);
  1.1215 +  MOZ_RELEASE_ASSERT(u.i == UINTMAX_C(327281321873));
  1.1216 +  MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u));
  1.1217 +}
  1.1218 +
  1.1219 +static void
  1.1220 +TestScanUnsignedPtr()
  1.1221 +{
  1.1222 +  Input<uintptr_t> u;
  1.1223 +
  1.1224 +  PoisonInput(u);
  1.1225 +  sscanf("57060516", "%" SCNoPTR, &u.i);
  1.1226 +  MOZ_RELEASE_ASSERT(u.i == uintptr_t(reinterpret_cast<void*>(12345678)));
  1.1227 +  MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u));
  1.1228 +
  1.1229 +  PoisonInput(u);
  1.1230 +  sscanf("87654321", "%" SCNuPTR, &u.i);
  1.1231 +  MOZ_RELEASE_ASSERT(u.i == uintptr_t(reinterpret_cast<void*>(87654321)));
  1.1232 +  MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u));
  1.1233 +
  1.1234 +  PoisonInput(u);
  1.1235 +  sscanf("4c3a791", "%" SCNxPTR, &u.i);
  1.1236 +  MOZ_RELEASE_ASSERT(u.i == uintptr_t(reinterpret_cast<void*>(0x4c3a791)));
  1.1237 +  MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u));
  1.1238 +}
  1.1239 +
  1.1240 +static void
  1.1241 +TestScanUnsigned()
  1.1242 +{
  1.1243 +  TestScanUnsignedN();
  1.1244 +  TestScanUnsignedLeastN();
  1.1245 +  TestScanUnsignedFastN();
  1.1246 +  TestScanUnsignedMax();
  1.1247 +  TestScanUnsignedPtr();
  1.1248 +}
  1.1249 +
  1.1250 +static void
  1.1251 +TestScan()
  1.1252 +{
  1.1253 +  TestScanSigned();
  1.1254 +  TestScanUnsigned();
  1.1255 +}
  1.1256 +
  1.1257 +#endif /* SHOULD_TEST_SCANF_MACROS */
  1.1258 +
  1.1259 +int
  1.1260 +main()
  1.1261 +{
  1.1262 +  TestPrint();
  1.1263 +#if SHOULD_TEST_SCANF_MACROS
  1.1264 +  TestScan();
  1.1265 +#endif
  1.1266 +  return 0;
  1.1267 +}

mercurial