Guard ANONYMOUS defines by __ANONYMOUS_DEFINED guard to prevent double definitions...
[reactos.git] / include / ddk / ntdef.h
index 045c86b..72343ac 100644 (file)
 #include <stdarg.h>
 #include <string.h>
 
+/* Helper macro to enable gcc's extension.  */
+#ifndef __GNU_EXTENSION
+#ifdef __GNUC__
+#define __GNU_EXTENSION __extension__
+#else
+#define __GNU_EXTENSION
+#endif
+#endif
 
 typedef unsigned long POINTER_64; // FIXME! HACK!!!
 
@@ -85,16 +93,13 @@ typedef unsigned long POINTER_64; // FIXME! HACK!!!
 // We should use the -fms-extensions compiler flag for gcc,
 // and clean up the mess.
 //
+#ifndef __ANONYMOUS_DEFINED
+#define __ANONYMOUS_DEFINED
+
 #ifndef NONAMELESSUNION
 #ifdef __GNUC__
-#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95)
-#define _ANONYMOUS_UNION __extension__
-#define _ANONYMOUS_STRUCT __extension__
-#else
-#if defined(__cplusplus)
-#define _ANONYMOUS_UNION __extension__
-#endif /* __cplusplus */
-#endif /* __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95) */
+#define _ANONYMOUS_UNION __GNU_EXTENSION
+#define _ANONYMOUS_STRUCT __GNU_EXTENSION
 #elif defined(__WATCOMC__) || defined(_MSC_VER)
 #define _ANONYMOUS_UNION
 #define _ANONYMOUS_STRUCT
@@ -130,14 +135,18 @@ typedef unsigned long POINTER_64; // FIXME! HACK!!!
 #define DUMMYSTRUCTNAME s
 #define DUMMYSTRUCTNAME2 s2
 #define DUMMYSTRUCTNAME3 s3
+#define DUMMYSTRUCTNAME4 s4
+#define DUMMYSTRUCTNAME5 s5
 #else
 #define _STRUCT_NAME(x)
 #define DUMMYSTRUCTNAME
 #define DUMMYSTRUCTNAME2
 #define DUMMYSTRUCTNAME3
+#define DUMMYSTRUCTNAME4
+#define DUMMYSTRUCTNAME5
 #endif
 
-
+#endif /* __ANONYMOUS_DEFINED */
 
 // FIXME
 #undef UNALIGNED
@@ -332,7 +341,7 @@ typedef struct _QUAD
 {
     _ANONYMOUS_UNION union
     {
-        __int64 UseThisFieldToCopy;
+        __GNU_EXTENSION __int64 UseThisFieldToCopy;
         double DoNotUseThisField;
     };
 } QUAD, *PQUAD, UQUAD, *PUQUAD;
@@ -374,8 +383,8 @@ typedef LONG HRESULT;
 //
 // 64-bit types
 //
-typedef __int64 LONGLONG, *PLONGLONG;
-typedef unsigned __int64 ULONGLONG, *PULONGLONG;
+__GNU_EXTENSION typedef __int64 LONGLONG, *PLONGLONG;
+__GNU_EXTENSION typedef unsigned __int64 ULONGLONG, *PULONGLONG;
 typedef ULONGLONG DWORDLONG, *PDWORDLONG;
 
 //
@@ -529,7 +538,21 @@ typedef CONST STRING* PCOEM_STRING;
 typedef STRING CANSI_STRING;
 typedef PSTRING PCANSI_STRING;
 
+typedef struct _STRING32 {
+    USHORT   Length;
+    USHORT   MaximumLength;
+    ULONG  Buffer;
+} STRING32, *PSTRING32, 
+  UNICODE_STRING32, *PUNICODE_STRING32, 
+  ANSI_STRING32, *PANSI_STRING32;
 
+typedef struct _STRING64 {
+    USHORT   Length;
+    USHORT   MaximumLength;
+    ULONGLONG  Buffer;
+} STRING64, *PSTRING64,
+  UNICODE_STRING64, *PUNICODE_STRING64, 
+  ANSI_STRING64, *PANSI_STRING64;
 
 //
 // LangID and NLS
@@ -679,10 +702,7 @@ typedef struct _SINGLE_LIST_ENTRY {
 //
 // C_ASSERT Definition
 //
-#define __C_ASSERT_JOIN(X, Y) __C_ASSERT_DO_JOIN(X, Y)
-#define __C_ASSERT_DO_JOIN(X, Y) __C_ASSERT_DO_JOIN2(X, Y)
-#define __C_ASSERT_DO_JOIN2(X, Y) X##Y
-#define C_ASSERT(e) typedef char __C_ASSERT_JOIN(__C_ASSERT__, __LINE__)[(e) ? 1 : -1]
+#define C_ASSERT(expr) extern char (*c_assert(void)) [(expr) ? 1 : -1]