anope- supernets anope source code & configuration |
git clone git://git.acid.vegas/anope.git |
Log | Files | Refs | Archive | README |
pstdint.h (27179B)
1 /* A portable stdint.h 2 **************************************************************************** 3 * BSD License: 4 **************************************************************************** 5 * 6 * Copyright (c) 2005-2011 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.12 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 version, 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 * John Dill 182 * 183 */ 184 185 #include <stddef.h> 186 #include <limits.h> 187 #include <signal.h> 188 189 /* 190 * For gcc with _STDINT_H, fill in the PRINTF_INT*_MODIFIER macros, and 191 * do nothing else. On the Mac OS X version of gcc this is _STDINT_H_. 192 */ 193 194 #if ((defined(__STDC__) && __STDC__ && __STDC_VERSION__ >= 199901L) || (defined (__WATCOMC__) && (defined (_STDINT_H_INCLUDED) || __WATCOMC__ >= 1250)) || (defined(__GNUC__) && (defined(_STDINT_H) || defined(_STDINT_H_) || defined (__UINT_FAST64_TYPE__)) )) && !defined (_PSTDINT_H_INCLUDED) 195 #include <stdint.h> 196 #define _PSTDINT_H_INCLUDED 197 # ifndef PRINTF_INT64_MODIFIER 198 # define PRINTF_INT64_MODIFIER "ll" 199 # endif 200 # ifndef PRINTF_INT32_MODIFIER 201 # define PRINTF_INT32_MODIFIER "l" 202 # endif 203 # ifndef PRINTF_INT16_MODIFIER 204 # define PRINTF_INT16_MODIFIER "h" 205 # endif 206 # ifndef PRINTF_INTMAX_MODIFIER 207 # define PRINTF_INTMAX_MODIFIER PRINTF_INT64_MODIFIER 208 # endif 209 # ifndef PRINTF_INT64_HEX_WIDTH 210 # define PRINTF_INT64_HEX_WIDTH "16" 211 # endif 212 # ifndef PRINTF_INT32_HEX_WIDTH 213 # define PRINTF_INT32_HEX_WIDTH "8" 214 # endif 215 # ifndef PRINTF_INT16_HEX_WIDTH 216 # define PRINTF_INT16_HEX_WIDTH "4" 217 # endif 218 # ifndef PRINTF_INT8_HEX_WIDTH 219 # define PRINTF_INT8_HEX_WIDTH "2" 220 # endif 221 # ifndef PRINTF_INT64_DEC_WIDTH 222 # define PRINTF_INT64_DEC_WIDTH "20" 223 # endif 224 # ifndef PRINTF_INT32_DEC_WIDTH 225 # define PRINTF_INT32_DEC_WIDTH "10" 226 # endif 227 # ifndef PRINTF_INT16_DEC_WIDTH 228 # define PRINTF_INT16_DEC_WIDTH "5" 229 # endif 230 # ifndef PRINTF_INT8_DEC_WIDTH 231 # define PRINTF_INT8_DEC_WIDTH "3" 232 # endif 233 # ifndef PRINTF_INTMAX_HEX_WIDTH 234 # define PRINTF_INTMAX_HEX_WIDTH PRINTF_INT64_HEX_WIDTH 235 # endif 236 # ifndef PRINTF_INTMAX_DEC_WIDTH 237 # define PRINTF_INTMAX_DEC_WIDTH PRINTF_INT64_DEC_WIDTH 238 # endif 239 240 /* 241 * Something really weird is going on with Open Watcom. Just pull some of 242 * these duplicated definitions from Open Watcom's stdint.h file for now. 243 */ 244 245 # if defined (__WATCOMC__) && __WATCOMC__ >= 1250 246 # if !defined (INT64_C) 247 # define INT64_C(x) (x + (INT64_MAX - INT64_MAX)) 248 # endif 249 # if !defined (UINT64_C) 250 # define UINT64_C(x) (x + (UINT64_MAX - UINT64_MAX)) 251 # endif 252 # if !defined (INT32_C) 253 # define INT32_C(x) (x + (INT32_MAX - INT32_MAX)) 254 # endif 255 # if !defined (UINT32_C) 256 # define UINT32_C(x) (x + (UINT32_MAX - UINT32_MAX)) 257 # endif 258 # if !defined (INT16_C) 259 # define INT16_C(x) (x) 260 # endif 261 # if !defined (UINT16_C) 262 # define UINT16_C(x) (x) 263 # endif 264 # if !defined (INT8_C) 265 # define INT8_C(x) (x) 266 # endif 267 # if !defined (UINT8_C) 268 # define UINT8_C(x) (x) 269 # endif 270 # if !defined (UINT64_MAX) 271 # define UINT64_MAX 18446744073709551615ULL 272 # endif 273 # if !defined (INT64_MAX) 274 # define INT64_MAX 9223372036854775807LL 275 # endif 276 # if !defined (UINT32_MAX) 277 # define UINT32_MAX 4294967295UL 278 # endif 279 # if !defined (INT32_MAX) 280 # define INT32_MAX 2147483647L 281 # endif 282 # if !defined (INTMAX_MAX) 283 # define INTMAX_MAX INT64_MAX 284 # endif 285 # if !defined (INTMAX_MIN) 286 # define INTMAX_MIN INT64_MIN 287 # endif 288 # endif 289 #endif 290 291 #ifndef _PSTDINT_H_INCLUDED 292 #define _PSTDINT_H_INCLUDED 293 294 #ifndef SIZE_MAX 295 # define SIZE_MAX (~(size_t)0) 296 #endif 297 298 /* 299 * Deduce the type assignments from limits.h under the assumption that 300 * integer sizes in bits are powers of 2, and follow the ANSI 301 * definitions. 302 */ 303 304 #ifndef UINT8_MAX 305 # define UINT8_MAX 0xff 306 #endif 307 #ifndef uint8_t 308 # if (UCHAR_MAX == UINT8_MAX) || defined (S_SPLINT_S) 309 typedef unsigned char uint8_t; 310 # define UINT8_C(v) ((uint8_t) v) 311 # else 312 # error "Platform not supported" 313 # endif 314 #endif 315 316 #ifndef INT8_MAX 317 # define INT8_MAX 0x7f 318 #endif 319 #ifndef INT8_MIN 320 # define INT8_MIN INT8_C(0x80) 321 #endif 322 #ifndef int8_t 323 # if (SCHAR_MAX == INT8_MAX) || defined (S_SPLINT_S) 324 typedef signed char int8_t; 325 # define INT8_C(v) ((int8_t) v) 326 # else 327 # error "Platform not supported" 328 # endif 329 #endif 330 331 #ifndef UINT16_MAX 332 # define UINT16_MAX 0xffff 333 #endif 334 #ifndef uint16_t 335 #if (UINT_MAX == UINT16_MAX) || defined (S_SPLINT_S) 336 typedef unsigned int uint16_t; 337 # ifndef PRINTF_INT16_MODIFIER 338 # define PRINTF_INT16_MODIFIER "" 339 # endif 340 # define UINT16_C(v) ((uint16_t) (v)) 341 #elif (USHRT_MAX == UINT16_MAX) 342 typedef unsigned short uint16_t; 343 # define UINT16_C(v) ((uint16_t) (v)) 344 # ifndef PRINTF_INT16_MODIFIER 345 # define PRINTF_INT16_MODIFIER "h" 346 # endif 347 #else 348 #error "Platform not supported" 349 #endif 350 #endif 351 352 #ifndef INT16_MAX 353 # define INT16_MAX 0x7fff 354 #endif 355 #ifndef INT16_MIN 356 # define INT16_MIN INT16_C(0x8000) 357 #endif 358 #ifndef int16_t 359 #if (INT_MAX == INT16_MAX) || defined (S_SPLINT_S) 360 typedef signed int int16_t; 361 # define INT16_C(v) ((int16_t) (v)) 362 # ifndef PRINTF_INT16_MODIFIER 363 # define PRINTF_INT16_MODIFIER "" 364 # endif 365 #elif (SHRT_MAX == INT16_MAX) 366 typedef signed short int16_t; 367 # define INT16_C(v) ((int16_t) (v)) 368 # ifndef PRINTF_INT16_MODIFIER 369 # define PRINTF_INT16_MODIFIER "h" 370 # endif 371 #else 372 #error "Platform not supported" 373 #endif 374 #endif 375 376 #ifndef UINT32_MAX 377 # define UINT32_MAX (0xffffffffUL) 378 #endif 379 #ifndef uint32_t 380 #if (ULONG_MAX == UINT32_MAX) || defined (S_SPLINT_S) 381 typedef unsigned long uint32_t; 382 # define UINT32_C(v) v ## UL 383 # ifndef PRINTF_INT32_MODIFIER 384 # define PRINTF_INT32_MODIFIER "l" 385 # endif 386 #elif (UINT_MAX == UINT32_MAX) 387 typedef unsigned int uint32_t; 388 # ifndef PRINTF_INT32_MODIFIER 389 # define PRINTF_INT32_MODIFIER "" 390 # endif 391 # define UINT32_C(v) v ## U 392 #elif (USHRT_MAX == UINT32_MAX) 393 typedef unsigned short uint32_t; 394 # define UINT32_C(v) ((unsigned short) (v)) 395 # ifndef PRINTF_INT32_MODIFIER 396 # define PRINTF_INT32_MODIFIER "" 397 # endif 398 #else 399 #error "Platform not supported" 400 #endif 401 #endif 402 403 #ifndef INT32_MAX 404 # define INT32_MAX (0x7fffffffL) 405 #endif 406 #ifndef INT32_MIN 407 # define INT32_MIN INT32_C(0x80000000) 408 #endif 409 #ifndef int32_t 410 #if (LONG_MAX == INT32_MAX) || defined (S_SPLINT_S) 411 typedef signed long int32_t; 412 # define INT32_C(v) v ## L 413 # ifndef PRINTF_INT32_MODIFIER 414 # define PRINTF_INT32_MODIFIER "l" 415 # endif 416 #elif (INT_MAX == INT32_MAX) 417 typedef signed int int32_t; 418 # define INT32_C(v) v 419 # ifndef PRINTF_INT32_MODIFIER 420 # define PRINTF_INT32_MODIFIER "" 421 # endif 422 #elif (SHRT_MAX == INT32_MAX) 423 typedef signed short int32_t; 424 # define INT32_C(v) ((short) (v)) 425 # ifndef PRINTF_INT32_MODIFIER 426 # define PRINTF_INT32_MODIFIER "" 427 # endif 428 #else 429 #error "Platform not supported" 430 #endif 431 #endif 432 433 /* 434 * The macro stdint_int64_defined is temporarily used to record 435 * whether or not 64 integer support is available. It must be 436 * defined for any 64 integer extensions for new platforms that are 437 * added. 438 */ 439 440 #undef stdint_int64_defined 441 #if (defined(__STDC__) && defined(__STDC_VERSION__)) || defined (S_SPLINT_S) 442 # if (__STDC__ && __STDC_VERSION__ >= 199901L) || defined (S_SPLINT_S) 443 # define stdint_int64_defined 444 typedef long long int64_t; 445 typedef unsigned long long uint64_t; 446 # define UINT64_C(v) v ## ULL 447 # define INT64_C(v) v ## LL 448 # ifndef PRINTF_INT64_MODIFIER 449 # define PRINTF_INT64_MODIFIER "ll" 450 # endif 451 # endif 452 #endif 453 454 #if !defined (stdint_int64_defined) 455 # if defined(__GNUC__) 456 # define stdint_int64_defined 457 __extension__ typedef long long int64_t; 458 __extension__ typedef unsigned long long uint64_t; 459 # define UINT64_C(v) v ## ULL 460 # define INT64_C(v) v ## LL 461 # ifndef PRINTF_INT64_MODIFIER 462 # define PRINTF_INT64_MODIFIER "ll" 463 # endif 464 # elif defined(__MWERKS__) || defined (__SUNPRO_C) || defined (__SUNPRO_CC) || defined (__APPLE_CC__) || defined (_LONG_LONG) || defined (_CRAYC) || defined (S_SPLINT_S) 465 # define stdint_int64_defined 466 typedef long long int64_t; 467 typedef unsigned long long uint64_t; 468 # define UINT64_C(v) v ## ULL 469 # define INT64_C(v) v ## LL 470 # ifndef PRINTF_INT64_MODIFIER 471 # define PRINTF_INT64_MODIFIER "ll" 472 # endif 473 # elif (defined(__WATCOMC__) && defined(__WATCOM_INT64__)) || (defined(_MSC_VER) && _INTEGRAL_MAX_BITS >= 64) || (defined (__BORLANDC__) && __BORLANDC__ > 0x460) || defined (__alpha) || defined (__DECC) 474 # define stdint_int64_defined 475 typedef __int64 int64_t; 476 typedef unsigned __int64 uint64_t; 477 # define UINT64_C(v) v ## UI64 478 # define INT64_C(v) v ## I64 479 # ifndef PRINTF_INT64_MODIFIER 480 # define PRINTF_INT64_MODIFIER "I64" 481 # endif 482 # endif 483 #endif 484 485 #if !defined (LONG_LONG_MAX) && defined (INT64_C) 486 # define LONG_LONG_MAX INT64_C (9223372036854775807) 487 #endif 488 #ifndef ULONG_LONG_MAX 489 # define ULONG_LONG_MAX UINT64_C (18446744073709551615) 490 #endif 491 492 #if !defined (INT64_MAX) && defined (INT64_C) 493 # define INT64_MAX INT64_C (9223372036854775807) 494 #endif 495 #if !defined (INT64_MIN) && defined (INT64_C) 496 # define INT64_MIN INT64_C (-9223372036854775808) 497 #endif 498 #if !defined (UINT64_MAX) && defined (INT64_C) 499 # define UINT64_MAX UINT64_C (18446744073709551615) 500 #endif 501 502 /* 503 * Width of hexadecimal for number field. 504 */ 505 506 #ifndef PRINTF_INT64_HEX_WIDTH 507 # define PRINTF_INT64_HEX_WIDTH "16" 508 #endif 509 #ifndef PRINTF_INT32_HEX_WIDTH 510 # define PRINTF_INT32_HEX_WIDTH "8" 511 #endif 512 #ifndef PRINTF_INT16_HEX_WIDTH 513 # define PRINTF_INT16_HEX_WIDTH "4" 514 #endif 515 #ifndef PRINTF_INT8_HEX_WIDTH 516 # define PRINTF_INT8_HEX_WIDTH "2" 517 #endif 518 519 #ifndef PRINTF_INT64_DEC_WIDTH 520 # define PRINTF_INT64_DEC_WIDTH "20" 521 #endif 522 #ifndef PRINTF_INT32_DEC_WIDTH 523 # define PRINTF_INT32_DEC_WIDTH "10" 524 #endif 525 #ifndef PRINTF_INT16_DEC_WIDTH 526 # define PRINTF_INT16_DEC_WIDTH "5" 527 #endif 528 #ifndef PRINTF_INT8_DEC_WIDTH 529 # define PRINTF_INT8_DEC_WIDTH "3" 530 #endif 531 532 /* 533 * Ok, lets not worry about 128 bit integers for now. Moore's law says 534 * we don't need to worry about that until about 2040 at which point 535 * we'll have bigger things to worry about. 536 */ 537 538 #ifdef stdint_int64_defined 539 typedef int64_t intmax_t; 540 typedef uint64_t uintmax_t; 541 # define INTMAX_MAX INT64_MAX 542 # define INTMAX_MIN INT64_MIN 543 # define UINTMAX_MAX UINT64_MAX 544 # define UINTMAX_C(v) UINT64_C(v) 545 # define INTMAX_C(v) INT64_C(v) 546 # ifndef PRINTF_INTMAX_MODIFIER 547 # define PRINTF_INTMAX_MODIFIER PRINTF_INT64_MODIFIER 548 # endif 549 # ifndef PRINTF_INTMAX_HEX_WIDTH 550 # define PRINTF_INTMAX_HEX_WIDTH PRINTF_INT64_HEX_WIDTH 551 # endif 552 # ifndef PRINTF_INTMAX_DEC_WIDTH 553 # define PRINTF_INTMAX_DEC_WIDTH PRINTF_INT64_DEC_WIDTH 554 # endif 555 #else 556 typedef int32_t intmax_t; 557 typedef uint32_t uintmax_t; 558 # define INTMAX_MAX INT32_MAX 559 # define UINTMAX_MAX UINT32_MAX 560 # define UINTMAX_C(v) UINT32_C(v) 561 # define INTMAX_C(v) INT32_C(v) 562 # ifndef PRINTF_INTMAX_MODIFIER 563 # define PRINTF_INTMAX_MODIFIER PRINTF_INT32_MODIFIER 564 # endif 565 # ifndef PRINTF_INTMAX_HEX_WIDTH 566 # define PRINTF_INTMAX_HEX_WIDTH PRINTF_INT32_HEX_WIDTH 567 # endif 568 # ifndef PRINTF_INTMAX_DEC_WIDTH 569 # define PRINTF_INTMAX_DEC_WIDTH PRINTF_INT32_DEC_WIDTH 570 # endif 571 #endif 572 573 /* 574 * Because this file currently only supports platforms which have 575 * precise powers of 2 as bit sizes for the default integers, the 576 * least definitions are all trivial. Its possible that a future 577 * version of this file could have different definitions. 578 */ 579 580 #ifndef stdint_least_defined 581 typedef int8_t int_least8_t; 582 typedef uint8_t uint_least8_t; 583 typedef int16_t int_least16_t; 584 typedef uint16_t uint_least16_t; 585 typedef int32_t int_least32_t; 586 typedef uint32_t uint_least32_t; 587 # define PRINTF_LEAST32_MODIFIER PRINTF_INT32_MODIFIER 588 # define PRINTF_LEAST16_MODIFIER PRINTF_INT16_MODIFIER 589 # define UINT_LEAST8_MAX UINT8_MAX 590 # define INT_LEAST8_MAX INT8_MAX 591 # define UINT_LEAST16_MAX UINT16_MAX 592 # define INT_LEAST16_MAX INT16_MAX 593 # define UINT_LEAST32_MAX UINT32_MAX 594 # define INT_LEAST32_MAX INT32_MAX 595 # define INT_LEAST8_MIN INT8_MIN 596 # define INT_LEAST16_MIN INT16_MIN 597 # define INT_LEAST32_MIN INT32_MIN 598 # ifdef stdint_int64_defined 599 typedef int64_t int_least64_t; 600 typedef uint64_t uint_least64_t; 601 # define PRINTF_LEAST64_MODIFIER PRINTF_INT64_MODIFIER 602 # define UINT_LEAST64_MAX UINT64_MAX 603 # define INT_LEAST64_MAX INT64_MAX 604 # define INT_LEAST64_MIN INT64_MIN 605 # endif 606 #endif 607 #undef stdint_least_defined 608 609 /* 610 * The ANSI C committee pretending to know or specify anything about 611 * performance is the epitome of misguided arrogance. The mandate of 612 * this file is to *ONLY* ever support that absolute minimum 613 * definition of the fast integer types, for compatibility purposes. 614 * No extensions, and no attempt to suggest what may or may not be a 615 * faster integer type will ever be made in this file. Developers are 616 * warned to stay away from these types when using this or any other 617 * stdint.h. 618 */ 619 620 typedef int_least8_t int_fast8_t; 621 typedef uint_least8_t uint_fast8_t; 622 typedef int_least16_t int_fast16_t; 623 typedef uint_least16_t uint_fast16_t; 624 typedef int_least32_t int_fast32_t; 625 typedef uint_least32_t uint_fast32_t; 626 #define UINT_FAST8_MAX UINT_LEAST8_MAX 627 #define INT_FAST8_MAX INT_LEAST8_MAX 628 #define UINT_FAST16_MAX UINT_LEAST16_MAX 629 #define INT_FAST16_MAX INT_LEAST16_MAX 630 #define UINT_FAST32_MAX UINT_LEAST32_MAX 631 #define INT_FAST32_MAX INT_LEAST32_MAX 632 #define INT_FAST8_MIN INT_LEAST8_MIN 633 #define INT_FAST16_MIN INT_LEAST16_MIN 634 #define INT_FAST32_MIN INT_LEAST32_MIN 635 #ifdef stdint_int64_defined 636 typedef int_least64_t int_fast64_t; 637 typedef uint_least64_t uint_fast64_t; 638 # define UINT_FAST64_MAX UINT_LEAST64_MAX 639 # define INT_FAST64_MAX INT_LEAST64_MAX 640 # define INT_FAST64_MIN INT_LEAST64_MIN 641 #endif 642 643 #undef stdint_int64_defined 644 645 /* 646 * Whatever piecemeal, per compiler thing we can do about the wchar_t 647 * type limits. 648 */ 649 650 #if defined(__WATCOMC__) || defined(_MSC_VER) || defined (__GNUC__) 651 # include <wchar.h> 652 # ifndef WCHAR_MIN 653 # define WCHAR_MIN 0 654 # endif 655 # ifndef WCHAR_MAX 656 # define WCHAR_MAX ((wchar_t)-1) 657 # endif 658 #endif 659 660 /* 661 * Whatever piecemeal, per compiler/platform thing we can do about the 662 * (u)intptr_t types and limits. 663 */ 664 665 #if defined (_MSC_VER) && defined (_UINTPTR_T_DEFINED) 666 # define STDINT_H_UINTPTR_T_DEFINED 667 #endif 668 669 #ifndef STDINT_H_UINTPTR_T_DEFINED 670 # if defined (__alpha__) || defined (__ia64__) || defined (__x86_64__) || defined (_WIN64) 671 # define stdint_intptr_bits 64 672 # elif defined (__WATCOMC__) || defined (__TURBOC__) 673 # if defined(__TINY__) || defined(__SMALL__) || defined(__MEDIUM__) 674 # define stdint_intptr_bits 16 675 # else 676 # define stdint_intptr_bits 32 677 # endif 678 # elif defined (__i386__) || defined (_WIN32) || defined (WIN32) 679 # define stdint_intptr_bits 32 680 # elif defined (__INTEL_COMPILER) 681 /* TODO -- what did Intel do about x86-64? */ 682 # endif 683 684 # ifdef stdint_intptr_bits 685 # define stdint_intptr_glue3_i(a,b,c) a##b##c 686 # define stdint_intptr_glue3(a,b,c) stdint_intptr_glue3_i(a,b,c) 687 # ifndef PRINTF_INTPTR_MODIFIER 688 # define PRINTF_INTPTR_MODIFIER stdint_intptr_glue3(PRINTF_INT,stdint_intptr_bits,_MODIFIER) 689 # endif 690 # ifndef PTRDIFF_MAX 691 # define PTRDIFF_MAX stdint_intptr_glue3(INT,stdint_intptr_bits,_MAX) 692 # endif 693 # ifndef PTRDIFF_MIN 694 # define PTRDIFF_MIN stdint_intptr_glue3(INT,stdint_intptr_bits,_MIN) 695 # endif 696 # ifndef UINTPTR_MAX 697 # define UINTPTR_MAX stdint_intptr_glue3(UINT,stdint_intptr_bits,_MAX) 698 # endif 699 # ifndef INTPTR_MAX 700 # define INTPTR_MAX stdint_intptr_glue3(INT,stdint_intptr_bits,_MAX) 701 # endif 702 # ifndef INTPTR_MIN 703 # define INTPTR_MIN stdint_intptr_glue3(INT,stdint_intptr_bits,_MIN) 704 # endif 705 # ifndef INTPTR_C 706 # define INTPTR_C(x) stdint_intptr_glue3(INT,stdint_intptr_bits,_C)(x) 707 # endif 708 # ifndef UINTPTR_C 709 # define UINTPTR_C(x) stdint_intptr_glue3(UINT,stdint_intptr_bits,_C)(x) 710 # endif 711 typedef stdint_intptr_glue3(uint,stdint_intptr_bits,_t) uintptr_t; 712 typedef stdint_intptr_glue3( int,stdint_intptr_bits,_t) intptr_t; 713 # else 714 /* TODO -- This following is likely wrong for some platforms, and does 715 nothing for the definition of uintptr_t. */ 716 typedef ptrdiff_t intptr_t; 717 # endif 718 # define STDINT_H_UINTPTR_T_DEFINED 719 #endif 720 721 /* 722 * Assumes sig_atomic_t is signed and we have a 2s complement machine. 723 */ 724 725 #ifndef SIG_ATOMIC_MAX 726 # define SIG_ATOMIC_MAX ((((sig_atomic_t) 1) << (sizeof (sig_atomic_t)*CHAR_BIT-1)) - 1) 727 #endif 728 729 #endif 730 731 #if defined (__TEST_PSTDINT_FOR_CORRECTNESS) 732 733 /* 734 * Please compile with the maximum warning settings to make sure macros are not 735 * defined more than once. 736 */ 737 738 #include <stdlib.h> 739 #include <stdio.h> 740 #include <string.h> 741 742 #define glue3_aux(x,y,z) x ## y ## z 743 #define glue3(x,y,z) glue3_aux(x,y,z) 744 745 #define DECLU(bits) glue3(uint,bits,_t) glue3(u,bits,=) glue3(UINT,bits,_C) (0); 746 #define DECLI(bits) glue3(int,bits,_t) glue3(i,bits,=) glue3(INT,bits,_C) (0); 747 748 #define DECL(us,bits) glue3(DECL,us,) (bits) 749 750 #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) 751 752 int main () { 753 DECL(I,8) 754 DECL(U,8) 755 DECL(I,16) 756 DECL(U,16) 757 DECL(I,32) 758 DECL(U,32) 759 #ifdef INT64_MAX 760 DECL(I,64) 761 DECL(U,64) 762 #endif 763 intmax_t imax = INTMAX_C(0); 764 uintmax_t umax = UINTMAX_C(0); 765 char str0[256], str1[256]; 766 767 sprintf (str0, "%d %x\n", 0, ~0); 768 769 sprintf (str1, "%d %x\n", i8, ~0); 770 if (0 != strcmp (str0, str1)) printf ("Something wrong with i8 : %s\n", str1); 771 sprintf (str1, "%u %x\n", u8, ~0); 772 if (0 != strcmp (str0, str1)) printf ("Something wrong with u8 : %s\n", str1); 773 sprintf (str1, "%d %x\n", i16, ~0); 774 if (0 != strcmp (str0, str1)) printf ("Something wrong with i16 : %s\n", str1); 775 sprintf (str1, "%u %x\n", u16, ~0); 776 if (0 != strcmp (str0, str1)) printf ("Something wrong with u16 : %s\n", str1); 777 sprintf (str1, "%" PRINTF_INT32_MODIFIER "d %x\n", i32, ~0); 778 if (0 != strcmp (str0, str1)) printf ("Something wrong with i32 : %s\n", str1); 779 sprintf (str1, "%" PRINTF_INT32_MODIFIER "u %x\n", u32, ~0); 780 if (0 != strcmp (str0, str1)) printf ("Something wrong with u32 : %s\n", str1); 781 #ifdef INT64_MAX 782 sprintf (str1, "%" PRINTF_INT64_MODIFIER "d %x\n", i64, ~0); 783 if (0 != strcmp (str0, str1)) printf ("Something wrong with i64 : %s\n", str1); 784 #endif 785 sprintf (str1, "%" PRINTF_INTMAX_MODIFIER "d %x\n", imax, ~0); 786 if (0 != strcmp (str0, str1)) printf ("Something wrong with imax : %s\n", str1); 787 sprintf (str1, "%" PRINTF_INTMAX_MODIFIER "u %x\n", umax, ~0); 788 if (0 != strcmp (str0, str1)) printf ("Something wrong with umax : %s\n", str1); 789 790 TESTUMAX(8); 791 TESTUMAX(16); 792 TESTUMAX(32); 793 #ifdef INT64_MAX 794 TESTUMAX(64); 795 #endif 796 797 return EXIT_SUCCESS; 798 } 799 800 #endif