[HEADERS]
[reactos.git] / reactos / include / crt / stdint.h
index 57db989..4c99ed0 100644 (file)
@@ -1,3 +1,8 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the w64 mingw-runtime package.
+ * No warranty is given; refer to the file DISCLAIMER within this package.
+ */
 /* ISO C9x  7.18  Integer types <stdint.h>
  * Based on ISO/IEC SC22/WG14 9899 Committee draft (SC22 N2794)
  *
 
 #ifndef _STDINT_H
 #define _STDINT_H
+
+#include <crtdefs.h>
+
 #define __need_wint_t
 #define __need_wchar_t
-#include <stddef.h>
+#include "stddef.h"
 
 /* 7.18.1.1  Exact-width integer types */
 typedef signed char int8_t;
@@ -30,8 +38,8 @@ typedef short  int16_t;
 typedef unsigned short  uint16_t;
 typedef int  int32_t;
 typedef unsigned   uint32_t;
-typedef long long  int64_t;
-typedef unsigned long long   uint64_t;
+__MINGW_EXTENSION typedef long long  int64_t;
+__MINGW_EXTENSION typedef unsigned long long   uint64_t;
 
 /* 7.18.1.2  Minimum-width integer types */
 typedef signed char int_least8_t;
@@ -40,12 +48,12 @@ typedef short  int_least16_t;
 typedef unsigned short  uint_least16_t;
 typedef int  int_least32_t;
 typedef unsigned   uint_least32_t;
-typedef long long  int_least64_t;
-typedef unsigned long long   uint_least64_t;
+__MINGW_EXTENSION typedef long long  int_least64_t;
+__MINGW_EXTENSION typedef unsigned long long   uint_least64_t;
 
-/*  7.18.1.3  Fastest minimum-width integer types 
+/*  7.18.1.3  Fastest minimum-width integer types
  *  Not actually guaranteed to be fastest for all purposes
- *  Here we use the exact-width types for 8 and 16-bit ints. 
+ *  Here we use the exact-width types for 8 and 16-bit ints.
  */
 typedef char int_fast8_t;
 typedef unsigned char uint_fast8_t;
@@ -53,38 +61,18 @@ typedef short  int_fast16_t;
 typedef unsigned short  uint_fast16_t;
 typedef int  int_fast32_t;
 typedef unsigned  int  uint_fast32_t;
-typedef long long  int_fast64_t;
-typedef unsigned long long   uint_fast64_t;
-
-/* 7.18.1.4  Integer types capable of holding object pointers */
-
-#ifndef _INTPTR_T_DEFINED
-#define _INTPTR_T_DEFINED
-#ifdef _WIN64
-  typedef __int64 intptr_t;
-#else
-  typedef int intptr_t;
-#endif
-#endif
-
-#ifndef _UINTPTR_T_DEFINED
-#define _UINTPTR_T_DEFINED
-#ifdef _WIN64
-  typedef unsigned __int64 uintptr_t;
-#else
-  typedef unsigned int uintptr_t;
-#endif
-#endif
+__MINGW_EXTENSION typedef long long  int_fast64_t;
+__MINGW_EXTENSION typedef unsigned long long   uint_fast64_t;
 
 /* 7.18.1.5  Greatest-width integer types */
-typedef long long  intmax_t;
-typedef unsigned long long uintmax_t;
+__MINGW_EXTENSION typedef long long  intmax_t;
+__MINGW_EXTENSION typedef unsigned long long   uintmax_t;
 
 /* 7.18.2  Limits of specified-width integer types */
 #if !defined ( __cplusplus) || defined (__STDC_LIMIT_MACROS)
 
 /* 7.18.2.1  Limits of exact-width integer types */
-#define INT8_MIN (-128) 
+#define INT8_MIN (-128)
 #define INT16_MIN (-32768)
 #define INT32_MIN (-2147483647 - 1)
 #define INT64_MIN  (-9223372036854775807LL - 1)
@@ -149,24 +137,37 @@ typedef unsigned long long uintmax_t;
 #define UINTMAX_MAX UINT64_MAX
 
 /* 7.18.3  Limits of other integer types */
-#define PTRDIFF_MIN INTPTR_MIN
-#define PTRDIFF_MAX INTPTR_MAX
+#ifdef _WIN64
+#define PTRDIFF_MIN INT64_MIN
+#define PTRDIFF_MAX INT64_MAX
+#else
+#define PTRDIFF_MIN INT32_MIN
+#define PTRDIFF_MAX INT32_MAX
+#endif
 
-#define SIG_ATOMIC_MIN INTPTR_MIN
-#define SIG_ATOMIC_MAX INTPTR_MAX
+#define SIG_ATOMIC_MIN INT32_MIN
+#define SIG_ATOMIC_MAX INT32_MAX
 
-#define SIZE_MAX UINTPTR_MAX
+#ifndef SIZE_MAX
+#ifdef _WIN64
+#define SIZE_MAX UINT64_MAX
+#else
+#define SIZE_MAX UINT32_MAX
+#endif
+#endif
 
-#ifndef WCHAR_MIN  /* also in wchar.h */ 
+#ifndef WCHAR_MIN  /* also in wchar.h */
 #define WCHAR_MIN 0
-#define WCHAR_MAX 0xffff /* UINT16_MAX */
+#endif
+#ifndef WCHAR_MAX
+#define WCHAR_MAX ((wchar_t)-1) /* UINT16_MAX */
 #endif
 
 /*
  * wint_t is unsigned short for compatibility with MS runtime
  */
 #define WINT_MIN 0
-#define WINT_MAX 0xffff /* UINT16_MAX */
+#define WINT_MAX ((wint_t)-1) /* UINT16_MAX */
 
 #endif /* !defined ( __cplusplus) || defined __STDC_LIMIT_MACROS */
 
@@ -185,21 +186,25 @@ typedef unsigned long long uintmax_t;
        an integer constant with width less than that of type int.
        TC1 changed this to require just an integer constant
        *expression* with *promoted* type."
-*/
 
-#define INT8_C(val) ((int8_t) + (val))
-#define UINT8_C(val) ((uint8_t) + (val##U))
-#define INT16_C(val) ((int16_t) + (val))
-#define UINT16_C(val) ((uint16_t) + (val##U))
+       The trick used here is from Clive D W Feather.
+*/
 
-#define INT32_C(val) val##L
-#define UINT32_C(val) val##UL
+#define INT8_C(val) (INT_LEAST8_MAX-INT_LEAST8_MAX+(val))
+#define INT16_C(val) (INT_LEAST16_MAX-INT_LEAST16_MAX+(val))
+#define INT32_C(val) (INT_LEAST32_MAX-INT_LEAST32_MAX+(val))
+/*  The 'trick' doesn't work in C89 for long long because, without
+    suffix, (val) will be evaluated as int, not intmax_t */
 #define INT64_C(val) val##LL
+
+#define UINT8_C(val) (UINT_LEAST8_MAX-UINT_LEAST8_MAX+(val))
+#define UINT16_C(val) (UINT_LEAST16_MAX-UINT_LEAST16_MAX+(val))
+#define UINT32_C(val) (UINT_LEAST32_MAX-UINT_LEAST32_MAX+(val))
 #define UINT64_C(val) val##ULL
 
 /* 7.18.4.2  Macros for greatest-width integer constants */
-#define INTMAX_C(val)  INT64_C(val)
-#define UINTMAX_C(val) UINT64_C(val)
+#define INTMAX_C(val) val##LL
+#define UINTMAX_C(val) val##ULL
 
 #endif  /* !defined ( __cplusplus) || defined __STDC_CONSTANT_MACROS */