1 /* A portable stdint.h 2 **************************************************************************** 3 * BSD License: 4 **************************************************************************** 5 * 6 * Copyright (c) 2005-2007 Paul Hsieh 7 * All rights reserved. 8 * 9 * Redistribution and use in source and binary forms, with or without 10 * modification, are permitted provided that the following conditions 11 * are met: 12 * 13 * 1. Redistributions of source code must retain the above copyright 14 * notice, this list of conditions and the following disclaimer. 15 * 2. Redistributions in binary form must reproduce the above copyright 16 * notice, this list of conditions and the following disclaimer in the 17 * documentation and/or other materials provided with the distribution. 18 * 3. The name of the author may not be used to endorse or promote products 19 * derived from this software without specific prior written permission. 20 * 21 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 22 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 23 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 24 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 25 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 26 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 27 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 28 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 29 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 30 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31 * 32 **************************************************************************** 33 * 34 * Version 0.1.11 35 * 36 * The ANSI C standard committee, for the C99 standard, specified the 37 * inclusion of a new standard include file called stdint.h. This is 38 * a very useful and long desired include file which contains several 39 * very precise definitions for integer scalar types that is 40 * critically important for making portable several classes of 41 * applications including cryptography, hashing, variable length 42 * integer libraries and so on. But for most developers its likely 43 * useful just for programming sanity. 44 * 45 * The problem is that most compiler vendors have decided not to 46 * implement the C99 standard, and the next C++ language standard 47 * (which has a lot more mindshare these days) will be a long time in 48 * coming and its unknown whether or not it will include stdint.h or 49 * how much adoption it will have. Either way, it will be a long time 50 * before all compilers come with a stdint.h and it also does nothing 51 * for the extremely large number of compilers available today which 52 * do not include this file, or anything comparable to it. 53 * 54 * So that's what this file is all about. Its an attempt to build a 55 * single universal include file that works on as many platforms as 56 * possible to deliver what stdint.h is supposed to. A few things 57 * that should be noted about this file: 58 * 59 * 1) It is not guaranteed to be portable and/or present an identical 60 * interface on all platforms. The extreme variability of the 61 * ANSI C standard makes this an impossibility right from the 62 * very get go. Its really only meant to be useful for the vast 63 * majority of platforms that possess the capability of 64 * implementing usefully and precisely defined, standard sized 65 * integer scalars. Systems which are not intrinsically 2s 66 * complement may produce invalid constants. 67 * 68 * 2) There is an unavoidable use of non-reserved symbols. 69 * 70 * 3) Other standard include files are invoked. 71 * 72 * 4) This file may come in conflict with future platforms that do 73 * include stdint.h. The hope is that one or the other can be 74 * used with no real difference. 75 * 76 * 5) In the current verison, if your platform can't represent 77 * int32_t, int16_t and int8_t, it just dumps out with a compiler 78 * error. 79 * 80 * 6) 64 bit integers may or may not be defined. Test for their 81 * presence with the test: #ifdef INT64_MAX or #ifdef UINT64_MAX. 82 * Note that this is different from the C99 specification which 83 * requires the existence of 64 bit support in the compiler. If 84 * this is not defined for your platform, yet it is capable of 85 * dealing with 64 bits then it is because this file has not yet 86 * been extended to cover all of your system's capabilities. 87 * 88 * 7) (u)intptr_t may or may not be defined. Test for its presence 89 * with the test: #ifdef PTRDIFF_MAX. If this is not defined 90 * for your platform, then it is because this file has not yet 91 * been extended to cover all of your system's capabilities, not 92 * because its optional. 93 * 94 * 8) The following might not been defined even if your platform is 95 * capable of defining it: 96 * 97 * WCHAR_MIN 98 * WCHAR_MAX 99 * (u)int64_t 100 * PTRDIFF_MIN 101 * PTRDIFF_MAX 102 * (u)intptr_t 103 * 104 * 9) The following have not been defined: 105 * 106 * WINT_MIN 107 * WINT_MAX 108 * 109 * 10) The criteria for defining (u)int_least(*)_t isn't clear, 110 * except for systems which don't have a type that precisely 111 * defined 8, 16, or 32 bit types (which this include file does 112 * not support anyways). Default definitions have been given. 113 * 114 * 11) The criteria for defining (u)int_fast(*)_t isn't something I 115 * would trust to any particular compiler vendor or the ANSI C 116 * committee. It is well known that "compatible systems" are 117 * commonly created that have very different performance 118 * characteristics from the systems they are compatible with, 119 * especially those whose vendors make both the compiler and the 120 * system. Default definitions have been given, but its strongly 121 * recommended that users never use these definitions for any 122 * reason (they do *NOT* deliver any serious guarantee of 123 * improved performance -- not in this file, nor any vendor's 124 * stdint.h). 125 * 126 * 12) The following macros: 127 * 128 * PRINTF_INTMAX_MODIFIER 129 * PRINTF_INT64_MODIFIER 130 * PRINTF_INT32_MODIFIER 131 * PRINTF_INT16_MODIFIER 132 * PRINTF_LEAST64_MODIFIER 133 * PRINTF_LEAST32_MODIFIER 134 * PRINTF_LEAST16_MODIFIER 135 * PRINTF_INTPTR_MODIFIER 136 * 137 * are strings which have been defined as the modifiers required 138 * for the "d", "u" and "x" printf formats to correctly output 139 * (u)intmax_t, (u)int64_t, (u)int32_t, (u)int16_t, (u)least64_t, 140 * (u)least32_t, (u)least16_t and (u)intptr_t types respectively. 141 * PRINTF_INTPTR_MODIFIER is not defined for some systems which 142 * provide their own stdint.h. PRINTF_INT64_MODIFIER is not 143 * defined if INT64_MAX is not defined. These are an extension 144 * beyond what C99 specifies must be in stdint.h. 145 * 146 * In addition, the following macros are defined: 147 * 148 * PRINTF_INTMAX_HEX_WIDTH 149 * PRINTF_INT64_HEX_WIDTH 150 * PRINTF_INT32_HEX_WIDTH 151 * PRINTF_INT16_HEX_WIDTH 152 * PRINTF_INT8_HEX_WIDTH 153 * PRINTF_INTMAX_DEC_WIDTH 154 * PRINTF_INT64_DEC_WIDTH 155 * PRINTF_INT32_DEC_WIDTH 156 * PRINTF_INT16_DEC_WIDTH 157 * PRINTF_INT8_DEC_WIDTH 158 * 159 * Which specifies the maximum number of characters required to 160 * print the number of that type in either hexadecimal or decimal. 161 * These are an extension beyond what C99 specifies must be in 162 * stdint.h. 163 * 164 * Compilers tested (all with 0 warnings at their highest respective 165 * settings): Borland Turbo C 2.0, WATCOM C/C++ 11.0 (16 bits and 32 166 * bits), Microsoft Visual C++ 6.0 (32 bit), Microsoft Visual Studio 167 * .net (VC7), Intel C++ 4.0, GNU gcc v3.3.3 168 * 169 * This file should be considered a work in progress. Suggestions for 170 * improvements, especially those which increase coverage are strongly 171 * encouraged. 172 * 173 * Acknowledgements 174 * 175 * The following people have made significant contributions to the 176 * development and testing of this file: 177 * 178 * Chris Howie 179 * John Steele Scott 180 * Dave Thorup 181 * 182 */ 183 184 #include <stddef.h> 185 #include <limits.h> 186 #include <signal.h> 187 188 /* 189 * For gcc with _STDINT_H, fill in the PRINTF_INT*_MODIFIER macros, and 190 * do nothing else. On the Mac OS X version of gcc this is _STDINT_H_. 191 */ 192 193 #if ((defined(__STDC__) && __STDC__ && __STDC_VERSION__ >= 199901L) || (defined (__WATCOMC__) && (defined (_STDINT_H_INCLUDED) || __WATCOMC__ >= 1250)) || (defined(__GNUC__) && (defined(_STDINT_H) || defined(_STDINT_H_)) )) && !defined (_PSTDINT_H_INCLUDED) 194 #include <stdint.h> 195 #define _PSTDINT_H_INCLUDED 196 # ifndef PRINTF_INT64_MODIFIER 197 # define PRINTF_INT64_MODIFIER "ll" 198 # endif 199 # ifndef PRINTF_INT32_MODIFIER 200 # define PRINTF_INT32_MODIFIER "l" 201 # endif 202 # ifndef PRINTF_INT16_MODIFIER 203 # define PRINTF_INT16_MODIFIER "h" 204 # endif 205 # ifndef PRINTF_INTMAX_MODIFIER 206 # define PRINTF_INTMAX_MODIFIER PRINTF_INT64_MODIFIER 207 # endif 208 # ifndef PRINTF_INT64_HEX_WIDTH 209 # define PRINTF_INT64_HEX_WIDTH "16" 210 # endif 211 # ifndef PRINTF_INT32_HEX_WIDTH 212 # define PRINTF_INT32_HEX_WIDTH "8" 213 # endif 214 # ifndef PRINTF_INT16_HEX_WIDTH 215 # define PRINTF_INT16_HEX_WIDTH "4" 216 # endif 217 # ifndef PRINTF_INT8_HEX_WIDTH 218 # define PRINTF_INT8_HEX_WIDTH "2" 219 # endif 220 # ifndef PRINTF_INT64_DEC_WIDTH 221 # define PRINTF_INT64_DEC_WIDTH "20" 222 # endif 223 # ifndef PRINTF_INT32_DEC_WIDTH 224 # define PRINTF_INT32_DEC_WIDTH "10" 225 # endif 226 # ifndef PRINTF_INT16_DEC_WIDTH 227 # define PRINTF_INT16_DEC_WIDTH "5" 228 # endif 229 # ifndef PRINTF_INT8_DEC_WIDTH 230 # define PRINTF_INT8_DEC_WIDTH "3" 231 # endif 232 # ifndef PRINTF_INTMAX_HEX_WIDTH 233 # define PRINTF_INTMAX_HEX_WIDTH PRINTF_INT64_HEX_WIDTH 234 # endif 235 # ifndef PRINTF_INTMAX_DEC_WIDTH 236 # define PRINTF_INTMAX_DEC_WIDTH PRINTF_INT64_DEC_WIDTH 237 # endif 238 239 /* 240 * Something really weird is going on with Open Watcom. Just pull some of 241 * these duplicated definitions from Open Watcom's stdint.h file for now. 242 */ 243 244 # if defined (__WATCOMC__) && __WATCOMC__ >= 1250 245 # if !defined (INT64_C) 246 # define INT64_C(x) (x + (INT64_MAX - INT64_MAX)) 247 # endif 248 # if !defined (UINT64_C) 249 # define UINT64_C(x) (x + (UINT64_MAX - UINT64_MAX)) 250 # endif 251 # if !defined (INT32_C) 252 # define INT32_C(x) (x + (INT32_MAX - INT32_MAX)) 253 # endif 254 # if !defined (UINT32_C) 255 # define UINT32_C(x) (x + (UINT32_MAX - UINT32_MAX)) 256 # endif 257 # if !defined (INT16_C) 258 # define INT16_C(x) (x) 259 # endif 260 # if !defined (UINT16_C) 261 # define UINT16_C(x) (x) 262 # endif 263 # if !defined (INT8_C) 264 # define INT8_C(x) (x) 265 # endif 266 # if !defined (UINT8_C) 267 # define UINT8_C(x) (x) 268 # endif 269 # if !defined (UINT64_MAX) 270 # define UINT64_MAX 18446744073709551615ULL 271 # endif 272 # if !defined (INT64_MAX) 273 # define INT64_MAX 9223372036854775807LL 274 # endif 275 # if !defined (UINT32_MAX) 276 # define UINT32_MAX 4294967295UL 277 # endif 278 # if !defined (INT32_MAX) 279 # define INT32_MAX 2147483647L 280 # endif 281 # if !defined (INTMAX_MAX) 282 # define INTMAX_MAX INT64_MAX 283 # endif 284 # if !defined (INTMAX_MIN) 285 # define INTMAX_MIN INT64_MIN 286 # endif 287 # endif 288 #endif 289 290 #ifndef _PSTDINT_H_INCLUDED 291 #define _PSTDINT_H_INCLUDED 292 293 #ifndef SIZE_MAX 294 # define SIZE_MAX (~(size_t)0) 295 #endif 296 297 /* 298 * Deduce the type assignments from limits.h under the assumption that 299 * integer sizes in bits are powers of 2, and follow the ANSI 300 * definitions. 301 */ 302 303 #ifndef UINT8_MAX 304 # define UINT8_MAX 0xff 305 #endif 306 #ifndef uint8_t 307 # if (UCHAR_MAX == UINT8_MAX) || defined (S_SPLINT_S) 308 typedef unsigned char uint8_t; 309 # define UINT8_C(v) ((uint8_t) v) 310 # else 311 # error "Platform not supported" 312 # endif 313 #endif 314 315 #ifndef INT8_MAX 316 # define INT8_MAX 0x7f 317 #endif 318 #ifndef INT8_MIN 319 # define INT8_MIN INT8_C(0x80) 320 #endif 321 #ifndef int8_t 322 # if (SCHAR_MAX == INT8_MAX) || defined (S_SPLINT_S) 323 typedef signed char int8_t; 324 # define INT8_C(v) ((int8_t) v) 325 # else 326 # error "Platform not supported" 327 # endif 328 #endif 329 330 #ifndef UINT16_MAX 331 # define UINT16_MAX 0xffff 332 #endif 333 #ifndef uint16_t 334 #if (UINT_MAX == UINT16_MAX) || defined (S_SPLINT_S) 335 typedef unsigned int uint16_t; 336 # ifndef PRINTF_INT16_MODIFIER 337 # define PRINTF_INT16_MODIFIER "" 338 # endif 339 # define UINT16_C(v) ((uint16_t) (v)) 340 #elif (USHRT_MAX == UINT16_MAX) 341 typedef unsigned short uint16_t; 342 # define UINT16_C(v) ((uint16_t) (v)) 343 # ifndef PRINTF_INT16_MODIFIER 344 # define PRINTF_INT16_MODIFIER "h" 345 # endif 346 #else 347 #error "Platform not supported" 348 #endif 349 #endif 350 351 #ifndef INT16_MAX 352 # define INT16_MAX 0x7fff 353 #endif 354 #ifndef INT16_MIN 355 # define INT16_MIN INT16_C(0x8000) 356 #endif 357 #ifndef int16_t 358 #if (INT_MAX == INT16_MAX) || defined (S_SPLINT_S) 359 typedef signed int int16_t; 360 # define INT16_C(v) ((int16_t) (v)) 361 # ifndef PRINTF_INT16_MODIFIER 362 # define PRINTF_INT16_MODIFIER "" 363 # endif 364 #elif (SHRT_MAX == INT16_MAX) 365 typedef signed short int16_t; 366 # define INT16_C(v) ((int16_t) (v)) 367 # ifndef PRINTF_INT16_MODIFIER 368 # define PRINTF_INT16_MODIFIER "h" 369 # endif 370 #else 371 #error "Platform not supported" 372 #endif 373 #endif 374 375 #ifndef UINT32_MAX 376 # define UINT32_MAX (0xffffffffUL) 377 #endif 378 #ifndef uint32_t 379 // Try the 'natural' int type first. 380 // This is for compatibility with the stdint.h available on Windows. 381 #if (UINT_MAX == UINT32_MAX) && !defined (S_SPLINT_S) 382 typedef unsigned int uint32_t; 383 # ifndef PRINTF_INT32_MODIFIER 384 # define PRINTF_INT32_MODIFIER "" 385 # endif 386 # define UINT32_C(v) v ## U 387 #elif (ULONG_MAX == UINT32_MAX) || defined (S_SPLINT_S) 388 typedef unsigned long uint32_t; 389 # define UINT32_C(v) v ## UL 390 # ifndef PRINTF_INT32_MODIFIER 391 # define PRINTF_INT32_MODIFIER "l" 392 # endif 393 #elif (USHRT_MAX == UINT32_MAX) 394 typedef unsigned short uint32_t; 395 # define UINT32_C(v) ((unsigned short) (v)) 396 # ifndef PRINTF_INT32_MODIFIER 397 # define PRINTF_INT32_MODIFIER "" 398 # endif 399 #else 400 #error "Platform not supported" 401 #endif 402 #endif 403 404 #ifndef INT32_MAX 405 # define INT32_MAX (0x7fffffffL) 406 #endif 407 #ifndef INT32_MIN 408 # define INT32_MIN INT32_C(0x80000000) 409 #endif 410 #ifndef int32_t 411 // Try the 'natural' int type first. 412 // This is for compatibility with the stdint.h available on Windows. 413 #if (INT_MAX == INT32_MAX) && !defined (S_SPLINT_S) 414 typedef signed int int32_t; 415 # define INT32_C(v) v 416 # ifndef PRINTF_INT32_MODIFIER 417 # define PRINTF_INT32_MODIFIER "" 418 # endif 419 #elif (LONG_MAX == INT32_MAX) || defined (S_SPLINT_S) 420 typedef signed long int32_t; 421 # define INT32_C(v) v ## L 422 # ifndef PRINTF_INT32_MODIFIER 423 # define PRINTF_INT32_MODIFIER "l" 424 # endif 425 #elif (SHRT_MAX == INT32_MAX) 426 typedef signed short int32_t; 427 # define INT32_C(v) ((short) (v)) 428 # ifndef PRINTF_INT32_MODIFIER 429 # define PRINTF_INT32_MODIFIER "" 430 # endif 431 #else 432 #error "Platform not supported" 433 #endif 434 #endif 435 436 /* 437 * The macro stdint_int64_defined is temporarily used to record 438 * whether or not 64 integer support is available. It must be 439 * defined for any 64 integer extensions for new platforms that are 440 * added. 441 */ 442 443 #undef stdint_int64_defined 444 #if (defined(__STDC__) && defined(__STDC_VERSION__)) || defined (S_SPLINT_S) 445 # if (__STDC__ && __STDC_VERSION >= 199901L) || defined (S_SPLINT_S) 446 # define stdint_int64_defined 447 typedef long long int64_t; 448 typedef unsigned long long uint64_t; 449 # define UINT64_C(v) v ## ULL 450 # define INT64_C(v) v ## LL 451 # ifndef PRINTF_INT64_MODIFIER 452 # define PRINTF_INT64_MODIFIER "ll" 453 # endif 454 # endif 455 #endif 456 457 #if !defined (stdint_int64_defined) 458 # if defined(__GNUC__) 459 # define stdint_int64_defined 460 __extension__ typedef long long int64_t; 461 __extension__ typedef unsigned long long uint64_t; 462 # define UINT64_C(v) v ## ULL 463 # define INT64_C(v) v ## LL 464 # ifndef PRINTF_INT64_MODIFIER 465 # define PRINTF_INT64_MODIFIER "ll" 466 # endif 467 # elif defined(__MWERKS__) || defined (__SUNPRO_C) || defined (__SUNPRO_CC) || defined (__APPLE_CC__) || defined (_LONG_LONG) || defined (_CRAYC) || defined (S_SPLINT_S) 468 # define stdint_int64_defined 469 typedef long long int64_t; 470 typedef unsigned long long uint64_t; 471 # define UINT64_C(v) v ## ULL 472 # define INT64_C(v) v ## LL 473 # ifndef PRINTF_INT64_MODIFIER 474 # define PRINTF_INT64_MODIFIER "ll" 475 # endif 476 # elif (defined(__WATCOMC__) && defined(__WATCOM_INT64__)) || (defined(_MSC_VER) && _INTEGRAL_MAX_BITS >= 64) || (defined (__BORLANDC__) && __BORLANDC__ > 0x460) || defined (__alpha) || defined (__DECC) 477 # define stdint_int64_defined 478 typedef __int64 int64_t; 479 typedef unsigned __int64 uint64_t; 480 # define UINT64_C(v) v ## UI64 481 # define INT64_C(v) v ## I64 482 # ifndef PRINTF_INT64_MODIFIER 483 # define PRINTF_INT64_MODIFIER "I64" 484 # endif 485 # endif 486 #endif 487 488 #if !defined (LONG_LONG_MAX) && defined (INT64_C) 489 # define LONG_LONG_MAX INT64_C (9223372036854775807) 490 #endif 491 #ifndef ULONG_LONG_MAX 492 # define ULONG_LONG_MAX UINT64_C (18446744073709551615) 493 #endif 494 495 #if !defined (INT64_MAX) && defined (INT64_C) 496 # define INT64_MAX INT64_C (9223372036854775807) 497 #endif 498 #if !defined (INT64_MIN) && defined (INT64_C) 499 # define INT64_MIN INT64_C (-9223372036854775808) 500 #endif 501 #if !defined (UINT64_MAX) && defined (INT64_C) 502 # define UINT64_MAX UINT64_C (18446744073709551615) 503 #endif 504 505 /* 506 * Width of hexadecimal for number field. 507 */ 508 509 #ifndef PRINTF_INT64_HEX_WIDTH 510 # define PRINTF_INT64_HEX_WIDTH "16" 511 #endif 512 #ifndef PRINTF_INT32_HEX_WIDTH 513 # define PRINTF_INT32_HEX_WIDTH "8" 514 #endif 515 #ifndef PRINTF_INT16_HEX_WIDTH 516 # define PRINTF_INT16_HEX_WIDTH "4" 517 #endif 518 #ifndef PRINTF_INT8_HEX_WIDTH 519 # define PRINTF_INT8_HEX_WIDTH "2" 520 #endif 521 522 #ifndef PRINTF_INT64_DEC_WIDTH 523 # define PRINTF_INT64_DEC_WIDTH "20" 524 #endif 525 #ifndef PRINTF_INT32_DEC_WIDTH 526 # define PRINTF_INT32_DEC_WIDTH "10" 527 #endif 528 #ifndef PRINTF_INT16_DEC_WIDTH 529 # define PRINTF_INT16_DEC_WIDTH "5" 530 #endif 531 #ifndef PRINTF_INT8_DEC_WIDTH 532 # define PRINTF_INT8_DEC_WIDTH "3" 533 #endif 534 535 /* 536 * Ok, lets not worry about 128 bit integers for now. Moore's law says 537 * we don't need to worry about that until about 2040 at which point 538 * we'll have bigger things to worry about. 539 */ 540 541 #ifdef stdint_int64_defined 542 typedef int64_t intmax_t; 543 typedef uint64_t uintmax_t; 544 # define INTMAX_MAX INT64_MAX 545 # define INTMAX_MIN INT64_MIN 546 # define UINTMAX_MAX UINT64_MAX 547 # define UINTMAX_C(v) UINT64_C(v) 548 # define INTMAX_C(v) INT64_C(v) 549 # ifndef PRINTF_INTMAX_MODIFIER 550 # define PRINTF_INTMAX_MODIFIER PRINTF_INT64_MODIFIER 551 # endif 552 # ifndef PRINTF_INTMAX_HEX_WIDTH 553 # define PRINTF_INTMAX_HEX_WIDTH PRINTF_INT64_HEX_WIDTH 554 # endif 555 # ifndef PRINTF_INTMAX_DEC_WIDTH 556 # define PRINTF_INTMAX_DEC_WIDTH PRINTF_INT64_DEC_WIDTH 557 # endif 558 #else 559 typedef int32_t intmax_t; 560 typedef uint32_t uintmax_t; 561 # define INTMAX_MAX INT32_MAX 562 # define UINTMAX_MAX UINT32_MAX 563 # define UINTMAX_C(v) UINT32_C(v) 564 # define INTMAX_C(v) INT32_C(v) 565 # ifndef PRINTF_INTMAX_MODIFIER 566 # define PRINTF_INTMAX_MODIFIER PRINTF_INT32_MODIFIER 567 # endif 568 # ifndef PRINTF_INTMAX_HEX_WIDTH 569 # define PRINTF_INTMAX_HEX_WIDTH PRINTF_INT32_HEX_WIDTH 570 # endif 571 # ifndef PRINTF_INTMAX_DEC_WIDTH 572 # define PRINTF_INTMAX_DEC_WIDTH PRINTF_INT32_DEC_WIDTH 573 # endif 574 #endif 575 576 /* 577 * Because this file currently only supports platforms which have 578 * precise powers of 2 as bit sizes for the default integers, the 579 * least definitions are all trivial. Its possible that a future 580 * version of this file could have different definitions. 581 */ 582 583 #ifndef stdint_least_defined 584 typedef int8_t int_least8_t; 585 typedef uint8_t uint_least8_t; 586 typedef int16_t int_least16_t; 587 typedef uint16_t uint_least16_t; 588 typedef int32_t int_least32_t; 589 typedef uint32_t uint_least32_t; 590 # define PRINTF_LEAST32_MODIFIER PRINTF_INT32_MODIFIER 591 # define PRINTF_LEAST16_MODIFIER PRINTF_INT16_MODIFIER 592 # define UINT_LEAST8_MAX UINT8_MAX 593 # define INT_LEAST8_MAX INT8_MAX 594 # define UINT_LEAST16_MAX UINT16_MAX 595 # define INT_LEAST16_MAX INT16_MAX 596 # define UINT_LEAST32_MAX UINT32_MAX 597 # define INT_LEAST32_MAX INT32_MAX 598 # define INT_LEAST8_MIN INT8_MIN 599 # define INT_LEAST16_MIN INT16_MIN 600 # define INT_LEAST32_MIN INT32_MIN 601 # ifdef stdint_int64_defined 602 typedef int64_t int_least64_t; 603 typedef uint64_t uint_least64_t; 604 # define PRINTF_LEAST64_MODIFIER PRINTF_INT64_MODIFIER 605 # define UINT_LEAST64_MAX UINT64_MAX 606 # define INT_LEAST64_MAX INT64_MAX 607 # define INT_LEAST64_MIN INT64_MIN 608 # endif 609 #endif 610 #undef stdint_least_defined 611 612 /* 613 * The ANSI C committee pretending to know or specify anything about 614 * performance is the epitome of misguided arrogance. The mandate of 615 * this file is to *ONLY* ever support that absolute minimum 616 * definition of the fast integer types, for compatibility purposes. 617 * No extensions, and no attempt to suggest what may or may not be a 618 * faster integer type will ever be made in this file. Developers are 619 * warned to stay away from these types when using this or any other 620 * stdint.h. 621 */ 622 623 typedef int_least8_t int_fast8_t; 624 typedef uint_least8_t uint_fast8_t; 625 typedef int_least16_t int_fast16_t; 626 typedef uint_least16_t uint_fast16_t; 627 typedef int_least32_t int_fast32_t; 628 typedef uint_least32_t uint_fast32_t; 629 #define UINT_FAST8_MAX UINT_LEAST8_MAX 630 #define INT_FAST8_MAX INT_LEAST8_MAX 631 #define UINT_FAST16_MAX UINT_LEAST16_MAX 632 #define INT_FAST16_MAX INT_LEAST16_MAX 633 #define UINT_FAST32_MAX UINT_LEAST32_MAX 634 #define INT_FAST32_MAX INT_LEAST32_MAX 635 #define INT_FAST8_MIN INT_LEAST8_MIN 636 #define INT_FAST16_MIN INT_LEAST16_MIN 637 #define INT_FAST32_MIN INT_LEAST32_MIN 638 #ifdef stdint_int64_defined 639 typedef int_least64_t int_fast64_t; 640 typedef uint_least64_t uint_fast64_t; 641 # define UINT_FAST64_MAX UINT_LEAST64_MAX 642 # define INT_FAST64_MAX INT_LEAST64_MAX 643 # define INT_FAST64_MIN INT_LEAST64_MIN 644 #endif 645 646 #undef stdint_int64_defined 647 648 /* 649 * Whatever piecemeal, per compiler thing we can do about the wchar_t 650 * type limits. 651 */ 652 653 #if defined(__WATCOMC__) || defined(_MSC_VER) || defined (__GNUC__) 654 # include <wchar.h> 655 # ifndef WCHAR_MIN 656 # define WCHAR_MIN 0 657 # endif 658 # ifndef WCHAR_MAX 659 # define WCHAR_MAX ((wchar_t)-1) 660 # endif 661 #endif 662 663 /* 664 * Whatever piecemeal, per compiler/platform thing we can do about the 665 * (u)intptr_t types and limits. 666 */ 667 668 #if defined (_MSC_VER) && defined (_UINTPTR_T_DEFINED) 669 # define STDINT_H_UINTPTR_T_DEFINED 670 #endif 671 672 #ifndef STDINT_H_UINTPTR_T_DEFINED 673 # if defined (__alpha__) || defined (__ia64__) || defined (__x86_64__) || defined (_WIN64) 674 # define stdint_intptr_bits 64 675 # elif defined (__WATCOMC__) || defined (__TURBOC__) 676 # if defined(__TINY__) || defined(__SMALL__) || defined(__MEDIUM__) 677 # define stdint_intptr_bits 16 678 # else 679 # define stdint_intptr_bits 32 680 # endif 681 # elif defined (__i386__) || defined (_WIN32) || defined (WIN32) 682 # define stdint_intptr_bits 32 683 # elif defined (__INTEL_COMPILER) 684 /* TODO -- what will Intel do about x86-64? */ 685 # endif 686 687 # ifdef stdint_intptr_bits 688 # define stdint_intptr_glue3_i(a,b,c) a##b##c 689 # define stdint_intptr_glue3(a,b,c) stdint_intptr_glue3_i(a,b,c) 690 # ifndef PRINTF_INTPTR_MODIFIER 691 # define PRINTF_INTPTR_MODIFIER stdint_intptr_glue3(PRINTF_INT,stdint_intptr_bits,_MODIFIER) 692 # endif 693 # ifndef PTRDIFF_MAX 694 # define PTRDIFF_MAX stdint_intptr_glue3(INT,stdint_intptr_bits,_MAX) 695 # endif 696 # ifndef PTRDIFF_MIN 697 # define PTRDIFF_MIN stdint_intptr_glue3(INT,stdint_intptr_bits,_MIN) 698 # endif 699 # ifndef UINTPTR_MAX 700 # define UINTPTR_MAX stdint_intptr_glue3(UINT,stdint_intptr_bits,_MAX) 701 # endif 702 # ifndef INTPTR_MAX 703 # define INTPTR_MAX stdint_intptr_glue3(INT,stdint_intptr_bits,_MAX) 704 # endif 705 # ifndef INTPTR_MIN 706 # define INTPTR_MIN stdint_intptr_glue3(INT,stdint_intptr_bits,_MIN) 707 # endif 708 # ifndef INTPTR_C 709 # define INTPTR_C(x) stdint_intptr_glue3(INT,stdint_intptr_bits,_C)(x) 710 # endif 711 # ifndef UINTPTR_C 712 # define UINTPTR_C(x) stdint_intptr_glue3(UINT,stdint_intptr_bits,_C)(x) 713 # endif 714 typedef stdint_intptr_glue3(uint,stdint_intptr_bits,_t) uintptr_t; 715 typedef stdint_intptr_glue3( int,stdint_intptr_bits,_t) intptr_t; 716 # else 717 /* TODO -- This following is likely wrong for some platforms, and does 718 nothing for the definition of uintptr_t. */ 719 typedef ptrdiff_t intptr_t; 720 # endif 721 # define STDINT_H_UINTPTR_T_DEFINED 722 #endif 723 724 /* 725 * Assumes sig_atomic_t is signed and we have a 2s complement machine. 726 */ 727 728 #ifndef SIG_ATOMIC_MAX 729 # define SIG_ATOMIC_MAX ((((sig_atomic_t) 1) << (sizeof (sig_atomic_t)*CHAR_BIT-1)) - 1) 730 #endif 731 732 #endif 733 734 #if defined (__TEST_PSTDINT_FOR_CORRECTNESS) 735 736 /* 737 * Please compile with the maximum warning settings to make sure macros are not 738 * defined more than once. 739 */ 740 741 #include <stdlib.h> 742 #include <stdio.h> 743 #include <string.h> 744 745 #define glue3_aux(x,y,z) x ## y ## z 746 #define glue3(x,y,z) glue3_aux(x,y,z) 747 748 #define DECLU(bits) glue3(uint,bits,_t) glue3(u,bits,=) glue3(UINT,bits,_C) (0); 749 #define DECLI(bits) glue3(int,bits,_t) glue3(i,bits,=) glue3(INT,bits,_C) (0); 750 751 #define DECL(us,bits) glue3(DECL,us,) (bits) 752 753 #define TESTUMAX(bits) glue3(u,bits,=) glue3(~,u,bits); if (glue3(UINT,bits,_MAX) glue3(!=,u,bits)) printf ("Something wrong with UINT%d_MAX\n", bits) 754 755 int main () { 756 DECL(I,8) 757 DECL(U,8) 758 DECL(I,16) 759 DECL(U,16) 760 DECL(I,32) 761 DECL(U,32) 762 #ifdef INT64_MAX 763 DECL(I,64) 764 DECL(U,64) 765 #endif 766 intmax_t imax = INTMAX_C(0); 767 uintmax_t umax = UINTMAX_C(0); 768 char str0[256], str1[256]; 769 770 sprintf (str0, "%d %x\n", 0, ~0); 771 772 sprintf (str1, "%d %x\n", i8, ~0); 773 if (0 != strcmp (str0, str1)) printf ("Something wrong with i8 : %s\n", str1); 774 sprintf (str1, "%u %x\n", u8, ~0); 775 if (0 != strcmp (str0, str1)) printf ("Something wrong with u8 : %s\n", str1); 776 sprintf (str1, "%d %x\n", i16, ~0); 777 if (0 != strcmp (str0, str1)) printf ("Something wrong with i16 : %s\n", str1); 778 sprintf (str1, "%u %x\n", u16, ~0); 779 if (0 != strcmp (str0, str1)) printf ("Something wrong with u16 : %s\n", str1); 780 sprintf (str1, "%" PRINTF_INT32_MODIFIER "d %x\n", i32, ~0); 781 if (0 != strcmp (str0, str1)) printf ("Something wrong with i32 : %s\n", str1); 782 sprintf (str1, "%" PRINTF_INT32_MODIFIER "u %x\n", u32, ~0); 783 if (0 != strcmp (str0, str1)) printf ("Something wrong with u32 : %s\n", str1); 784 #ifdef INT64_MAX 785 sprintf (str1, "%" PRINTF_INT64_MODIFIER "d %x\n", i64, ~0); 786 if (0 != strcmp (str0, str1)) printf ("Something wrong with i64 : %s\n", str1); 787 #endif 788 sprintf (str1, "%" PRINTF_INTMAX_MODIFIER "d %x\n", imax, ~0); 789 if (0 != strcmp (str0, str1)) printf ("Something wrong with imax : %s\n", str1); 790 sprintf (str1, "%" PRINTF_INTMAX_MODIFIER "u %x\n", umax, ~0); 791 if (0 != strcmp (str0, str1)) printf ("Something wrong with umax : %s\n", str1); 792 793 TESTUMAX(8); 794 TESTUMAX(16); 795 TESTUMAX(32); 796 #ifdef INT64_MAX 797 TESTUMAX(64); 798 #endif 799 800 return EXIT_SUCCESS; 801 } 802 803 #endif 804