1 /* 2 * Copyright (c) 2004, 2005 by 3 * Ralf Corsepius, Ulm/Germany. All rights reserved. 4 * 5 * Permission to use, copy, modify, and distribute this software 6 * is freely granted, provided that this notice is preserved. 7 */ 8 9 #ifndef _STDINT_H 10 #define _STDINT_H 11 12 #include <machine/_default_types.h> 13 #include <sys/_intsup.h> 14 #include <sys/_stdint.h> 15 16 #ifdef __cplusplus 17 extern "C" { 18 #endif 19 20 #ifdef ___int_least8_t_defined 21 typedef __int_least8_t int_least8_t; 22 typedef __uint_least8_t uint_least8_t; 23 #define __int_least8_t_defined 1 24 #endif 25 26 #ifdef ___int_least16_t_defined 27 typedef __int_least16_t int_least16_t; 28 typedef __uint_least16_t uint_least16_t; 29 #define __int_least16_t_defined 1 30 #endif 31 32 #ifdef ___int_least32_t_defined 33 typedef __int_least32_t int_least32_t; 34 typedef __uint_least32_t uint_least32_t; 35 #define __int_least32_t_defined 1 36 #endif 37 38 #ifdef ___int_least64_t_defined 39 typedef __int_least64_t int_least64_t; 40 typedef __uint_least64_t uint_least64_t; 41 #define __int_least64_t_defined 1 42 #endif 43 44 /* 45 * Fastest minimum-width integer types 46 * 47 * Assume int to be the fastest type for all types with a width 48 * less than __INT_MAX__ rsp. INT_MAX 49 */ 50 #ifdef __INT_FAST8_TYPE__ 51 typedef __INT_FAST8_TYPE__ int_fast8_t; 52 typedef __UINT_FAST8_TYPE__ uint_fast8_t; 53 #define __int_fast8_t_defined 1 54 #elif __STDINT_EXP(INT_MAX) >= 0x7f 55 typedef signed int int_fast8_t; 56 typedef unsigned int uint_fast8_t; 57 #define __int_fast8_t_defined 1 58 #endif 59 60 #ifdef __INT_FAST16_TYPE__ 61 typedef __INT_FAST16_TYPE__ int_fast16_t; 62 typedef __UINT_FAST16_TYPE__ uint_fast16_t; 63 #define __int_fast16_t_defined 1 64 #elif __STDINT_EXP(INT_MAX) >= 0x7fff 65 typedef signed int int_fast16_t; 66 typedef unsigned int uint_fast16_t; 67 #define __int_fast16_t_defined 1 68 #endif 69 70 #ifdef __INT_FAST32_TYPE__ 71 typedef __INT_FAST32_TYPE__ int_fast32_t; 72 typedef __UINT_FAST32_TYPE__ uint_fast32_t; 73 #define __int_fast32_t_defined 1 74 #elif __STDINT_EXP(INT_MAX) >= 0x7fffffff 75 typedef signed int int_fast32_t; 76 typedef unsigned int uint_fast32_t; 77 #define __int_fast32_t_defined 1 78 #endif 79 80 #ifdef __INT_FAST64_TYPE__ 81 typedef __INT_FAST64_TYPE__ int_fast64_t; 82 typedef __UINT_FAST64_TYPE__ uint_fast64_t; 83 #define __int_fast64_t_defined 1 84 #elif __STDINT_EXP(INT_MAX) > 0x7fffffff 85 typedef signed int int_fast64_t; 86 typedef unsigned int uint_fast64_t; 87 #define __int_fast64_t_defined 1 88 #endif 89 90 /* 91 * Fall back to [u]int_least<N>_t for [u]int_fast<N>_t types 92 * not having been defined, yet. 93 * Leave undefined, if [u]int_least<N>_t should not be available. 94 */ 95 #if !__int_fast8_t_defined 96 #if __int_least8_t_defined 97 typedef int_least8_t int_fast8_t; 98 typedef uint_least8_t uint_fast8_t; 99 #define __int_fast8_t_defined 1 100 #endif 101 #endif 102 103 #if !__int_fast16_t_defined 104 #if __int_least16_t_defined 105 typedef int_least16_t int_fast16_t; 106 typedef uint_least16_t uint_fast16_t; 107 #define __int_fast16_t_defined 1 108 #endif 109 #endif 110 111 #if !__int_fast32_t_defined 112 #if __int_least32_t_defined 113 typedef int_least32_t int_fast32_t; 114 typedef uint_least32_t uint_fast32_t; 115 #define __int_fast32_t_defined 1 116 #endif 117 #endif 118 119 #if !__int_fast64_t_defined 120 #if __int_least64_t_defined 121 typedef int_least64_t int_fast64_t; 122 typedef uint_least64_t uint_fast64_t; 123 #define __int_fast64_t_defined 1 124 #endif 125 #endif 126 127 #ifdef __INTPTR_TYPE__ 128 #define INTPTR_MIN (-__INTPTR_MAX__ - 1) 129 #define INTPTR_MAX (__INTPTR_MAX__) 130 #define UINTPTR_MAX (__UINTPTR_MAX__) 131 #elif defined(__PTRDIFF_TYPE__) 132 #define INTPTR_MAX PTRDIFF_MAX 133 #define INTPTR_MIN PTRDIFF_MIN 134 #ifdef __UINTPTR_MAX__ 135 #define UINTPTR_MAX (__UINTPTR_MAX__) 136 #else 137 #define UINTPTR_MAX (2UL * PTRDIFF_MAX + 1) 138 #endif 139 #else 140 /* 141 * Fallback to hardcoded values, 142 * should be valid on cpu's with 32bit int/32bit void* 143 */ 144 #define INTPTR_MAX (__STDINT_EXP(LONG_MAX)) 145 #define INTPTR_MIN (-__STDINT_EXP(LONG_MAX) - 1) 146 #define UINTPTR_MAX (__STDINT_EXP(LONG_MAX) * 2UL + 1) 147 #endif 148 149 /* Limits of Specified-Width Integer Types */ 150 151 #ifdef __INT8_MAX__ 152 #define INT8_MIN (-__INT8_MAX__ - 1) 153 #define INT8_MAX (__INT8_MAX__) 154 #define UINT8_MAX (__UINT8_MAX__) 155 #elif defined(__int8_t_defined) 156 #define INT8_MIN (-128) 157 #define INT8_MAX (127) 158 #define UINT8_MAX (255) 159 #endif 160 161 #ifdef __INT_LEAST8_MAX__ 162 #define INT_LEAST8_MIN (-__INT_LEAST8_MAX__ - 1) 163 #define INT_LEAST8_MAX (__INT_LEAST8_MAX__) 164 #define UINT_LEAST8_MAX (__UINT_LEAST8_MAX__) 165 #elif defined(__int_least8_t_defined) 166 #define INT_LEAST8_MIN (-128) 167 #define INT_LEAST8_MAX (127) 168 #define UINT_LEAST8_MAX (255) 169 #else 170 #error required type int_least8_t missing 171 #endif 172 173 #ifdef __INT16_MAX__ 174 #define INT16_MIN (-__INT16_MAX__ - 1) 175 #define INT16_MAX (__INT16_MAX__) 176 #define UINT16_MAX (__UINT16_MAX__) 177 #elif defined(__int16_t_defined) 178 #define INT16_MIN (-32768) 179 #define INT16_MAX (32767) 180 #define UINT16_MAX (65535) 181 #endif 182 183 #ifdef __INT_LEAST16_MAX__ 184 #define INT_LEAST16_MIN (-__INT_LEAST16_MAX__ - 1) 185 #define INT_LEAST16_MAX (__INT_LEAST16_MAX__) 186 #define UINT_LEAST16_MAX (__UINT_LEAST16_MAX__) 187 #elif defined(__int_least16_t_defined) 188 #define INT_LEAST16_MIN (-32768) 189 #define INT_LEAST16_MAX (32767) 190 #define UINT_LEAST16_MAX (65535) 191 #else 192 #error required type int_least16_t missing 193 #endif 194 195 #ifdef __INT32_MAX__ 196 #define INT32_MIN (-__INT32_MAX__ - 1) 197 #define INT32_MAX (__INT32_MAX__) 198 #define UINT32_MAX (__UINT32_MAX__) 199 #elif defined(__int32_t_defined) 200 #if defined (_INT32_EQ_LONG) 201 #define INT32_MIN (-2147483647L-1) 202 #define INT32_MAX (2147483647L) 203 #define UINT32_MAX (4294967295UL) 204 #else 205 #define INT32_MIN (-2147483647-1) 206 #define INT32_MAX (2147483647) 207 #define UINT32_MAX (4294967295U) 208 #endif 209 #endif 210 211 #ifdef __INT_LEAST32_MAX__ 212 #define INT_LEAST32_MIN (-__INT_LEAST32_MAX__ - 1) 213 #define INT_LEAST32_MAX (__INT_LEAST32_MAX__) 214 #define UINT_LEAST32_MAX (__UINT_LEAST32_MAX__) 215 #elif defined(__int_least32_t_defined) 216 #if defined (_INT32_EQ_LONG) 217 #define INT_LEAST32_MIN (-2147483647L-1) 218 #define INT_LEAST32_MAX (2147483647L) 219 #define UINT_LEAST32_MAX (4294967295UL) 220 #else 221 #define INT_LEAST32_MIN (-2147483647-1) 222 #define INT_LEAST32_MAX (2147483647) 223 #define UINT_LEAST32_MAX (4294967295U) 224 #endif 225 #else 226 #error required type int_least32_t missing 227 #endif 228 229 #ifdef __INT64_MAX__ 230 #define INT64_MIN (-__INT64_MAX__ - 1) 231 #define INT64_MAX (__INT64_MAX__) 232 #define UINT64_MAX (__UINT64_MAX__) 233 #elif defined(__int64_t_defined) 234 #if __have_long64 235 #define INT64_MIN (-9223372036854775807L-1L) 236 #define INT64_MAX (9223372036854775807L) 237 #define UINT64_MAX (18446744073709551615U) 238 #elif __have_longlong64 239 #define INT64_MIN (-9223372036854775807LL-1LL) 240 #define INT64_MAX (9223372036854775807LL) 241 #define UINT64_MAX (18446744073709551615ULL) 242 #endif 243 #endif 244 245 #ifdef __INT_LEAST64_MAX__ 246 #define INT_LEAST64_MIN (-__INT_LEAST64_MAX__ - 1) 247 #define INT_LEAST64_MAX (__INT_LEAST64_MAX__) 248 #define UINT_LEAST64_MAX (__UINT_LEAST64_MAX__) 249 #elif defined(__int_least64_t_defined) 250 #if __have_long64 251 #define INT_LEAST64_MIN (-9223372036854775807L-1L) 252 #define INT_LEAST64_MAX (9223372036854775807L) 253 #define UINT_LEAST64_MAX (18446744073709551615U) 254 #elif __have_longlong64 255 #define INT_LEAST64_MIN (-9223372036854775807LL-1LL) 256 #define INT_LEAST64_MAX (9223372036854775807LL) 257 #define UINT_LEAST64_MAX (18446744073709551615ULL) 258 #endif 259 #endif 260 261 #ifdef __INT_FAST8_MAX__ 262 #define INT_FAST8_MIN (-__INT_FAST8_MAX__ - 1) 263 #define INT_FAST8_MAX (__INT_FAST8_MAX__) 264 #define UINT_FAST8_MAX (__UINT_FAST8_MAX__) 265 #elif defined(__int_fast8_t_defined) 266 #if __STDINT_EXP(INT_MAX) >= 0x7f 267 #define INT_FAST8_MIN (-__STDINT_EXP(INT_MAX)-1) 268 #define INT_FAST8_MAX (__STDINT_EXP(INT_MAX)) 269 #define UINT_FAST8_MAX (__STDINT_EXP(INT_MAX)*2U+1U) 270 #else 271 #define INT_FAST8_MIN INT_LEAST8_MIN 272 #define INT_FAST8_MAX INT_LEAST8_MAX 273 #define UINT_FAST8_MAX UINT_LEAST8_MAX 274 #endif 275 #endif 276 277 #ifdef __INT_FAST16_MAX__ 278 #define INT_FAST16_MIN (-__INT_FAST16_MAX__ - 1) 279 #define INT_FAST16_MAX (__INT_FAST16_MAX__) 280 #define UINT_FAST16_MAX (__UINT_FAST16_MAX__) 281 #elif defined(__int_fast16_t_defined) 282 #if __STDINT_EXP(INT_MAX) >= 0x7fff 283 #define INT_FAST16_MIN (-__STDINT_EXP(INT_MAX)-1) 284 #define INT_FAST16_MAX (__STDINT_EXP(INT_MAX)) 285 #define UINT_FAST16_MAX (__STDINT_EXP(INT_MAX)*2U+1U) 286 #else 287 #define INT_FAST16_MIN INT_LEAST16_MIN 288 #define INT_FAST16_MAX INT_LEAST16_MAX 289 #define UINT_FAST16_MAX UINT_LEAST16_MAX 290 #endif 291 #endif 292 293 #ifdef __INT_FAST32_MAX__ 294 #define INT_FAST32_MIN (-__INT_FAST32_MAX__ - 1) 295 #define INT_FAST32_MAX (__INT_FAST32_MAX__) 296 #define UINT_FAST32_MAX (__UINT_FAST32_MAX__) 297 #elif defined(__int_fast32_t_defined) 298 #if __STDINT_EXP(INT_MAX) >= 0x7fffffff 299 #define INT_FAST32_MIN (-__STDINT_EXP(INT_MAX)-1) 300 #define INT_FAST32_MAX (__STDINT_EXP(INT_MAX)) 301 #define UINT_FAST32_MAX (__STDINT_EXP(INT_MAX)*2U+1U) 302 #else 303 #define INT_FAST32_MIN INT_LEAST32_MIN 304 #define INT_FAST32_MAX INT_LEAST32_MAX 305 #define UINT_FAST32_MAX UINT_LEAST32_MAX 306 #endif 307 #endif 308 309 #ifdef __INT_FAST64_MAX__ 310 #define INT_FAST64_MIN (-__INT_FAST64_MAX__ - 1) 311 #define INT_FAST64_MAX (__INT_FAST64_MAX__) 312 #define UINT_FAST64_MAX (__UINT_FAST64_MAX__) 313 #elif defined(__int_fast64_t_defined) 314 #if __STDINT_EXP(INT_MAX) > 0x7fffffff 315 #define INT_FAST64_MIN (-__STDINT_EXP(INT_MAX)-1) 316 #define INT_FAST64_MAX (__STDINT_EXP(INT_MAX)) 317 #define UINT_FAST64_MAX (__STDINT_EXP(INT_MAX)*2U+1U) 318 #else 319 #define INT_FAST64_MIN INT_LEAST64_MIN 320 #define INT_FAST64_MAX INT_LEAST64_MAX 321 #define UINT_FAST64_MAX UINT_LEAST64_MAX 322 #endif 323 #endif 324 325 #ifdef __INTMAX_MAX__ 326 #define INTMAX_MAX (__INTMAX_MAX__) 327 #define INTMAX_MIN (-INTMAX_MAX - 1) 328 #elif defined(__INTMAX_TYPE__) 329 /* All relevant GCC versions prefer long to long long for intmax_t. */ 330 #define INTMAX_MAX INT64_MAX 331 #define INTMAX_MIN INT64_MIN 332 #endif 333 334 #ifdef __UINTMAX_MAX__ 335 #define UINTMAX_MAX (__UINTMAX_MAX__) 336 #elif defined(__UINTMAX_TYPE__) 337 /* All relevant GCC versions prefer long to long long for intmax_t. */ 338 #define UINTMAX_MAX UINT64_MAX 339 #endif 340 341 /* This must match size_t in stddef.h, currently long unsigned int */ 342 #ifdef __SIZE_MAX__ 343 #define SIZE_MAX (__SIZE_MAX__) 344 #else 345 #define SIZE_MAX (__STDINT_EXP(LONG_MAX) * 2UL + 1) 346 #endif 347 348 /* This must match sig_atomic_t in <signal.h> (currently int) */ 349 #define SIG_ATOMIC_MIN (-__STDINT_EXP(INT_MAX) - 1) 350 #define SIG_ATOMIC_MAX (__STDINT_EXP(INT_MAX)) 351 352 /* This must match ptrdiff_t in <stddef.h> (currently long int) */ 353 #ifdef __PTRDIFF_MAX__ 354 #define PTRDIFF_MAX (__PTRDIFF_MAX__) 355 #else 356 #define PTRDIFF_MAX (__STDINT_EXP(LONG_MAX)) 357 #endif 358 #define PTRDIFF_MIN (-PTRDIFF_MAX - 1) 359 360 /* This must match definition in <wchar.h> */ 361 #ifndef WCHAR_MIN 362 #ifdef __WCHAR_MIN__ 363 #define WCHAR_MIN (__WCHAR_MIN__) 364 #elif defined(__WCHAR_UNSIGNED__) || (L'\0' - 1 > 0) 365 #define WCHAR_MIN (0 + L'\0') 366 #else 367 #define WCHAR_MIN (-0x7fffffff - 1 + L'\0') 368 #endif 369 #endif 370 371 /* This must match definition in <wchar.h> */ 372 #ifndef WCHAR_MAX 373 #ifdef __WCHAR_MAX__ 374 #define WCHAR_MAX (__WCHAR_MAX__) 375 #elif defined(__WCHAR_UNSIGNED__) || (L'\0' - 1 > 0) 376 #define WCHAR_MAX (0xffffffffu + L'\0') 377 #else 378 #define WCHAR_MAX (0x7fffffff + L'\0') 379 #endif 380 #endif 381 382 /* wint_t is unsigned int on almost all GCC targets. */ 383 #ifdef __WINT_MAX__ 384 #define WINT_MAX (__WINT_MAX__) 385 #else 386 #define WINT_MAX (__STDINT_EXP(INT_MAX) * 2U + 1U) 387 #endif 388 #ifdef __WINT_MIN__ 389 #define WINT_MIN (__WINT_MIN__) 390 #else 391 #define WINT_MIN (0U) 392 #endif 393 394 /** Macros for minimum-width integer constant expressions */ 395 #ifdef __INT8_C 396 #define INT8_C(x) __INT8_C(x) 397 #define UINT8_C(x) __UINT8_C(x) 398 #else 399 #define INT8_C(x) x 400 #if __STDINT_EXP(INT_MAX) > 0x7f 401 #define UINT8_C(x) x 402 #else 403 #define UINT8_C(x) x##U 404 #endif 405 #endif 406 407 #ifdef __INT16_C 408 #define INT16_C(x) __INT16_C(x) 409 #define UINT16_C(x) __UINT16_C(x) 410 #else 411 #define INT16_C(x) x 412 #if __STDINT_EXP(INT_MAX) > 0x7fff 413 #define UINT16_C(x) x 414 #else 415 #define UINT16_C(x) x##U 416 #endif 417 #endif 418 419 #ifdef __INT32_C 420 #define INT32_C(x) __INT32_C(x) 421 #define UINT32_C(x) __UINT32_C(x) 422 #else 423 #if defined (_INT32_EQ_LONG) 424 #define INT32_C(x) x##L 425 #define UINT32_C(x) x##UL 426 #else 427 #define INT32_C(x) x 428 #define UINT32_C(x) x##U 429 #endif 430 #endif 431 432 #ifdef __INT64_C 433 #define INT64_C(x) __INT64_C(x) 434 #define UINT64_C(x) __UINT64_C(x) 435 #else 436 #if __int64_t_defined 437 #if __have_long64 438 #define INT64_C(x) x##L 439 #define UINT64_C(x) x##UL 440 #else 441 #define INT64_C(x) x##LL 442 #define UINT64_C(x) x##ULL 443 #endif 444 #endif 445 #endif 446 447 /** Macros for greatest-width integer constant expression */ 448 #ifdef __INTMAX_C 449 #define INTMAX_C(x) __INTMAX_C(x) 450 #define UINTMAX_C(x) __UINTMAX_C(x) 451 #else 452 #if __have_long64 453 #define INTMAX_C(x) x##L 454 #define UINTMAX_C(x) x##UL 455 #else 456 #define INTMAX_C(x) x##LL 457 #define UINTMAX_C(x) x##ULL 458 #endif 459 #endif 460 461 462 #ifdef __cplusplus 463 } 464 #endif 465 466 #endif /* _STDINT_H */ 467