|
131
|
1 /* paper-stdint.h -- replacement stdint.h that does as much as it can
|
|
|
2 * without outside help
|
|
|
3 *
|
|
|
4 * Copyright (C) 2025 Paper
|
|
|
5 *
|
|
|
6 * This software is provided 'as-is', without any express or implied
|
|
|
7 * warranty. In no event will the authors be held liable for any damages
|
|
|
8 * arising from the use of this software.
|
|
|
9 *
|
|
|
10 * Permission is granted to anyone to use this software for any purpose,
|
|
|
11 * including commercial applications, and to alter it and redistribute it
|
|
|
12 * freely, subject to the following restrictions:
|
|
|
13 *
|
|
|
14 * 1. The origin of this software must not be misrepresented; you must not
|
|
|
15 * claim that you wrote the original software. If you use this software
|
|
|
16 * in a product, an acknowledgment in the product documentation would be
|
|
|
17 * appreciated but is not required.
|
|
|
18 * 2. Altered source versions must be plainly marked as such, and must not be
|
|
|
19 * misrepresented as being the original software.
|
|
|
20 * 3. This notice may not be removed or altered from any source distribution.
|
|
|
21 */
|
|
|
22
|
|
|
23 /**
|
|
|
24 * This is a drop-in replacement stdint.h that provides a
|
|
|
25 * subset of the features that the C99 equivalent provides.
|
|
|
26 *
|
|
|
27 * There are some caveats:
|
|
|
28 * - [u]intptr_t is not here. There's no way to do it portably.
|
|
|
29 * Thus INTPTR_MAX and friends are not here either. It may
|
|
|
30 * be possible to do it with __LP64__ or something, but that
|
|
|
31 * really isn't portable either :(
|
|
|
32 * - ptrdiff_t is not here.
|
|
|
33 * - int64_t relies on platform-specific extensions, or C99
|
|
|
34 * long long. Add your platform for funsies!
|
|
|
35 * - SIZE_MAX cannot be done portably. The closest thing we have
|
|
|
36 * is (~(size_t)0), which does not work in preprocessor
|
|
|
37 * expressions.
|
|
|
38 * - WINT_MIN cannot be done portably, nor can WCHAR_MIN,
|
|
|
39 * WINT_MAX, or WCHAR_MAX.
|
|
|
40 * - I have not implemented scanf specifiers. I don't use
|
|
|
41 * them, and neither should you. (the real reason is that
|
|
|
42 * "%hhd" was only added in C99).
|
|
|
43 *
|
|
|
44 * Maybe there's just something I missed. As far as I know
|
|
|
45 * these are impossible to do without compiler-specific
|
|
|
46 * extensions. --paper
|
|
|
47 **/
|
|
|
48
|
|
|
49 #ifndef PAPER_STDINT_H_
|
|
|
50 #define PAPER_STDINT_H_
|
|
|
51
|
|
|
52 /* need limits.h for INT_MIN etc */
|
|
|
53 #include <limits.h>
|
|
|
54
|
|
|
55 #define INT8_MAX 0x7F
|
|
|
56 #define INT8_MIN (-INT8_MAX - 1)
|
|
|
57 #define INT16_MAX 0x7FFF
|
|
|
58 #define INT16_MIN (-INT16_MAX - 1)
|
|
|
59 #define INT32_MAX 0x7FFFFFFF
|
|
|
60 #define INT32_MIN (-INT32_MAX - 1)
|
|
|
61 #define INT64_MAX 0x7FFFFFFFFFFFFFFF
|
|
|
62 #define INT64_MIN (-INT64_MAX - 1)
|
|
|
63 #define UINT8_MAX 0xFFu
|
|
|
64 #define UINT16_MAX 0xFFFFu
|
|
|
65 #define UINT32_MAX 0xFFFFFFFFu
|
|
|
66 #define UINT64_MAX 0xFFFFFFFFFFFFFFFFu
|
|
|
67
|
|
|
68 /* ?? */
|
|
|
69 #ifndef SIZE_MAX
|
|
|
70 # define SIZE_MAX (~(size_t)0)
|
|
|
71 #endif
|
|
|
72
|
|
|
73 #if UCHAR_MAX == UINT8_MAX
|
|
|
74 typedef unsigned char uint8_t;
|
|
|
75 # define PRIu8 "u"
|
|
|
76 # define PRIo8 "o"
|
|
|
77 # define PRIx8 "x"
|
|
|
78 # define PRIX8 "X"
|
|
|
79 # define UINT8_C(x) x ## U
|
|
|
80 #else
|
|
|
81 # error "no unsigned 8-bit type"
|
|
|
82 #endif
|
|
|
83
|
|
|
84 #if UCHAR_MAX == UINT16_MAX
|
|
|
85 typedef unsigned char uint16_t;
|
|
|
86 # define PRIu16 "u"
|
|
|
87 # define PRIo16 "o"
|
|
|
88 # define PRIx16 "x"
|
|
|
89 # define PRIX16 "X"
|
|
|
90 # define UINT16_C(x) x ## U
|
|
|
91 #elif USHRT_MAX == UINT16_MAX
|
|
|
92 typedef unsigned short uint16_t;
|
|
|
93 # define PRIu16 "u"
|
|
|
94 # define PRIo16 "o"
|
|
|
95 # define PRIx16 "x"
|
|
|
96 # define PRIX16 "X"
|
|
|
97 # define UINT16_C(x) x ## U
|
|
|
98 #elif UINT_MAX == UINT16_MAX
|
|
|
99 typedef unsigned int uint16_t;
|
|
|
100 # define PRIu16 "u"
|
|
|
101 # define PRIo16 "o"
|
|
|
102 # define PRIx16 "x"
|
|
|
103 # define PRIX16 "X"
|
|
|
104 # define UINT16_C(x) x ## U
|
|
|
105 #else
|
|
|
106 # error "no unsigned 16-bit type"
|
|
|
107 #endif
|
|
|
108
|
|
|
109 #if UCHAR_MAX == UINT32_MAX
|
|
|
110 typedef unsigned char uint32_t;
|
|
|
111 # define PRIu32 "u"
|
|
|
112 # define PRIo32 "o"
|
|
|
113 # define PRIx32 "x"
|
|
|
114 # define PRIX32 "X"
|
|
|
115 # define UINT32_C(x) x ## U
|
|
|
116 #elif USHRT_MAX == UINT32_MAX
|
|
|
117 typedef unsigned short uint32_t;
|
|
|
118 # define PRIu32 "u"
|
|
|
119 # define PRIo32 "o"
|
|
|
120 # define PRIx32 "x"
|
|
|
121 # define PRIX32 "X"
|
|
|
122 # define UINT32_C(x) x ## U
|
|
|
123 #elif UINT_MAX == UINT32_MAX
|
|
|
124 typedef unsigned int uint32_t;
|
|
|
125 # define PRIu32 "u"
|
|
|
126 # define PRIo32 "o"
|
|
|
127 # define PRIx32 "x"
|
|
|
128 # define PRIX32 "X"
|
|
|
129 # define UINT32_C(x) x ## U
|
|
|
130 #elif ULONG_MAX == UINT32_MAX
|
|
|
131 typedef unsigned long uint32_t;
|
|
|
132 # define PRIu32 "lu"
|
|
|
133 # define PRIo32 "lo"
|
|
|
134 # define PRIx32 "lx"
|
|
|
135 # define PRIX32 "lX"
|
|
|
136 # define UINT32_C(x) x ## UL
|
|
|
137 #else
|
|
|
138 # error "no unsigned 32-bit type"
|
|
|
139 #endif
|
|
|
140
|
|
|
141 #if UCHAR_MAX == UINT64_MAX
|
|
|
142 typedef unsigned char uint64_t;
|
|
|
143 # define PRIu64 "u"
|
|
|
144 # define PRIo64 "o"
|
|
|
145 # define PRIx64 "x"
|
|
|
146 # define PRIX64 "X"
|
|
|
147 # define UINT64_C(x) x ## U
|
|
|
148 #elif USHRT_MAX == UINT64_MAX
|
|
|
149 typedef unsigned short uint64_t;
|
|
|
150 # define PRIu64 "u"
|
|
|
151 # define PRIo64 "o"
|
|
|
152 # define PRIx64 "x"
|
|
|
153 # define PRIX64 "X"
|
|
|
154 # define UINT64_C(x) x ## U
|
|
|
155 #elif UINT_MAX == UINT64_MAX
|
|
|
156 typedef unsigned int uint64_t;
|
|
|
157 # define PRIu64 "u"
|
|
|
158 # define PRIo64 "o"
|
|
|
159 # define PRIx64 "x"
|
|
|
160 # define PRIX64 "X"
|
|
|
161 # define UINT64_C(x) x ## U
|
|
|
162 #elif ULONG_MAX == UINT64_MAX
|
|
|
163 typedef unsigned long uint64_t;
|
|
|
164 # define PRIu64 "lu"
|
|
|
165 # define PRIo64 "lo"
|
|
|
166 # define PRIx64 "lx"
|
|
|
167 # define PRIX64 "lX"
|
|
|
168 # define UINT64_C(x) x ## UL
|
|
|
169 #elif defined(_MSC_VER)
|
|
|
170 typedef unsigned __int64 uint64_t;
|
|
|
171 # define PRIu64 "I64u"
|
|
|
172 # define PRIo64 "I64o"
|
|
|
173 # define PRIx64 "I64x"
|
|
|
174 # define PRIX64 "I64X"
|
|
|
175 # define UINT64_C(x) x ## Ui64
|
|
|
176 #elif ULLONG_MAX == UINT64_MAX
|
|
|
177 /* C99 */
|
|
|
178 typedef unsigned long long uint64_t;
|
|
|
179 # define PRIu64 "llu"
|
|
|
180 # define PRIo64 "llo"
|
|
|
181 # define PRIx64 "llx"
|
|
|
182 # define PRIX64 "llX"
|
|
|
183 # define UINT64_C(x) x ## ULL
|
|
|
184 #else
|
|
|
185 # error "no unsigned 64-bit type"
|
|
|
186 #endif
|
|
|
187
|
|
|
188 #if SCHAR_MIN == INT8_MIN && SCHAR_MAX == INT8_MAX
|
|
|
189 typedef signed char int8_t;
|
|
|
190 # define PRId8 "d"
|
|
|
191 # define INT8_C(x) x
|
|
|
192 #else
|
|
|
193 # error "no signed 8-bit type"
|
|
|
194 #endif
|
|
|
195
|
|
|
196 #if SCHAR_MIN == INT16_MIN && SCHAR_MAX == INT16_MAX
|
|
|
197 typedef signed char int16_t;
|
|
|
198 # define PRId16 "d"
|
|
|
199 # define INT16_C(x) x
|
|
|
200 #elif SHRT_MIN == INT16_MIN && SHRT_MAX == INT16_MAX
|
|
|
201 typedef signed short int16_t;
|
|
|
202 # define PRId16 "d"
|
|
|
203 # define INT16_C(x) x
|
|
|
204 #elif INT_MIN == INT16_MIN && INT_MAX == INT16_MAX
|
|
|
205 typedef signed int int16_t;
|
|
|
206 # define PRId16 "d"
|
|
|
207 # define INT16_C(x) x
|
|
|
208 #else
|
|
|
209 # error "no signed 16-bit type"
|
|
|
210 #endif
|
|
|
211
|
|
|
212 #if SCHAR_MIN == INT32_MIN && SCHAR_MAX == INT32_MAX
|
|
|
213 typedef signed char int32_t;
|
|
|
214 # define PRId32 "d"
|
|
|
215 # define INT32_C(x) x
|
|
|
216 #elif SHRT_MIN == INT32_MIN && SHRT_MAX == INT32_MAX
|
|
|
217 typedef signed short int32_t;
|
|
|
218 # define PRId32 "d"
|
|
|
219 # define INT32_C(x) x
|
|
|
220 #elif INT_MIN == INT32_MIN && INT_MAX == INT32_MAX
|
|
|
221 typedef signed int int32_t;
|
|
|
222 # define PRId32 "d"
|
|
|
223 # define INT32_C(x) x
|
|
|
224 #elif LONG_MIN == INT32_MIN && LONG_MAX == INT32_MAX
|
|
|
225 typedef signed long int32_t;
|
|
|
226 # define PRId32 "ld"
|
|
|
227 # define INT32_C(x) x ## L
|
|
|
228 #else
|
|
|
229 # error "no signed 32-bit type"
|
|
|
230 #endif
|
|
|
231
|
|
|
232 #if SCHAR_MIN == INT64_MIN && SCHAR_MAX == INT64_MAX
|
|
|
233 typedef signed char int64_t;
|
|
|
234 # define PRId64 "d"
|
|
|
235 # define INT64_C(x) x
|
|
|
236 #elif SHRT_MIN == INT64_MIN && SHRT_MAX == INT64_MAX
|
|
|
237 typedef signed short int64_t;
|
|
|
238 # define PRId64 "d"
|
|
|
239 # define INT64_C(x) x
|
|
|
240 #elif INT_MIN == INT64_MIN && INT_MAX == INT64_MAX
|
|
|
241 typedef signed int int64_t;
|
|
|
242 # define PRId64 "d"
|
|
|
243 # define INT64_C(x) x
|
|
|
244 #elif LONG_MIN == INT64_MIN && LONG_MAX == INT64_MAX
|
|
|
245 typedef signed long int64_t;
|
|
|
246 # define PRId64 "ld"
|
|
|
247 # define INT64_C(x) x ## L
|
|
|
248 #elif defined(_MSC_VER)
|
|
|
249 typedef signed __int64 int64_t;
|
|
|
250 # define PRId64 "I64d"
|
|
|
251 # define INT64_C(x) x ## i64
|
|
|
252 #elif LLONG_MIN == INT64_MIN && LLONG_MAX == INT64_MAX
|
|
|
253 typedef signed long long int64_t;
|
|
|
254 # define PRId64 "lld"
|
|
|
255 # define INT64_C(x) x ## LL
|
|
|
256 #else
|
|
|
257 # error "no signed 64-bit type"
|
|
|
258 #endif
|
|
|
259
|
|
|
260 #define PRIi8 PRId8
|
|
|
261 #define PRIi16 PRId16
|
|
|
262 #define PRIi32 PRId32
|
|
|
263 #define PRIi64 PRId64
|
|
|
264
|
|
|
265 /* -------------------------------------------------------------------------------- */
|
|
|
266 /* least types */
|
|
|
267
|
|
|
268 typedef int8_t int_least8_t;
|
|
|
269 typedef int16_t int_least16_t;
|
|
|
270 typedef int32_t int_least32_t;
|
|
|
271 typedef int64_t int_least64_t;
|
|
|
272
|
|
|
273 #define INT_LEAST8_MIN INT8_MIN
|
|
|
274 #define INT_LEAST8_MAX INT8_MAX
|
|
|
275 #define INT_LEAST16_MIN INT16_MIN
|
|
|
276 #define INT_LEAST16_MAX INT16_MAX
|
|
|
277 #define INT_LEAST32_MIN INT32_MIN
|
|
|
278 #define INT_LEAST32_MAX INT32_MAX
|
|
|
279 #define INT_LEAST64_MIN INT64_MIN
|
|
|
280 #define INT_LEAST64_MAX INT64_MAX
|
|
|
281
|
|
|
282 #define PRIdLEAST8 PRId8
|
|
|
283 #define PRIdLEAST16 PRId16
|
|
|
284 #define PRIdLEAST32 PRId32
|
|
|
285 #define PRIdLEAST64 PRId64
|
|
|
286 #define PRIxLEAST8 PRIx8
|
|
|
287 #define PRIxLEAST16 PRIx16
|
|
|
288 #define PRIxLEAST32 PRIx32
|
|
|
289 #define PRIxLEAST64 PRIx64
|
|
|
290 #define PRIoLEAST8 PRIo8
|
|
|
291 #define PRIoLEAST16 PRIo16
|
|
|
292 #define PRIoLEAST32 PRIo32
|
|
|
293 #define PRIoLEAST64 PRIo64
|
|
|
294 #define PRIiLEAST8 PRIi8
|
|
|
295 #define PRIiLEAST16 PRIi16
|
|
|
296 #define PRIiLEAST32 PRIi32
|
|
|
297 #define PRIiLEAST64 PRIi64
|
|
|
298 #define PRIXLEAST8 PRIX8
|
|
|
299 #define PRIXLEAST16 PRIX16
|
|
|
300 #define PRIXLEAST32 PRIX32
|
|
|
301 #define PRIXLEAST64 PRIX64
|
|
|
302 #define PRIuLEAST8 PRIu8
|
|
|
303 #define PRIuLEAST16 PRIu16
|
|
|
304 #define PRIuLEAST32 PRIu32
|
|
|
305 #define PRIuLEAST64 PRIu64
|
|
|
306
|
|
|
307 /* -------------------------------------------------------------------------------- */
|
|
|
308 /* fast types */
|
|
|
309
|
|
|
310 typedef int8_t int_fast8_t;
|
|
|
311 typedef int16_t int_fast16_t;
|
|
|
312 typedef int32_t int_fast32_t;
|
|
|
313 typedef int64_t int_fast64_t;
|
|
|
314
|
|
|
315 #define INT_FAST8_MIN INT8_MIN
|
|
|
316 #define INT_FAST8_MAX INT8_MAX
|
|
|
317 #define INT_FAST16_MIN INT16_MIN
|
|
|
318 #define INT_FAST16_MAX INT16_MAX
|
|
|
319 #define INT_FAST32_MIN INT32_MIN
|
|
|
320 #define INT_FAST32_MAX INT32_MAX
|
|
|
321 #define INT_FAST64_MIN INT64_MIN
|
|
|
322 #define INT_FAST64_MAX INT64_MAX
|
|
|
323
|
|
|
324 #define PRIdFAST8 PRId8
|
|
|
325 #define PRIdFAST16 PRId16
|
|
|
326 #define PRIdFAST32 PRId32
|
|
|
327 #define PRIdFAST64 PRId64
|
|
|
328 #define PRIxFAST8 PRIx8
|
|
|
329 #define PRIxFAST16 PRIx16
|
|
|
330 #define PRIxFAST32 PRIx32
|
|
|
331 #define PRIxFAST64 PRIx64
|
|
|
332 #define PRIoFAST8 PRIo8
|
|
|
333 #define PRIoFAST16 PRIo16
|
|
|
334 #define PRIoFAST32 PRIo32
|
|
|
335 #define PRIoFAST64 PRIo64
|
|
|
336 #define PRIiFAST8 PRIi8
|
|
|
337 #define PRIiFAST16 PRIi16
|
|
|
338 #define PRIiFAST32 PRIi32
|
|
|
339 #define PRIiFAST64 PRIi64
|
|
|
340 #define PRIXFAST8 PRIX8
|
|
|
341 #define PRIXFAST16 PRIX16
|
|
|
342 #define PRIXFAST32 PRIX32
|
|
|
343 #define PRIXFAST64 PRIX64
|
|
|
344 #define PRIuFAST8 PRIu8
|
|
|
345 #define PRIuFAST16 PRIu16
|
|
|
346 #define PRIuFAST32 PRIu32
|
|
|
347 #define PRIuFAST64 PRIu64
|
|
|
348
|
|
|
349 /* -------------------------------------------------------------------------------- */
|
|
|
350 /* [u]intmax_t -- this is hardcoded to 64-bit, beware! */
|
|
|
351
|
|
|
352 typedef int64_t intmax_t;
|
|
|
353 typedef uint64_t uintmax_t;
|
|
|
354
|
|
|
355 #define INTMAX_MIN INT64_MIN
|
|
|
356 #define INTMAX_MAX INT64_MAX
|
|
|
357 #define UINTMAX_MAX UINT64_MAX
|
|
|
358
|
|
|
359 #define PRIdMAX PRId64
|
|
|
360 #define PRIuMAX PRIu64
|
|
|
361 #define PRIxMAX PRIx64
|
|
|
362 #define PRIXMAX PRIX64
|
|
|
363 #define PRIoMAX PRIo64
|
|
|
364 #define PRIiMAX PRIi64
|
|
|
365
|
|
|
366 #define INTMAX_C(x) INT64_C(x)
|
|
|
367
|
|
|
368 #endif /* PAPER_STDINT_H_ */
|
|
|
369
|