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+