11 #ifndef OPTK_INTEGER_H_
12 #define OPTK_INTEGER_H_
23 #if defined __STDC_VERSION__
24 # if __STDC_VERSION__ >= 199901L
25 # ifndef OPTK__STDC99__
26 # define OPTK__STDC99__ 1
31 # if defined SSIZE_MAX && defined _POSIX_SSIZE_MAX
32 # if SSIZE_MAX > 0 && _POSIX_SSIZE_MAX > 0
34 # if defined _POSIX_VERSION
35 # if _POSIX_VERSION >= 200112L
36 # ifndef OPTK__STDC99__
37 # define OPTK__STDC99__ 1
45 #if defined OPTK__STDC99__
47 #ifndef __STDC_LIMIT_MACROS
48 # define __STDC_LIMIT_MACROS 1
50 #ifndef __STDC_CONSTANT_MACROS
51 # define __STDC_CONSTANT_MACROS 1
53 #ifndef __STDC_FORMAT_MACROS
54 # define __STDC_FORMAT_MACROS 1
73 typedef int_least8_t optk_int8_t;
74 typedef uint_least8_t optk_uint8_t;
75 typedef int_least16_t optk_int16_t;
76 typedef uint_least16_t optk_uint16_t;
77 typedef int_least32_t optk_int32_t;
78 typedef uint_least32_t optk_uint32_t;
79 typedef int_least64_t optk_int64_t;
80 typedef uint_least64_t optk_uint64_t;
82 #define OPTK_INT8_MIN INT_LEAST8_MIN
83 #define OPTK_INT8_MAX INT_LEAST8_MAX
84 #define OPTK_UINT8_MAX UINT_LEAST8_MAX
85 #define OPTK_INT16_MIN INT_LEAST16_MIN
86 #define OPTK_INT16_MAX INT_LEAST16_MAX
87 #define OPTK_UINT16_MAX UINT_LEAST16_MAX
88 #define OPTK_INT32_MIN INT_LEAST32_MIN
89 #define OPTK_INT32_MAX INT_LEAST32_MAX
90 #define OPTK_UINT32_MAX UINT_LEAST32_MAX
91 #define OPTK_INT64_MIN INT_LEAST64_MIN
92 #define OPTK_INT64_MAX INT_LEAST64_MAX
93 #define OPTK_UINT64_MAX UINT_LEAST64_MAX
95 #define OPTK_INT8_C(value) INT8_C(value)
96 #define OPTK_UINT8_C(value) UINT8_C(value)
97 #define OPTK_INT16_C(value) INT16_C(value)
98 #define OPTK_UINT16_C(value) UINT16_C(value)
99 #define OPTK_INT32_C(value) INT32_C(value)
100 #define OPTK_UINT32_C(value) UINT32_C(value)
101 #define OPTK_INT64_C(value) INT64_C(value)
102 #define OPTK_UINT64_C(value) UINT64_C(value)
104 #define OPTK_SCNd8 SCNdLEAST8
105 #define OPTK_SCNi8 SCNiLEAST8
106 #define OPTK_SCNu8 SCNuLEAST8
107 #define OPTK_SCNo8 SCNoLEAST8
108 #define OPTK_SCNx8 SCNxLEAST8
109 #define OPTK_SCNd16 SCNdLEAST16
110 #define OPTK_SCNi16 SCNiLEAST16
111 #define OPTK_SCNu16 SCNuLEAST16
112 #define OPTK_SCNo16 SCNoLEAST16
113 #define OPTK_SCNx16 SCNxLEAST16
114 #define OPTK_SCNd32 SCNdLEAST32
115 #define OPTK_SCNi32 SCNiLEAST32
116 #define OPTK_SCNu32 SCNuLEAST32
117 #define OPTK_SCNo32 SCNoLEAST32
118 #define OPTK_SCNx32 SCNxLEAST32
119 #define OPTK_SCNd64 SCNdLEAST64
120 #define OPTK_SCNi64 SCNiLEAST64
121 #define OPTK_SCNu64 SCNuLEAST64
122 #define OPTK_SCNo64 SCNoLEAST64
123 #define OPTK_SCNx64 SCNxLEAST64
125 #define OPTK_PRId8 PRIdLEAST8
126 #define OPTK_PRIi8 PRIiLEAST8
127 #define OPTK_PRIu8 PRIuLEAST8
128 #define OPTK_PRIo8 PRIoLEAST8
129 #define OPTK_PRIx8 PRIxLEAST8
130 #define OPTK_PRIX8 PRIXLEAST8
131 #define OPTK_PRId16 PRIdLEAST16
132 #define OPTK_PRIi16 PRIiLEAST16
133 #define OPTK_PRIu16 PRIuLEAST16
134 #define OPTK_PRIo16 PRIoLEAST16
135 #define OPTK_PRIx16 PRIxLEAST16
136 #define OPTK_PRIX16 PRIXLEAST16
137 #define OPTK_PRId32 PRIdLEAST32
138 #define OPTK_PRIi32 PRIiLEAST32
139 #define OPTK_PRIu32 PRIuLEAST32
140 #define OPTK_PRIo32 PRIoLEAST32
141 #define OPTK_PRIx32 PRIxLEAST32
142 #define OPTK_PRIX32 PRIXLEAST32
143 #define OPTK_PRId64 PRIdLEAST64
144 #define OPTK_PRIi64 PRIiLEAST64
145 #define OPTK_PRIu64 PRIuLEAST64
146 #define OPTK_PRIo64 PRIoLEAST64
147 #define OPTK_PRIx64 PRIxLEAST64
148 #define OPTK_PRIX64 PRIXLEAST64
155 #ifndef OPTK__LLONG_TYPE__
156 # if defined _I64_MIN && defined _I64_MAX && defined _UI64_MAX
157 # if (defined _WIN32 || defined __WIN32__) && _I64_MAX > LONG_MAX
158 # define OPTK__LLONG_TYPE__ __int64
159 # define OPTK__LLONG_MIN__ _I64_MIN
160 # define OPTK__LLONG_MAX__ _I64_MAX
161 # define OPTK__ULLONG_MAX__ _UI64_MAX
162 # if defined LLONG_MIN && defined LLONG_MAX && defined ULLONG_MAX
163 # if !(_I64_MAX == LLONG_MAX && _UI64_MAX == ULLONG_MAX)
164 # error Preprocessor assertion failed: long long limits mismatch
166 # define OPTK__LLONG_C__(value) value##LL
167 # define OPTK__ULLONG_C__(value) value##ULL
169 # define OPTK__LLONG_C__(value) value##i64
170 # define OPTK__ULLONG_C__(value) value##ui64
172 # define OPTK__LLONG_SCNd__ "I64d"
173 # define OPTK__LLONG_SCNi__ "I64i"
174 # define OPTK__ULLONG_SCNu__ "I64u"
175 # define OPTK__ULLONG_SCNo__ "I64o"
176 # define OPTK__ULLONG_SCNx__ "I64x"
177 # define OPTK__LLONG_PRId__ "I64d"
178 # define OPTK__LLONG_PRIi__ "I64i"
179 # define OPTK__ULLONG_PRIu__ "I64u"
180 # define OPTK__ULLONG_PRIo__ "I64o"
181 # define OPTK__ULLONG_PRIx__ "I64x"
182 # define OPTK__ULLONG_PRIX__ "I64X"
186 #ifndef OPTK__LLONG_TYPE__
187 # if defined LLONG_MIN && defined LLONG_MAX && defined ULLONG_MAX
188 # if !(LLONG_MAX >= 0x7fffffffffffffffLL && LLONG_MIN <= -LLONG_MAX)
189 # error Preprocessor assertion failed: LLONG_MIN and LLONG_MAX are incorrect
191 # if !(ULLONG_MAX >= 0xffffffffffffffffLL)
192 # error Preprocessor assertion failed: ULLONG_MAX is incorrect
194 # define OPTK__LLONG_TYPE__ long long
195 # define OPTK__LLONG_MIN__ LLONG_MIN
196 # define OPTK__LLONG_MAX__ LLONG_MAX
197 # define OPTK__ULLONG_MAX__ ULLONG_MAX
198 # define OPTK__LLONG_C__(value) value##LL
199 # define OPTK__ULLONG_C__(value) value##ULL
200 # define OPTK__LLONG_SCNd__ "lld"
201 # define OPTK__LLONG_SCNi__ "lli"
202 # define OPTK__ULLONG_SCNu__ "llu"
203 # define OPTK__ULLONG_SCNo__ "llo"
204 # define OPTK__ULLONG_SCNx__ "llx"
205 # define OPTK__LLONG_PRId__ "lld"
206 # define OPTK__LLONG_PRIi__ "lli"
207 # define OPTK__ULLONG_PRIu__ "llu"
208 # define OPTK__ULLONG_PRIo__ "llo"
209 # define OPTK__ULLONG_PRIx__ "llx"
210 # define OPTK__ULLONG_PRIX__ "llX"
217 #if SCHAR_MAX == 0x7f && SHRT_MAX == 0x7fff && INT_MAX == 0x7fffffffL
218 # if LONG_MAX > INT_MAX
219 # if LONG_MAX == 0x7fffffffffffffffL
220 # define OPTK__I8_I16_I32_I64__ 1
222 # elif defined OPTK__LLONG_MAX__
223 # if OPTK__LLONG_MAX__ == OPTK__LLONG_C__(0x7fffffffffffffff)
224 # define OPTK__I8_I16_I32_I64__ 1
229 #if defined OPTK__I8_I16_I32_I64__
235 typedef signed char optk_int8_t;
236 typedef unsigned char optk_uint8_t;
237 typedef short optk_int16_t;
238 typedef unsigned short optk_uint16_t;
239 typedef int optk_int32_t;
240 typedef unsigned int optk_uint32_t;
241 #if LONG_MAX > INT_MAX
242 typedef long optk_int64_t;
243 typedef unsigned long optk_uint64_t;
245 typedef OPTK__LLONG_TYPE__ optk_int64_t;
246 typedef unsigned OPTK__LLONG_TYPE__ optk_uint64_t;
249 #define OPTK_INT8_MIN SCHAR_MIN
250 #define OPTK_INT8_MAX SCHAR_MAX
251 #define OPTK_UINT8_MAX UCHAR_MAX
252 #define OPTK_INT16_MIN SHRT_MIN
253 #define OPTK_INT16_MAX SHRT_MAX
254 #define OPTK_UINT16_MAX USHRT_MAX
255 #define OPTK_INT32_MIN INT_MIN
256 #define OPTK_INT32_MAX INT_MAX
257 #define OPTK_UINT32_MAX UINT_MAX
258 #if LONG_MAX > INT_MAX
259 # define OPTK_INT64_MIN LONG_MIN
260 # define OPTK_INT64_MAX LONG_MAX
261 # define OPTK_UINT64_MAX ULONG_MAX
263 # define OPTK_INT64_MIN OPTK__LLONG_MIN__
264 # define OPTK_INT64_MAX OPTK__LLONG_MAX__
265 # define OPTK_UINT64_MAX OPTK__ULLONG_MAX__
268 #define OPTK_INT8_C(value) (SCHAR_MAX - SCHAR_MAX + (value))
269 #define OPTK_UINT8_C(value) (UCHAR_MAX - UCHAR_MAX + (value))
270 #define OPTK_INT16_C(value) (SHRT_MAX - SHRT_MAX + (value))
271 #define OPTK_UINT16_C(value) (USHRT_MAX - USHRT_MAX + (value))
272 #define OPTK_INT32_C(value) (INT_MAX - INT_MAX + (value))
273 #define OPTK_UINT32_C(value) (UINT_MAX - UINT_MAX + (value))
274 #if LONG_MAX > INT_MAX
275 # define OPTK_INT64_C(value) value##L
276 # define OPTK_UINT64_C(value) value##UL
278 # define OPTK_INT64_C(value) OPTK__LLONG_C__(value)
279 # define OPTK_UINT64_C(value) OPTK__ULLONG_C__(value)
283 # define OPTK_SCNd8 "hhd"
284 # define OPTK_SCNi8 "hhi"
285 # define OPTK_SCNu8 "hhu"
286 # define OPTK_SCNo8 "hho"
287 # define OPTK_SCNx8 "hhx"
289 #define OPTK_SCNd16 "hd"
290 #define OPTK_SCNi16 "hi"
291 #define OPTK_SCNu16 "hu"
292 #define OPTK_SCNo16 "ho"
293 #define OPTK_SCNx16 "hx"
294 #define OPTK_SCNd32 "d"
295 #define OPTK_SCNi32 "i"
296 #define OPTK_SCNu32 "u"
297 #define OPTK_SCNo32 "o"
298 #define OPTK_SCNx32 "x"
299 #if LONG_MAX > INT_MAX
300 # define OPTK_SCNd64 "ld"
301 # define OPTK_SCNi64 "li"
302 # define OPTK_SCNu64 "lu"
303 # define OPTK_SCNo64 "lo"
304 # define OPTK_SCNx64 "lx"
306 # define OPTK_SCNd64 OPTK__LLONG_SCNd__
307 # define OPTK_SCNi64 OPTK__LLONG_SCNi__
308 # define OPTK_SCNu64 OPTK__ULLONG_SCNu__
309 # define OPTK_SCNo64 OPTK__ULLONG_SCNo__
310 # define OPTK_SCNx64 OPTK__ULLONG_SCNx__
313 #define OPTK_PRId8 "d"
314 #define OPTK_PRIi8 "i"
315 #define OPTK_PRIu8 "u"
316 #define OPTK_PRIo8 "o"
317 #define OPTK_PRIx8 "x"
318 #define OPTK_PRIX8 "X"
319 #define OPTK_PRId16 "d"
320 #define OPTK_PRIi16 "i"
321 #define OPTK_PRIu16 "u"
322 #define OPTK_PRIo16 "o"
323 #define OPTK_PRIx16 "x"
324 #define OPTK_PRIX16 "X"
325 #define OPTK_PRId32 "d"
326 #define OPTK_PRIi32 "i"
327 #define OPTK_PRIu32 "u"
328 #define OPTK_PRIo32 "o"
329 #define OPTK_PRIx32 "x"
330 #define OPTK_PRIX32 "X"
331 #if LONG_MAX > INT_MAX
332 # define OPTK_PRId64 "ld"
333 # define OPTK_PRIi64 "li"
334 # define OPTK_PRIu64 "lu"
335 # define OPTK_PRIo64 "lo"
336 # define OPTK_PRIx64 "lx"
337 # define OPTK_PRIX64 "lX"
339 # define OPTK_PRId64 OPTK__LLONG_PRId__
340 # define OPTK_PRIi64 OPTK__LLONG_PRIi__
341 # define OPTK_PRIu64 OPTK__ULLONG_PRIu__
342 # define OPTK_PRIo64 OPTK__ULLONG_PRIo__
343 # define OPTK_PRIx64 OPTK__ULLONG_PRIx__
344 # define OPTK_PRIX64 OPTK__ULLONG_PRIX__
349 # error Could not auto-configure the integer types.