1 /* ints.h -- create integer types for 8, 16, 32, and 64 bits 2 * Copyright (C) 2024 Mark Adler 3 * For conditions of distribution and use, see the copyright notice in zlib.h 4 * 5 * There exist compilers with limits.h, but not stdint.h or inttypes.h. 6 */ 7 8 #ifndef INTS_H 9 #define INTS_H 10 #include <limits.h> 11 #if defined(UCHAR_MAX) && UCHAR_MAX == 0xff 12 typedef signed char i8_t; 13 typedef unsigned char ui8_t; 14 #else 15 # error "no 8-bit integer" 16 #endif 17 #if defined(USHRT_MAX) && USHRT_MAX == 0xffff 18 typedef short i16_t; 19 typedef unsigned short ui16_t; 20 #elif defined(UINT_MAX) && UINT_MAX == 0xffff 21 typedef int i16_t; 22 typedef unsigned ui16_t; 23 #else 24 # error "no 16-bit integer" 25 #endif 26 #if defined(UINT_MAX) && UINT_MAX == 0xffffffff 27 typedef int i32_t; 28 typedef unsigned ui32_t; 29 # define PI32 "d" 30 # define PUI32 "u" 31 #elif defined(ULONG_MAX) && ULONG_MAX == 0xffffffff 32 typedef long i32_t; 33 typedef unsigned long ui32_t; 34 # define PI32 "ld" 35 # define PUI32 "lu" 36 #else 37 # error "no 32-bit integer" 38 #endif 39 #if defined(ULONG_MAX) && ULONG_MAX == 0xffffffffffffffff 40 typedef long i64_t; 41 typedef unsigned long ui64_t; 42 # define PI64 "ld" 43 # define PUI64 "lu" 44 #elif defined(ULLONG_MAX) && ULLONG_MAX == 0xffffffffffffffff 45 typedef long long i64_t; 46 typedef unsigned long long ui64_t; 47 # define PI64 "lld" 48 # define PUI64 "llu" 49 #elif defined(ULONG_LONG_MAX) && ULONG_LONG_MAX == 0xffffffffffffffff 50 typedef long long i64_t; 51 typedef unsigned long long ui64_t; 52 # define PI64 "lld" 53 # define PUI64 "llu" 54 #else 55 # error "no 64-bit integer" 56 #endif 57 #endif 58