Moved some macros like NULL, FALSE to winnt.h
Moved the anonymous struct/unions to winnt.h
Moved calling convention macros to winnt.h
Moved some basic types like BOOL, INT, LONG, etc. to winnt.h
Moved HANDLE and DECLARE_HANDLE to winnt.h
Moved structure packing macros to winnt.h
diff --git a/include/winnt.h b/include/winnt.h
index 4255285..3cf860c 100644
--- a/include/winnt.h
+++ b/include/winnt.h
@@ -8,13 +8,284 @@
#define __WINE_WINNT_H
#include "basetsd.h"
-#include "windef.h"
#ifndef RC_INVOKED
#include <ctype.h>
#include <string.h>
#endif
+
+/* On Windows winnt.h depends on a few windef.h types and macros and thus
+ * is not self-contained. Furthermore windef.h includes winnt.h so that it
+ * would be pointless to try to use winnt.h directly.
+ * But for Wine and Winelib I decided to make winnt.h self-contained by
+ * moving these definitions to winnt.h. It makes no difference to Winelib
+ * programs since they are not using winnt.h directly anyway, and it allows
+ * us to use winnt.h and get a minimal set of definitions.
+ */
+
+/**** Some Wine specific definitions *****/
+
+/* Calling conventions definitions */
+
+#ifdef __i386__
+# ifndef _X86_
+# define _X86_
+# endif
+# if defined(__GNUC__) && ((__GNUC__ > 2) || ((__GNUC__ == 2) && (__GNUC_MINOR__ >= 7)))
+# define __stdcall __attribute__((__stdcall__))
+# define __cdecl __attribute__((__cdecl__))
+# else
+# error You need gcc >= 2.7 to build Wine on a 386
+# endif /* __GNUC__ */
+#else /* __i386__ */
+# define __stdcall
+# define __cdecl
+#endif /* __i386__ */
+
+#ifndef __WINE__
+#define pascal __stdcall
+#define _pascal __stdcall
+#define _stdcall __stdcall
+#define _fastcall __stdcall
+#define __fastcall __stdcall
+#define __export __stdcall
+#define cdecl __cdecl
+#define _cdecl __cdecl
+
+#define near
+#define far
+#define _near
+#define _far
+#define NEAR
+#define FAR
+
+#ifndef _declspec
+#define _declspec(x)
+#endif
+#ifndef __declspec
+#define __declspec(x)
+#endif
+#endif /* __WINE__ */
+
+#define CALLBACK __stdcall
+#define WINAPI __stdcall
+#define APIPRIVATE __stdcall
+#define PASCAL __stdcall
+#define CDECL __cdecl
+#define _CDECL __cdecl
+#define WINAPIV __cdecl
+#define APIENTRY WINAPI
+#define CONST const
+
+/* Macro for structure packing and more. */
+
+#ifdef __GNUC__
+#define WINE_PACKED __attribute__((packed))
+#define WINE_UNUSED __attribute__((unused))
+#define WINE_NORETURN __attribute__((noreturn))
+#else
+#define WINE_PACKED /* nothing */
+#define WINE_UNUSED /* nothing */
+#define WINE_NORETURN /* nothing */
+#endif
+
+/* Anonymous union/struct handling */
+
+#ifdef __WINE__
+# define NONAMELESSSTRUCT
+# define NONAMELESSUNION
+#else
+/* Anonymous struct support starts with gcc/g++ 2.96 */
+# if !defined(NONAMELESSSTRUCT) && defined(__GNUC__) && ((__GNUC__ < 2) || ((__GNUC__ == 2) && (__GNUC_MINOR__ < 96)))
+# define NONAMELESSSTRUCT
+# endif
+/* Anonymous unions support starts with gcc 2.96/g++ 2.95 */
+# if !defined(NONAMELESSUNION) && defined(__GNUC__) && ((__GNUC__ < 2) || ((__GNUC__ == 2) && ((__GNUC_MINOR__ < 95) || ((__GNUC_MINOR__ == 95) && !defined(__cplusplus)))))
+# define NONAMELESSUNION
+# endif
+#endif
+
+#ifndef NONAMELESSSTRUCT
+#define DUMMYSTRUCTNAME
+#define DUMMYSTRUCTNAME1
+#define DUMMYSTRUCTNAME2
+#define DUMMYSTRUCTNAME3
+#define DUMMYSTRUCTNAME4
+#define DUMMYSTRUCTNAME5
+#else /* !defined(NONAMELESSSTRUCT) */
+#define DUMMYSTRUCTNAME s
+#define DUMMYSTRUCTNAME1 s1
+#define DUMMYSTRUCTNAME2 s2
+#define DUMMYSTRUCTNAME3 s3
+#define DUMMYSTRUCTNAME4 s4
+#define DUMMYSTRUCTNAME5 s5
+#endif /* !defined(NONAMELESSSTRUCT) */
+
+#ifndef NONAMELESSUNION
+#define DUMMYUNIONNAME
+#define DUMMYUNIONNAME1
+#define DUMMYUNIONNAME2
+#define DUMMYUNIONNAME3
+#define DUMMYUNIONNAME4
+#define DUMMYUNIONNAME5
+#define DUMMYUNIONNAME6
+#define DUMMYUNIONNAME7
+#define DUMMYUNIONNAME8
+#else /* !defined(NONAMELESSUNION) */
+#define DUMMYUNIONNAME u
+#define DUMMYUNIONNAME1 u1
+#define DUMMYUNIONNAME2 u2
+#define DUMMYUNIONNAME3 u3
+#define DUMMYUNIONNAME4 u4
+#define DUMMYUNIONNAME5 u5
+#define DUMMYUNIONNAME6 u6
+#define DUMMYUNIONNAME7 u7
+#define DUMMYUNIONNAME8 u8
+#endif /* !defined(NONAMELESSUNION) */
+
+
+/**** Parts of windef.h that are needed here *****/
+
+/* Misc. constants. */
+
+#undef NULL
+#ifdef __cplusplus
+#define NULL 0
+#else
+#define NULL ((void*)0)
+#endif
+
+#ifdef FALSE
+#undef FALSE
+#endif
+#define FALSE 0
+
+#ifdef TRUE
+#undef TRUE
+#endif
+#define TRUE 1
+
+#ifndef IN
+#define IN
+#endif
+
+#ifndef OUT
+#define OUT
+#endif
+
+#ifndef OPTIONAL
+#define OPTIONAL
+#endif
+
+/* Standard data types */
+typedef const void *PCVOID, *LPCVOID;
+typedef int BOOL, *PBOOL, *LPBOOL;
+typedef unsigned char BYTE, *PBYTE, *LPBYTE;
+typedef unsigned char UCHAR, *PUCHAR;
+typedef unsigned short USHORT, *PUSHORT, *LPUSHORT;
+typedef unsigned short WORD, *PWORD, *LPWORD;
+typedef int INT, *PINT, *LPINT;
+typedef unsigned int UINT, *PUINT, *LPUINT;
+typedef unsigned long DWORD, *PDWORD, *LPDWORD;
+typedef unsigned long ULONG, *PULONG, *LPULONG;
+typedef float FLOAT, *PFLOAT, *LPFLOAT;
+typedef double DOUBLE, *PDOUBLE, *LPDOUBLE;
+typedef double DATE;
+
+
+/**** winnt.h proper *****/
+
+/* Define the basic types */
+#ifndef VOID
+#define VOID void
+#endif
+typedef VOID *PVOID, *LPVOID;
+typedef BYTE BOOLEAN, *PBOOLEAN;
+typedef char CHAR, *PCHAR;
+/* Some systems might have wchar_t, but we really need 16 bit characters */
+typedef unsigned short WCHAR, *PWCHAR;
+typedef short SHORT, *PSHORT;
+typedef long LONG, *PLONG, *LPLONG;
+
+/* 'Extended/Wide' numerical types */
+#ifndef _ULONGLONG_
+#define _ULONGLONG_
+typedef __int64 LONGLONG, *PLONGLONG;
+typedef __uint64 ULONGLONG, *PULONGLONG;
+#endif
+
+#ifndef _DWORDLONG_
+#define _DWORDLONG_
+typedef ULONGLONG DWORDLONG, *PDWORDLONG;
+#endif
+
+/* ANSI string types */
+typedef CHAR *PCH, *LPCH;
+typedef const CHAR *PCCH, *LPCCH;
+typedef CHAR *PSTR, *LPSTR;
+typedef const CHAR *PCSTR, *LPCSTR;
+
+/* Unicode string types */
+typedef WCHAR *PWCH, *LPWCH;
+typedef const WCHAR *PCWCH, *LPCWCH;
+typedef WCHAR *PWSTR, *LPWSTR;
+typedef const WCHAR *PCWSTR, *LPCWSTR;
+
+/* Neutral character and string types */
+/* These are only defined for WineLib, i.e. _not_ defined for
+ * the emulator. The reason is they depend on the UNICODE
+ * macro which only exists in the user's code.
+ */
+#ifndef __WINE__
+# ifdef UNICODE
+typedef WCHAR TCHAR, *PTCHAR;
+typedef LPWSTR PTSTR, LPTSTR;
+typedef LPCWSTR PCTSTR, LPCTSTR;
+# define __TEXT(string) L##string /*probably wrong */
+# else /* UNICODE */
+typedef CHAR TCHAR, *PTCHAR;
+typedef LPSTR PTSTR, LPTSTR;
+typedef LPCSTR PCTSTR, LPCTSTR;
+# define __TEXT(string) string
+# endif /* UNICODE */
+#endif /* __WINE__ */
+#define TEXT(quote) __TEXT(quote)
+
+/* Misc common WIN32 types */
+typedef LONG HRESULT;
+typedef DWORD LCID, *PLCID;
+typedef WORD LANGID;
+
+/* Handle type */
+
+/* FIXME: Wine does not compile with strict on, therefore strict
+ * handles are presently only usable on machines where sizeof(UINT) ==
+ * sizeof(void*). HANDLEs are supposed to be void* but a large amount
+ * of WINE code operates on HANDLES as if they are UINTs. So to WINE
+ * they exist as UINTs but to the Winelib user who turns on strict,
+ * they exist as void*. If there is a size difference between UINT and
+ * void* then things get ugly. */
+#ifdef STRICT
+typedef VOID* HANDLE;
+#else
+typedef UINT HANDLE;
+#endif
+typedef HANDLE *LPHANDLE;
+
+#ifdef STRICT
+#define DECLARE_HANDLE(a) \
+ typedef struct a##__ { int unused; } *a; \
+ typedef a *P##a; \
+ typedef a *LP##a
+#else /*STRICT*/
+#define DECLARE_HANDLE(a) \
+ typedef HANDLE a; \
+ typedef a *P##a; \
+ typedef a *LP##a
+#endif /*STRICT*/
+
+
#include "pshpack1.h"
/* Defines */
@@ -120,39 +391,6 @@
/* Types */
-/* TCHAR data types definitions for Winelib. */
-/* These types are _not_ defined for the emulator, because they */
-/* depend on the UNICODE macro that only exists in user's code. */
-
-#ifndef __WINE__
-# ifdef UNICODE
-typedef WCHAR TCHAR, *PTCHAR;
-typedef LPWSTR PTSTR, LPTSTR;
-typedef LPCWSTR PCTSTR, LPCTSTR;
-#define __TEXT(string) L##string /*probably wrong */
-# else /* UNICODE */
-typedef char TCHAR, *PTCHAR;
-typedef LPSTR PTSTR, LPTSTR;
-typedef LPCSTR PCTSTR, LPCTSTR;
-#define __TEXT(string) string
-# endif /* UNICODE */
-#endif /* __WINE__ */
-#define TEXT(quote) __TEXT(quote)
-
-typedef BYTE BOOLEAN;
-typedef BOOLEAN *PBOOLEAN;
-
-#ifndef _DWORDLONG_
-#define _DWORDLONG_
-typedef __uint64 DWORDLONG, *PDWORDLONG;
-#endif
-
-#ifndef _ULONGLONG_
-#define _ULONGLONG_
-typedef __int64 LONGLONG, *PLONGLONG;
-typedef __uint64 ULONGLONG, *PULONGLONG;
-#endif
-
typedef struct _LIST_ENTRY {
struct _LIST_ENTRY *Flink;
struct _LIST_ENTRY *Blink;