1/* Copyright 2026 uint (and contributors)
2
3Permission to use, copy, modify, and distribute this software for any
4purpose with or without fee is hereby granted, provided that the above
5copyright notice and this permission notice appear in all copies.
6
7THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
8WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
9MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
10ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
11WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
12ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
13OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
14
15/* Guidance:
16 If you want to use the shorthand type names (eg u8 instead of ule_u8), you
17 must define ULE_SHORT_TYPE_NAMES before including this header.
18
19 If you want to define your own pointer types, you must define ULE_UPTR_TYPE
20 and ULE_IPTR_TYPE before including this header. */
21
22#ifndef ULETYPES_H
23#define ULETYPES_H
24
25#include <limits.h>
26#include <stddef.h>
27
28#if CHAR_BIT != 8
29 #error "libule: 8-bit bytes are required"
30#endif
31
32/* 8-bit */
33typedef unsigned char ule_u8;
34typedef signed char ule_i8;
35
36/* 16-bit */
37#if USHRT_MAX == 0xFFFFU
38 typedef unsigned short ule_u16;
39 typedef signed short ule_i16;
40#elif UINT_MAX == 0xFFFFU
41 typedef unsigned int ule_u16;
42 typedef signed int ule_i16;
43#else
44 #error "libule: no 16-bit integer type"
45#endif
46
47/* 32-bit */
48#if UINT_MAX == 0xFFFFFFFFUL
49 typedef unsigned int ule_u32;
50 typedef signed int ule_i32;
51#elif ULONG_MAX == 0xFFFFFFFFUL
52 typedef unsigned long ule_u32;
53 typedef signed long ule_i32;
54#elif USHRT_MAX == 0xFFFFFFFFUL
55 typedef unsigned short ule_u32;
56 typedef signed short ule_i32;
57#else
58 #error "libule: no 32-bit integer type"
59#endif
60
61/* 64-bit */
62#if ULONG_MAX > 0xFFFFFFFFUL
63 typedef unsigned long ule_u64;
64 typedef signed long ule_i64;
65 #define ULE_HAS_64 1
66
67#elif defined(_MSC_VER)
68 typedef unsigned __int64 ule_u64;
69 typedef signed __int64 ule_i64;
70 #define ULE_HAS_64 1
71
72#elif defined(__GNUC__) || defined(__clang__)
73 __extension__ typedef unsigned long long ule_u64;
74 __extension__ typedef signed long long ule_i64;
75 #define ULE_HAS_64 1
76#endif
77
78/* Pointer Length Sizes */
79#if defined(ULE_UPTR_TYPE) != defined(ULE_IPTR_TYPE)
80 #error "libule: define both ULE_UPTR_TYPE and ULE_IPTR_TYPE"
81#endif
82
83#if defined(ULE_UPTR_TYPE)
84 typedef ULE_UPTR_TYPE ule_uptr;
85 typedef ULE_IPTR_TYPE ule_iptr;
86
87#elif defined(_WIN64)
88 typedef unsigned __int64 ule_uptr;
89 typedef signed __int64 ule_iptr;
90
91#elif defined(_WIN32)
92 typedef unsigned long ule_uptr;
93 typedef signed long ule_iptr;
94
95#elif defined(__LP64__) || defined(_LP64)
96 typedef unsigned long ule_uptr;
97 typedef signed long ule_iptr;
98
99#elif defined(__ILP32__) || defined(_ILP32)
100 typedef unsigned int ule_uptr;
101 typedef signed int ule_iptr;
102
103#else
104 #error "libule: define ULE_UPTR_TYPE and ULE_IPTR_TYPE for this target"
105#endif
106
107/* Limits */
108#define ULE_U8_MAX ((ule_u8)0xFFU)
109#define ULE_I8_MAX ((ule_i8)0x7F)
110#define ULE_I8_MIN ((ule_i8)(-0x7F - 1))
111
112#define ULE_U16_MAX ((ule_u16)0xFFFFU)
113#define ULE_I16_MAX ((ule_i16)0x7FFF)
114#define ULE_I16_MIN ((ule_i16)(-0x7FFF - 1))
115
116#define ULE_U32_MAX ((ule_u32)0xFFFFFFFFUL)
117#define ULE_I32_MAX ((ule_i32)0x7FFFFFFFL)
118#define ULE_I32_MIN ((ule_i32)(-0x7FFFFFFFL - 1L))
119
120#ifdef ULE_HAS_64
121 #define ULE_U64_MAX ((ule_u64)-1)
122 #define ULE_I64_MAX ((ule_i64)(ULE_U64_MAX >> 1))
123 #define ULE_I64_MIN ((ule_i64)(-ULE_I64_MAX - 1))
124#endif /* ULE_HAS_64 */
125
126/* Size types */
127typedef size_t ule_usize;
128typedef ptrdiff_t ule_isize;
129
130/* (Optional) Short names */
131#ifdef ULE_SHORT_TYPE_NAMES
132 typedef ule_u8 u8;
133 typedef ule_i8 i8;
134 typedef ule_u16 u16;
135 typedef ule_i16 i16;
136 typedef ule_u32 u32;
137 typedef ule_i32 i32;
138
139 #if defined(ULE_HAS_64)
140 typedef ule_u64 u64;
141 typedef ule_i64 i64;
142 #endif
143
144 typedef ule_uptr uptr;
145 typedef ule_iptr iptr;
146 typedef ule_usize usize;
147 typedef ule_isize isize;
148#endif /* ULE_SHORT_TYPE_NAMES */
149
150#endif /* ULETYPES_H */
151