ReactOS  0.4.14-dev-552-g2fad488
stdint.h
Go to the documentation of this file.
1 /* @(#)stdint.h 1.37 15/12/10 Copyright 1997-2015 J. Schilling */
2 /*
3  * Abstraction from stdint.h
4  *
5  * Copyright (c) 1997-2015 J. Schilling
6  */
7 /*
8  * The contents of this file are subject to the terms of the
9  * Common Development and Distribution License, Version 1.0 only
10  * (the "License"). You may not use this file except in compliance
11  * with the License.
12  *
13  * See the file CDDL.Schily.txt in this distribution for details.
14  * A copy of the CDDL is also available via the Internet at
15  * http://www.opensource.org/licenses/cddl1.txt
16  *
17  * When distributing Covered Code, include this CDDL HEADER in each
18  * file and include the License file CDDL.Schily.txt from this distribution.
19  */
20 
21 #ifndef _SCHILY_STDINT_H
22 #define _SCHILY_STDINT_H
23 
24 #ifndef _SCHILY_MCONFIG_H
25 #include <schily/mconfig.h>
26 #endif
27 
28 /*
29  * Let us include system defined types too.
30  */
31 #ifndef _SCHILY_TYPES_H
32 #include <schily/types.h>
33 #endif
34 
35 /*
36  * Include sys/param.h for NBBY - needed in case that CHAR_BIT is missing
37  */
38 #ifndef _SCHILY_PARAM_H
39 #include <schily/param.h> /* Must be before limits.h */
40 #endif
41 
42 /*
43  * Include limits.h for CHAR_BIT - needed by TYPE_MINVAL(t) and TYPE_MAXVAL(t)
44  */
45 #ifndef _SCHILY_LIMITS_H
46 #include <schily/limits.h>
47 #endif
48 
49 #ifndef CHAR_BIT
50 #ifdef NBBY
51 #define CHAR_BIT NBBY
52 #endif
53 #endif
54 
55 /*
56  * Last resort: define CHAR_BIT by hand
57  */
58 #ifndef CHAR_BIT
59 #define CHAR_BIT 8
60 #endif
61 
62 /*
63  * These macros may not work on all platforms but as we depend
64  * on two's complement in many places, they do not reduce portability.
65  * The macros below work with 2s complement and ones complement machines.
66  * Verify with this table...
67  *
68  * Bits 1's c. 2's complement.
69  * 100 -3 -4
70  * 101 -2 -3
71  * 110 -1 -2
72  * 111 -0 -1
73  * 000 +0 0
74  * 001 +1 +1
75  * 010 +2 +2
76  * 011 +3 +3
77  *
78  * Computing -TYPE_MINVAL(type) will not work on 2's complement machines
79  * if 'type' is int or more. Use:
80  * ((unsigned type)(-1 * (TYPE_MINVAL(type)+1))) + 1;
81  * it works for both 1's complement and 2's complement machines.
82  */
83 #define TYPE_ISSIGNED(t) (((t)-1) < ((t)0))
84 #define TYPE_ISUNSIGNED(t) (!TYPE_ISSIGNED(t))
85 #define TYPE_MSBVAL(t) ((t)(~((t)0) << (sizeof (t)*CHAR_BIT - 1)))
86 #define TYPE_MINVAL(t) (TYPE_ISSIGNED(t) \
87  ? TYPE_MSBVAL(t) \
88  : ((t)0))
89 #define TYPE_MAXVAL(t) ((t)(~((t)0) - TYPE_MINVAL(t)))
90 
91 /*
92  * MSVC has size_t in stddef.h
93  */
94 #ifdef HAVE_STDDEF_H
95 #ifndef _INCL_STDDEF_H
96 #include <stddef.h>
97 #define _INCL_STDDEF_H
98 #endif
99 #endif
100 
101 /*
102  * CHAR_IS_UNSIGNED is needed to define int8_t
103  */
104 #ifdef __CHAR_UNSIGNED__ /* GNU GCC define (dynamic) */
105 #ifndef CHAR_IS_UNSIGNED
106 #define CHAR_IS_UNSIGNED /* Sing Schily define (static) */
107 #endif
108 #endif
109 
110 /*
111  * This is a definition for a compiler dependant 64 bit type.
112  * There is currently a silently fallback to a long if the compiler does not
113  * support it. Check if this is the right way.
114  *
115  * Be very careful here as MSVC does not implement long long but rather __int64
116  * and once someone makes 'long long' 128 bits on a 64 bit machine, we need to
117  * check for a MSVC __int128 type.
118  */
119 #ifndef NO_LONGLONG
120 # if !defined(USE_LONGLONG) && defined(HAVE_LONGLONG)
121 # define USE_LONGLONG
122 # endif
123 # if !defined(USE_LONGLONG) && defined(HAVE___INT64)
124 # define USE_LONGLONG
125 # endif
126 #endif
127 
128 #ifdef USE_LONGLONG
129 
130 # if defined(HAVE___INT64)
131 
132 typedef __int64 Llong;
133 typedef unsigned __int64 Ullong; /* We should avoid this */
134 typedef unsigned __int64 ULlong;
135 
136 #define SIZEOF_LLONG SIZEOF___INT64
137 #define SIZEOF_ULLONG SIZEOF_UNSIGNED___INT64
138 
139 # else /* We must have HAVE_LONG_LONG */
140 
141 typedef long long Llong;
142 typedef unsigned long long Ullong; /* We should avoid this */
143 typedef unsigned long long ULlong;
144 
145 #define SIZEOF_LLONG SIZEOF_LONG_LONG
146 #define SIZEOF_ULLONG SIZEOF_UNSIGNED_LONG_LONG
147 
148 # endif /* HAVE___INT64 / HAVE_LONG_LONG */
149 
150 #else /* !USE_LONGLONG */
151 
152 typedef long Llong;
153 typedef unsigned long Ullong; /* We should avoid this */
154 typedef unsigned long ULlong;
155 
156 #define SIZEOF_LLONG SIZEOF_LONG
157 #define SIZEOF_ULLONG SIZEOF_UNSIGNED_LONG
158 
159 #endif /* USE_LONGLONG */
160 
161 #ifndef LLONG_MIN
162 #define LLONG_MIN TYPE_MINVAL(Llong)
163 #endif
164 #ifndef LLONG_MAX
165 #define LLONG_MAX TYPE_MAXVAL(Llong)
166 #endif
167 #ifndef ULLONG_MAX
168 #define ULLONG_MAX TYPE_MAXVAL(Ullong)
169 #endif
170 
171 /*
172  * Start inttypes.h emulation.
173  *
174  * Thanks to Solaris 2.4 and even recent 1999 Linux versions, we
175  * cannot use the official UNIX-98 names here. Old Solaris versions
176  * define parts of the types in some exotic include files.
177  * Linux even defines incompatible types in <sys/types.h>.
178  */
179 
180 #if defined(HAVE_INTTYPES_H) || defined(HAVE_STDINT_H)
181 #if defined(HAVE_INTTYPES_H)
182 # ifndef _INCL_INTTYPES_H
183 # include <inttypes.h>
184 # define _INCL_INTTYPES_H
185 # endif
186 #else
187 #if defined(HAVE_STDINT_H)
188 # ifndef _INCL_STDINT_H
189 # include <stdint.h>
190 # define _INCL_STDINT_H
191 # endif
192 #endif
193 #endif
194 
195 #ifdef __cplusplus
196 extern "C" {
197 #endif
198 
199 /*
200  * On VMS on VAX, these types are present but non-scalar.
201  * Thus we may not be able to use them
202  */
203 #ifdef HAVE_LONGLONG
204 # define HAVE_INT64_T
205 # define HAVE_UINT64_T
206 #endif
207 
208 #define Int8_t int8_t
209 #define Int16_t int16_t
210 #define Int32_t int32_t
211 #ifdef HAVE_LONGLONG
212 #define Int64_t int64_t
213 #endif
214 #define Intmax_t intmax_t
215 #define UInt8_t uint8_t
216 #define UInt16_t uint16_t
217 #define UInt32_t uint32_t
218 #ifdef HAVE_LONGLONG
219 #define UInt64_t uint64_t
220 #endif
221 #define UIntmax_t uintmax_t
222 
223 #define Intptr_t intptr_t
224 #define UIntptr_t uintptr_t
225 
226 /*
227  * If we only have a UNIX-98 inttypes.h but no SUSv3
228  *
229  * Beware not to use int64_t / uint64_t as VMS on a VAX defines
230  * them as non-scalar (structure) based types.
231  */
232 #ifndef HAVE_TYPE_INTMAX_T
233 #define intmax_t Llong
234 #endif
235 #ifndef HAVE_TYPE_UINTMAX_T
236 #define uintmax_t ULlong
237 #endif
238 
239 #ifdef __cplusplus
240 }
241 #endif
242 
243 #else /* !HAVE_INTTYPES_H */
244 
245 #ifdef __cplusplus
246 extern "C" {
247 #endif
248 
249 #if SIZEOF_CHAR != 1 || SIZEOF_UNSIGNED_CHAR != 1
250 /*
251  * #error will not work for all compilers (e.g. sunos4)
252  * The following line will abort compilation on all compilers
253  * if the above is true. And that's what we want.
254  */
255 error Sizeof char is not equal 1
256 
257 #include <schily/err_char.h> /* Avoid "unknown directive" with K&R */
258 #endif
259 
260 #if defined(__STDC__) || defined(CHAR_IS_UNSIGNED)
261  typedef signed char Int8_t;
262 #else
263  typedef char Int8_t;
264 #endif
265 
266 #if SIZEOF_SHORT_INT == 2
267  typedef short Int16_t;
268 #else
269  error No int16_t found
270 
271 #include <schily/err_type.h> /* Avoid "unknown directive" with K&R */
272 #endif
273 
274 #if SIZEOF_INT == 4
275 #if defined(_MSC_VER) && SIZEOF_LONG_INT == 4
276  typedef long Int32_t;
277 #else
278  typedef int Int32_t;
279 #endif
280 #else
281  error No int32_t found
282 
283 #include <schily/err_type.h> /* Avoid "unknown directive" with K&R */
284 #endif
285 
286 #if SIZEOF_LONG_INT == 8
287  typedef long Int64_t;
288 # define HAVE_INT64_T
289 #else
290 #if SIZEOF_LONG_LONG == 8
291  typedef long long Int64_t;
292 # define HAVE_INT64_T
293 #else
294 #if SIZEOF___INT64 == 8
295  typedef __int64 Int64_t;
296 # define HAVE_INT64_T
297 #else
298 /*
299  * Tolerate platforms without 64-Bit support.
300  */
301 /* error No int64_t found */
302 #endif
303 #endif
304 #endif
305 
306 #if SIZEOF_CHAR_P == SIZEOF_INT
307  typedef int Intptr_t;
308 #else
309 #if SIZEOF_CHAR_P == SIZEOF_LONG_INT
310  typedef long Intptr_t;
311 #else
312 #if SIZEOF_CHAR_P == SIZEOF_LLONG
313  typedef Llong Intptr_t;
314 #else
315  error No intptr_t found
316 
317 #include <schily/err_type.h> /* Avoid "unknown directive" with K&R */
318 #endif
319 #endif
320 #endif
321 
322 typedef unsigned char UInt8_t;
323 
324 #if SIZEOF_UNSIGNED_SHORT_INT == 2
325  typedef unsigned short UInt16_t;
326 #else
327  error No uint16_t found
328 
329 #include <schily/err_type.h> /* Avoid "unknown directive" with K&R */
330 #endif
331 
332 #if SIZEOF_UNSIGNED_INT == 4
333 #if defined(_MSC_VER) && SIZEOF_UNSIGNED_LONG_INT == 4
334  typedef unsigned long UInt32_t;
335 #else
336  typedef unsigned int UInt32_t;
337 #endif
338 #else
339  error No int32_t found
340 
341 #include <schily/err_type.h> /* Avoid "unknown directive" with K&R */
342 #endif
343 
344 #if SIZEOF_UNSIGNED_LONG_INT == 8
345  typedef unsigned long UInt64_t;
346 # define HAVE_UINT64_T
347 #else
348 #if SIZEOF_UNSIGNED_LONG_LONG == 8
349  typedef unsigned long long UInt64_t;
350 # define HAVE_UINT64_T
351 #else
352 #if SIZEOF_UNSIGNED___INT64 == 8
353  typedef unsigned __int64 UInt64_t;
354 # define HAVE_UINT64_T
355 #else
356 /*
357  * Tolerate platforms without 64-Bit support.
358  */
359 /* error No uint64_t found */
360 #endif
361 #endif
362 #endif
363 
364 #define Intmax_t Llong
365 #define UIntmax_t Ullong
366 
367 #if SIZEOF_CHAR_P == SIZEOF_UNSIGNED_INT
368  typedef unsigned int UIntptr_t;
369 #else
370 #if SIZEOF_CHAR_P == SIZEOF_UNSIGNED_LONG_INT
371  typedef unsigned long UIntptr_t;
372 #else
373 #if SIZEOF_CHAR_P == SIZEOF_ULLONG
374  typedef ULlong UIntptr_t;
375 #else
376  error No uintptr_t found
377 
378 #include <schily/err_type.h> /* Avoid "unknown directive" with K&R */
379 #endif
380 #endif
381 #endif
382 
383 #ifdef _MSC_VER
384 /*
385  * All recent platforms define the POSIX/C-99 compliant types from inttypes.h
386  * except Microsoft. With these #defines, we may also use official types on a
387  * Microsoft environment.
388  *
389  * Warning: Linux-2.2 and before do not have inttypes.h and define some of the
390  * types in an incmpatible way.
391  */
392 #undef int8_t
393 #define int8_t Int8_t
394 #undef int16_t
395 #define int16_t Int16_t
396 #undef int32_t
397 #define int32_t Int32_t
398 #undef int64_t
399 #define int64_t Int64_t
400 #undef intmax_t
401 #define intmax_t Intmax_t
402 #undef uint8_t
403 #define uint8_t UInt8_t
404 #undef uint16_t
405 #define uint16_t UInt16_t
406 #undef uint32_t
407 #define uint32_t UInt32_t
408 #undef uint64_t
409 #define uint64_t UInt64_t
410 #undef uintmax_t
411 #define uintmax_t UIntmax_t
412 
413 #undef intptr_t
414 #define intptr_t Intptr_t
415 #undef uintptr_t
416 #define uintptr_t UIntptr_t
417 #endif /* _MSC_VER */
418 
419 #ifdef __cplusplus
420 }
421 #endif
422 
423 #endif /* HAVE_INTTYPES_H */
424 
425 #ifndef INT8_MIN
426 #define INT8_MIN TYPE_MINVAL(Int8_t)
427 #endif
428 #ifndef INT8_MAX
429 #define INT8_MAX TYPE_MAXVAL(Int8_t)
430 #endif
431 #ifndef UINT8_MAX
432 #define UINT8_MAX TYPE_MAXVAL(UInt8_t)
433 #endif
434 
435 #ifndef INT16_MIN
436 #define INT16_MIN TYPE_MINVAL(Int16_t)
437 #endif
438 #ifndef INT16_MAX
439 #define INT16_MAX TYPE_MAXVAL(Int16_t)
440 #endif
441 #ifndef UINT16_MAX
442 #define UINT16_MAX TYPE_MAXVAL(UInt16_t)
443 #endif
444 
445 #ifndef INT32_MIN
446 #define INT32_MIN TYPE_MINVAL(Int32_t)
447 #endif
448 #ifndef INT32_MAX
449 #define INT32_MAX TYPE_MAXVAL(Int32_t)
450 #endif
451 #ifndef UINT32_MAX
452 #define UINT32_MAX TYPE_MAXVAL(UInt32_t)
453 #endif
454 
455 #ifdef HAVE_INT64_T
456 #ifndef INT64_MIN
457 #define INT64_MIN TYPE_MINVAL(Int64_t)
458 #endif
459 #ifndef INT64_MAX
460 #define INT64_MAX TYPE_MAXVAL(Int64_t)
461 #endif
462 #endif
463 #ifdef HAVE_UINT64_T
464 #ifndef UINT64_MAX
465 #define UINT64_MAX TYPE_MAXVAL(UInt64_t)
466 #endif
467 #endif
468 
469 #ifndef INTMAX_MIN
470 #define INTMAX_MIN TYPE_MINVAL(Intmax_t)
471 #endif
472 #ifndef INTMAX_MAX
473 #define INTMAX_MAX TYPE_MAXVAL(Intmax_t)
474 #endif
475 #ifndef UINTMAX_MAX
476 #define UINTMAX_MAX TYPE_MAXVAL(UIntmax_t)
477 #endif
478 
479 #define SIZE_T_MIN TYPE_MINVAL(size_t)
480 #ifdef SIZE_T_MAX
481 #undef SIZE_T_MAX /* FreeBSD has a similar #define */
482 #endif
483 #define SIZE_T_MAX TYPE_MAXVAL(size_t)
484 
485 #define SSIZE_T_MIN TYPE_MINVAL(ssize_t)
486 #define SSIZE_T_MAX TYPE_MAXVAL(ssize_t)
487 
488 #endif /* _SCHILY_STDINT_H */
error Sizeof char is not equal typedef char Int8_t
Definition: stdint.h:263
#define error(str)
Definition: mkdosfs.c:1605
long Llong
Definition: stdint.h:152
unsigned int UIntptr_t
Definition: stdint.h:368
#define equal(x, y)
Definition: reader.cc:56
unsigned char UInt8_t
Definition: stdint.h:322
unsigned short int uint16_t
Definition: acefiex.h:54
error No int16_t found error No int32_t found typedef int Intptr_t
Definition: stdint.h:307
unsigned long ULlong
Definition: stdint.h:154
unsigned long Ullong
Definition: stdint.h:153
unsigned int uintptr_t
Definition: crtdefs.h:300
int intptr_t
Definition: crtdefs.h:283
INT32 int32_t
Definition: types.h:71
INT16 int16_t
Definition: types.h:70
#define __int64
Definition: basetyps.h:16