|
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
|
|