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+