commit 27086f6
uint
·
2026-08-07 01:09:01 +0000 UTC
parent 1da1a67
Types: Create fixed width portable types
1 files changed,
+151,
-0
+151,
-0
1@@ -0,0 +1,151 @@
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+#elif UINT_MAX == 0xFFFFU
42+ typedef unsigned int ule_u16;
43+ typedef signed int ule_i16;
44+#else
45+ #error "libule: no 16-bit integer type"
46+#endif
47+
48+/* 32-bit */
49+#if UINT_MAX == 0xFFFFFFFFUL
50+ typedef unsigned int ule_u32;
51+ typedef signed int ule_i32;
52+#elif ULONG_MAX == 0xFFFFFFFFUL
53+ typedef unsigned long ule_u32;
54+ typedef signed long ule_i32;
55+#elif USHRT_MAX == 0xFFFFFFFFUL
56+ typedef unsigned short ule_u32;
57+ typedef signed short ule_i32;
58+#else
59+ #error "libule: no 32-bit integer type"
60+#endif
61+
62+/* 64-bit */
63+#if ULONG_MAX > 0xFFFFFFFFUL
64+ typedef unsigned long ule_u64;
65+ typedef signed long ule_i64;
66+ #define ULE_HAS_64 1
67+
68+#elif defined(_MSC_VER)
69+ typedef unsigned __int64 ule_u64;
70+ typedef signed __int64 ule_i64;
71+ #define ULE_HAS_64 1
72+
73+#elif defined(__GNUC__) || defined(__clang__)
74+ __extension__ typedef unsigned long long ule_u64;
75+ __extension__ typedef signed long long ule_i64;
76+ #define ULE_HAS_64 1
77+#endif
78+
79+/* Pointer Length Sizes */
80+#if defined(ULE_UPTR_TYPE) != defined(ULE_IPTR_TYPE)
81+ #error "libule: define both ULE_UPTR_TYPE and ULE_IPTR_TYPE"
82+#endif
83+
84+#if defined(ULE_UPTR_TYPE)
85+ typedef ULE_UPTR_TYPE ule_uptr;
86+ typedef ULE_IPTR_TYPE ule_iptr;
87+
88+#elif defined(_WIN64)
89+ typedef unsigned __int64 ule_uptr;
90+ typedef signed __int64 ule_iptr;
91+
92+#elif defined(_WIN32)
93+ typedef unsigned long ule_uptr;
94+ typedef signed long ule_iptr;
95+
96+#elif defined(__LP64__) || defined(_LP64)
97+ typedef unsigned long ule_uptr;
98+ typedef signed long ule_iptr;
99+
100+#elif defined(__ILP32__) || defined(_ILP32)
101+ typedef unsigned int ule_uptr;
102+ typedef signed int ule_iptr;
103+
104+#else
105+ #error "libule: define ULE_UPTR_TYPE and ULE_IPTR_TYPE for this target"
106+#endif
107+
108+/* Limits */
109+#define ULE_U8_MAX ((ule_u8)0xFFU)
110+#define ULE_I8_MAX ((ule_i8)0x7F)
111+#define ULE_I8_MIN ((ule_i8)(-0x7F - 1))
112+
113+#define ULE_U16_MAX ((ule_u16)0xFFFFU)
114+#define ULE_I16_MAX ((ule_i16)0x7FFF)
115+#define ULE_I16_MIN ((ule_i16)(-0x7FFF - 1))
116+
117+#define ULE_U32_MAX ((ule_u32)0xFFFFFFFFUL)
118+#define ULE_I32_MAX ((ule_i32)0x7FFFFFFFL)
119+#define ULE_I32_MIN ((ule_i32)(-0x7FFFFFFFL - 1L))
120+
121+#ifdef ULE_HAS_64
122+ #define ULE_U64_MAX ((ule_u64)-1)
123+ #define ULE_I64_MAX ((ule_i64)(ULE_U64_MAX >> 1))
124+ #define ULE_I64_MIN ((ule_i64)(-ULE_I64_MAX - 1))
125+#endif /* ULE_HAS_64 */
126+
127+/* Size types */
128+typedef size_t ule_usize;
129+typedef ptrdiff_t ule_isize;
130+
131+/* (Optional) Short names */
132+#ifdef ULE_SHORT_TYPE_NAMES
133+ typedef ule_u8 u8;
134+ typedef ule_i8 i8;
135+ typedef ule_u16 u16;
136+ typedef ule_i16 i16;
137+ typedef ule_u32 u32;
138+ typedef ule_i32 i32;
139+
140+ #if defined(ULE_HAS_64)
141+ typedef ule_u64 u64;
142+ typedef ule_i64 i64;
143+ #endif
144+
145+ typedef ule_uptr uptr;
146+ typedef ule_iptr iptr;
147+ typedef ule_usize usize;
148+ typedef ule_isize isize;
149+#endif /* ULE_SHORT_TYPE_NAMES */
150+
151+#endif /* ULETYPES_H */
152+