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