OSDN Git Service

Refactor <wtypes.h> vs. <nspapi.h> and WinSock headers.
authorKeith Marshall <keithmarshall@users.sourceforge.net>
Mon, 30 Oct 2017 10:27:32 +0000 (10:27 +0000)
committerKeith Marshall <keithmarshall@users.sourceforge.net>
Mon, 30 Oct 2017 10:27:32 +0000 (10:27 +0000)
w32api/ChangeLog
w32api/include/nspapi.h
w32api/include/winsock2.h
w32api/include/wtypes.h

index b65f65a..175f632 100644 (file)
@@ -1,3 +1,39 @@
+2017-10-30  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Refactor <wtypes.h> vs. <nspapi.h> and WinSock headers.
+
+       * include/wtypes.h: Tidy layout; assert copyright.
+       [_BEGIN_C_DECLS, _END_C_DECLS]: Use them, as appropriate.
+       [__NSPAPI_H_SOURCED__]: Restrict exposure of declared content to...
+       [!__BLOB_DATA_TYPE_DEFINED] (BLOB, PBLOB, LPBLOB): ...these; define...
+       (__BLOB_DATA_TYPE_DEFINED__): ...this internal guard; it renames...
+       (__BLOB_T_DEFINED): ...this; do not define...
+       (_WTYPES_H): ...this external guard.
+
+       * include/nspapi.h: Tidy layout; assert copyright.
+       [_BEGIN_C_DECLS, _END_C_DECLS]: Use them, as appropriate.
+       (__CSADDR_T_DEFINED): Do not define; it is no longer required.
+       [__WINSOCK2_H_SOURCED__]: Restrict exposure of declared content to...
+       (struct _CSADDR_INFO): ...this, as an incomplete type, along with...
+       (CSADDR_INFO, PCSADDR_INFO, LPCSADDR_INFO): ...these typedefs; also...
+       (SOCKET_ADDRESS, PSOCKET_ADDRESS, LPSOCKET_ADDRESS): ...define fully.
+       [__WINSOCK2_H_SOURCED__] (_NSPAPI_H): Do not define external guard.
+       [!__WINSOCK2_H_SOURCED__] (struct _CSADDR_INFO): Define fully.
+       (__BLOB_T_DEFINED, BLOB, PBLOB, LPBLOB): Do not define; instead...
+       (__NSPAPI_H_SOURCED__): ...define this, temporarily; include wtypes.h
+       [!__WINSOCK2_H_SOURCED__ && _WIN32_WINNT >= WIN2K]: Include winsock2.h
+       [!__WINSOCK2_H_SOURCED__ && _WIN32_WINNT < WIN2K]: Include winsock.h
+       [UNICODE vs. !UNICODE]: Discriminate generic symbol names, using...
+       (__AW_SUFFIXED__): ...this, to facilitate definition of each of...
+       (SetService, GetAddressByName, _SERVICE_INFO): ...these, and...
+       (__AW_ALIAS__): ...this, for definition of each of...
+       (SERVICE_INFO, LPSERVICE_INFO): ...these.
+
+       * include/winsock2.h (__WINSOCK2_H_SOURCED__): Define it temporarily.
+       (__CSADDR_T_DEFINED, struct _CSADDR_INFO, CSADDR_INFO, PCSADDR_INFO)
+       (LPCSADDR_INFO, __BLOB_T_DEFINED, BLOB, PBLOB, LPBLOB): Do not define;
+       include nspapi.h selectively, to acquire them.
+
 2017-09-23  Keith Marshall  <keithmarshall@users.sourceforge.net>
 
        Factor <winerror.h> duplicate content out of winsock headers.
index 463b139..fa7706f 100644 (file)
+/*
+ * nspapi.h
+ *
+ * Windows Sockets Namespace Service Provider API definitions.
+ *
+ *
+ * $Id$
+ *
+ * Written by Anders Norlander <anorland@hem2.passagen.se>
+ * Copyright (C) 1998, 1999, 2002, 2004, 2017, MinGW.org Project
+ *
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ */
 #ifndef _NSPAPI_H
-#define _NSPAPI_H
-#if __GNUC__ >=3
 #pragma GCC system_header
-#endif
 
-#ifdef __cplusplus
-extern "C" {
+/* <winsock2.h> will include <nspapi.i> selectively, to resolve circular
+ * definition references; thus...
+ */
+#ifndef __WINSOCK2_H_SOURCED__
+/* ...only when NOT engaged in such selective inclusion, do we process
+ * the entire content of <nspapi.h>; furthermore, before we DO process
+ * the full content, we must process the WinSock API declarations from
+ * <winsock.h> or <winsock2.h>, BEFORE we define the <nspapi.h> repeat
+ * inclusion guard, so that <winsock2.h> may, if necessary, recurse to
+ * access the selectively exposed content.
+ */
+#ifndef _WINSOCK_H
+/* We must include <winsock.h> or <winsock2.h>; (we favour <winsock2.h>
+ * over <winsock.h>, on the same basis as our <windows.h> does).
+ */
+#include <sdkddkver.h>
+#if _WIN32_WINNT >= _WIN32_WINNT_WIN2K
+#include <winsock2.h>
+
+#else  /* _WIN32_WINNT < Win2K */
+#include <winsock.h>
 #endif
 
-#define NS_ALL         0
+#endif /* !_WINSOCK_H */
+/* We can now be confident that the WinSock API has been appropriately
+ * declared; we may now define the <nspapi.h> repeat inclusion guard.
+ */
+#define _NSPAPI_H
 
-#define NS_SAP         1
-#define NS_NDS         2
-#define NS_PEER_BROWSE 3
+#define NS_ALL                                  0
 
-#define NS_TCPIP_LOCAL 10
-#define NS_TCPIP_HOSTS 11
-#define NS_DNS         12
-#define NS_NETBT       13
-#define NS_WINS                14
+#define NS_SAP                                  1
+#define NS_NDS                                  2
+#define NS_PEER_BROWSE                          3
 
-#define NS_NBP         20
+#define NS_TCPIP_LOCAL                         10
+#define NS_TCPIP_HOSTS                         11
+#define NS_DNS                                 12
+#define NS_NETBT                               13
+#define NS_WINS                                14
 
-#define NS_MS          30
-#define NS_STDA                31
-#define NS_NTDS                32
+#define NS_NBP                                 20
 
-#define NS_X500                40
-#define NS_NIS         41
-#define NS_NISPLUS     42
+#define NS_MS                                  30
+#define NS_STDA                                31
+#define NS_NTDS                                32
 
-#define NS_WRQ         50
+#define NS_X500                                40
+#define NS_NIS                                 41
+#define NS_NISPLUS                             42
 
-#define SERVICE_REGISTER       1
-#define SERVICE_DEREGISTER     2
-#define SERVICE_FLUSH          3
-#define SERVICE_FLAG_HARD      0x00000002
+#define NS_WRQ                                 50
 
-#ifndef RC_INVOKED
+#define SERVICE_REGISTER                        1
+#define SERVICE_DEREGISTER                      2
+#define SERVICE_FLUSH                           3
+#define SERVICE_FLAG_HARD              0x00000002
 
-#if defined (_WINSOCK_H) || defined (_WINSOCK2_H) /* needed for LPSOCKADDR */
-#ifndef __CSADDR_T_DEFINED /* also in winsock2.h, but not in winsock.h */
-#define __CSADDR_T_DEFINED
-typedef struct _SOCKET_ADDRESS {
-       LPSOCKADDR lpSockaddr;
-       INT iSockaddrLength;
-} SOCKET_ADDRESS,*PSOCKET_ADDRESS,*LPSOCKET_ADDRESS;
-typedef struct _CSADDR_INFO {
-       SOCKET_ADDRESS LocalAddr;
-       SOCKET_ADDRESS RemoteAddr;
-       INT iSocketType;
-       INT iProtocol;
-} CSADDR_INFO,*PCSADDR_INFO,*LPCSADDR_INFO;
-#endif
-#endif
-
-#ifndef __BLOB_T_DEFINED /* also in wtypes.h and winsock2.h */
-#define __BLOB_T_DEFINED
-typedef struct _BLOB {
-       ULONG   cbSize;
-       BYTE    *pBlobData;
-} BLOB,*PBLOB,*LPBLOB;
-#endif
+#endif /* !__WINSOCK2_H_SOURCED__ */
 
-typedef struct _SERVICE_ADDRESS {
-       DWORD dwAddressType;
-       DWORD dwAddressFlags;
-       DWORD dwAddressLength;
-       DWORD dwPrincipalLength;
-       BYTE *lpAddress;
-       BYTE *lpPrincipal;
+#ifndef RC_INVOKED
+#if ! (defined _NSPAPI_H && defined _WINSOCK2_H)
+/* The following definitions are exposed either when <nspapi.h> is included
+ * directly, or when selectively included by <winsock2.h>, but we must take
+ * care to define them only on the first time of reading.
+ *
+ * We need a complete definition for the BLOB data type, which is provided
+ * in "wtypes.h", (and possibly exposed due to prior selective inclusion by
+ * <winsock2.h>); if neither of these have been included previously, we may
+ * acquire the requisite definition by selective inclusion now.
+ */
+#define __NSPAPI_H_SOURCED__  1
+#include "wtypes.h"
+
+_BEGIN_C_DECLS
+
+/* Technically, according to MSDN, the SOCKET_ADDRESS structure should be
+ * defined in <winsock2.h>, which has not necessarily been included by the
+ * time we get to here, yet the CSADDR_INFO structure, (which is correctly
+ * defined in this file), requires its full definition.  Furthermore, the
+ * CSADDR_INFO structure is representative of the data which is returned
+ * by the GetAddressByName() function, (also declared in this file), which
+ * is declared as deprecated in WinSock v2, (and thus, we would not expect
+ * any such dependency on this WinSock v2 specific <winsock2.h> data type).
+ * This Microsoft API design is critically flawed, but we can mitigate the
+ * fault by defining the SOCKET_ADDRESS structure here, whence we make it
+ * available to <winsock2.h> via selective inclusion.
+ */
+typedef
+struct _SOCKET_ADDRESS
+{ LPSOCKADDR            lpSockaddr;
+  INT                   iSockaddrLength;
+} SOCKET_ADDRESS, *PSOCKET_ADDRESS, *LPSOCKET_ADDRESS;
+
+/* Notwithstanding that, according to MSDN,  the CSADDR_INFO structure is
+ * correctly defined below, (it should not be defined in <winsock2.h>, and
+ * user code should include <nspapi.h> to obtain the complete definition),
+ * <winsock2.h> DOES define the WSAQUERYSET data type, which requires at
+ * least an incomplete type definition for the LPCSADDR_INFO pointer type;
+ * thus, it is convenient to expose this incomplete definition when this
+ * file, <nspapi.h>, is selectively included by <winsock2.h>, whereas the
+ * complete definition of the CSADDR_INFO data type may be deferred until
+ * the user includes <nspapi.h> directly.
+ */
+typedef struct _CSADDR_INFO  CSADDR_INFO, *PCSADDR_INFO, *LPCSADDR_INFO;
+
+_END_C_DECLS
+
+#undef __NSPAPI_H_SOURCED__
+#endif /* ! (_NSPAPI_H && _WINSOCK2_H) */
+
+#ifdef _NSPAPI_H
+/* This indicates that <nspapi.h> has been included directly...
+ */
+_BEGIN_C_DECLS
+
+/* ...thus it is now appropriate to provide the complete type definition
+ * for the CSADDR_INFO structure...
+ */
+struct _CSADDR_INFO
+{ SOCKET_ADDRESS        LocalAddr;
+  SOCKET_ADDRESS        RemoteAddr;
+  INT                   iSocketType;
+  INT                   iProtocol;
+};
+
+/* ...in addition to other data types, and function prototypes, which are
+ * specific to this header file.
+ */
+typedef
+struct _SERVICE_ADDRESS
+{ DWORD                 dwAddressType;
+  DWORD                 dwAddressFlags;
+  DWORD                 dwAddressLength;
+  DWORD                 dwPrincipalLength;
+  BYTE                 *lpAddress;
+  BYTE                 *lpPrincipal;
 } SERVICE_ADDRESS;
-typedef struct _SERVICE_ADDRESSES {
-       DWORD dwAddressCount;
-       SERVICE_ADDRESS Addresses[1];
+
+typedef
+struct _SERVICE_ADDRESSES
+{ DWORD                 dwAddressCount;
+  SERVICE_ADDRESS       Addresses[1];
 } SERVICE_ADDRESSES, *PSERVICE_ADDRESSES, *LPSERVICE_ADDRESSES;
-typedef struct _SERVICE_INFOA {
-       LPGUID lpServiceType;
-       LPSTR lpServiceName;
-       LPSTR lpComment;
-       LPSTR lpLocale;
-       DWORD dwDisplayHint;
-       DWORD dwVersion;
-       DWORD dwTime;
-       LPSTR lpMachineName;
-       LPSERVICE_ADDRESSES lpServiceAddress;
-       BLOB ServiceSpecificInfo;
+
+typedef
+struct _SERVICE_INFOA
+{ LPGUID                lpServiceType;
+  LPSTR                 lpServiceName;
+  LPSTR                 lpComment;
+  LPSTR                 lpLocale;
+  DWORD                 dwDisplayHint;
+  DWORD                 dwVersion;
+  DWORD                 dwTime;
+  LPSTR                 lpMachineName;
+  LPSERVICE_ADDRESSES   lpServiceAddress;
+  BLOB                  ServiceSpecificInfo;
 } SERVICE_INFOA, *LPSERVICE_INFOA;
-typedef struct _SERVICE_INFOW {
-       LPGUID lpServiceType;
-       LPWSTR lpServiceName;
-       LPWSTR lpComment;
-       LPWSTR lpLocale;
-       DWORD dwDisplayHint;
-       DWORD dwVersion;
-       DWORD dwTime;
-       LPWSTR lpMachineName;
-       LPSERVICE_ADDRESSES lpServiceAddress;
-       BLOB ServiceSpecificInfo;
+
+typedef
+struct _SERVICE_INFOW
+{ LPGUID                lpServiceType;
+  LPWSTR                lpServiceName;
+  LPWSTR                lpComment;
+  LPWSTR                lpLocale;
+  DWORD                 dwDisplayHint;
+  DWORD                 dwVersion;
+  DWORD                 dwTime;
+  LPWSTR                lpMachineName;
+  LPSERVICE_ADDRESSES   lpServiceAddress;
+  BLOB                  ServiceSpecificInfo;
 } SERVICE_INFOW, *LPSERVICE_INFOW;
 
+typedef __AW_ALIAS__(SERVICE_INFO), *LPSERVICE_INFO;
 typedef void *LPSERVICE_ASYNC_INFO;
-INT WINAPI SetServiceA(DWORD,DWORD,DWORD,LPSERVICE_INFOA,LPSERVICE_ASYNC_INFO,LPDWORD);
-INT WINAPI SetServiceW(DWORD,DWORD,DWORD,LPSERVICE_INFOW,LPSERVICE_ASYNC_INFO,LPDWORD);
-INT WINAPI GetAddressByNameA(DWORD,LPGUID,LPSTR,LPINT,DWORD,LPSERVICE_ASYNC_INFO,LPVOID,LPDWORD,LPSTR,LPDWORD);
-INT WINAPI GetAddressByNameW(DWORD,LPGUID,LPWSTR,LPINT,DWORD,LPSERVICE_ASYNC_INFO,LPVOID,LPDWORD,LPWSTR,LPDWORD);
-
-#ifdef UNICODE
-typedef SERVICE_INFOW SERVICE_INFO, *LPSERVICE_INFO;
-#define _SERVICE_INFO SERVICE_INFOW
-#define SetService SetServiceW
-#define GetAddressByName GetAddressByNameW
-#else
-typedef SERVICE_INFOA SERVICE_INFO, *LPSERVICE_INFO;
-#define _SERVICE_INFO SERVICE_INFOA
-#define SetService SetServiceA
-#define GetAddressByName GetAddressByNameA
-#endif
 
-#endif /* RC_INVOKED */
+#define SetService __AW_SUFFIXED__(SetService)
+INT WINAPI SetServiceA
+  ( DWORD, DWORD, DWORD, LPSERVICE_INFOA, LPSERVICE_ASYNC_INFO, LPDWORD
+  );
+INT WINAPI SetServiceW
+  ( DWORD, DWORD, DWORD, LPSERVICE_INFOW, LPSERVICE_ASYNC_INFO, LPDWORD
+  );
 
-#ifdef __cplusplus
-}
-#endif
-#endif /* _NSPAPI_H */
+#define GetAddressByName __AW_SUFFIXED__(GetAddressByName)
+INT WINAPI GetAddressByNameA
+  ( DWORD, LPGUID, LPSTR, LPINT, DWORD, LPSERVICE_ASYNC_INFO, LPVOID,
+    LPDWORD, LPSTR, LPDWORD
+  );
+INT WINAPI GetAddressByNameW
+  ( DWORD, LPGUID, LPWSTR, LPINT, DWORD, LPSERVICE_ASYNC_INFO, LPVOID,
+    LPDWORD, LPWSTR, LPDWORD
+  );
+
+#define _SERVICE_INFO __AW_SUFFIXED__(SERVICE_INFO)
+
+_END_C_DECLS
+
+#endif /* _NSPAPI_H */
+#endif /* ! RC_INVOKED */
+
+#endif /* _NSPAPI_H: $RCSfile$: end of file */
index c9e51c4..f51e45c 100644 (file)
@@ -650,6 +650,16 @@ typedef struct protoent PROTOENT, *PPROTOENT, *LPPROTOENT;
 typedef struct timeval TIMEVAL, *PTIMEVAL, *LPTIMEVAL;
 
 /* winsock2 additions */
+#define __WINSOCK2_H_SOURCED__
+
+/* We need a definition for the BLOB data type; although an incomplete
+ * type definition would suffice here, other related headers, <nspapi.h>
+ * in particular, require the full definition, so we may just as well
+ * incorporate that here, by selective inclusion from "wtypes.h", by
+ * way of indirect inclusion from "nspapi.h"
+ */
+#include "nspapi.h"
+
 #define ADDR_ANY                         INADDR_ANY
 
 #define IN_CLASSD(i)       (((long)(i) & 0xF0000000) == 0xE0000000)
@@ -782,46 +792,12 @@ struct _WSAVersion
   WSAECOMPARATOR        ecHow;
 } WSAVERSION, *PWSAVERSION, *LPWSAVERSION;
 
-#ifndef __CSADDR_T_DEFINED
-/* FIXME: This content is also defined in <nspapi.h>; it should be
- * factored out to a single shared location.
- */
-typedef
-struct _SOCKET_ADDRESS
-{ LPSOCKADDR            lpSockaddr;
-  INT                   iSockaddrLength;
-} SOCKET_ADDRESS, *PSOCKET_ADDRESS, *LPSOCKET_ADDRESS;
-
-typedef
-struct _CSADDR_INFO
-{ SOCKET_ADDRESS        LocalAddr;
-  SOCKET_ADDRESS        RemoteAddr;
-  INT                   iSocketType;
-  INT                   iProtocol;
-} CSADDR_INFO, *PCSADDR_INFO, *LPCSADDR_INFO;
-
-#define __CSADDR_T_DEFINED
-#endif
-
 typedef
 struct _SOCKET_ADDRESS_LIST
 { INT                   iAddressCount;
   SOCKET_ADDRESS        Address[1];
 } SOCKET_ADDRESS_LIST, *LPSOCKET_ADDRESS_LIST;
 
-#ifndef __BLOB_T_DEFINED
-/* FIXME: This is also in <wtypes.h> and <nspapi.h>; once again,
- * it should be similarly factored out.
- */
-typedef
-struct _BLOB
-{ ULONG                 cbSize;
-  BYTE                 *pBlobData;
-} BLOB, *PBLOB, *LPBLOB;
-
-#define __BLOB_T_DEFINED
-#endif
-
 typedef
 struct _WSAQuerySetA
 { DWORD                 dwSize;
@@ -1278,4 +1254,5 @@ typedef DWORD (WINAPI *LPFN_WSAWAITFORMULTIPLEEVENTS) (DWORD, const WSAEVENT *,
 
 _END_C_DECLS
 
+#undef __WINSOCK2_H_SOURCED__
 #endif /* _WINSOCK2_H: $RCSfile$: end of file */
index 37f2af2..9149e51 100644 (file)
+/*
+ * wtypes.h
+ *
+ * Miscellaneous Windows data type definitions.
+ *
+ *
+ * $Id$
+ *
+ * Written by Anders Norlander <anorland@hem2.passagen.se>
+ * Copyright (C) 1998-2002, 2004, 2007, 2017, MinGW.org Project
+ *
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ */
+#ifndef _WTYPES_H
+#pragma GCC system_header
+
+/* This file may be selectively included by <nspapi.h>, (possibly
+ * on behalf of <winsock2.h>), to expose only the definition of the
+ * BLOB data structure.
+ */
+#ifndef __NSPAPI_H_SOURCED__
+/* Only when NOT included in this selective manner, do we proceed
+ * to define its full content; note that we continue to defer the
+ * definition of the repeat inclusion guard for <wtypes.h> itself,
+ * to ensure that the appropriate content remains accessible for
+ * recursive inclusion (selectively) while processing <rpc.h>, or
+ * <rpcndr.h>, upon both of which <wtypes.h> is dependent.
+ */
 #include <rpc.h>
 #include <rpcndr.h>
 
-#ifndef _WTYPES_H
+_BEGIN_C_DECLS
+
+#define IID_NULL                            GUID_NULL
+#define CLSID_NULL                          GUID_NULL
+
+#define CBPCLIPDATA(d)           ((d).cbSize-sizeof((d).ulClipFmt))
+
+#define ROTFLAGS_REGISTRATIONKEEPSALIVE        0x01
+#define ROTFLAGS_ALLOWANYCLIENT                0x02
+
+_END_C_DECLS
+
+#endif /* !__NSPAPI_H_SOURCED__ */
+
+#ifndef __BLOB_DATA_TYPE_DEFINED__
+/* Regardles of how we have been included, we must always define
+ * the BLOB data type, (but we must do so only once; note that we
+ * use a data type specific guard here, to simplify detection of
+ * duplicate exposure of this definition).
+ */
+_BEGIN_C_DECLS
+
+typedef
+struct _BLOB
+{ ULONG                 cbSize;
+  BYTE                 *pBlobData;
+} BLOB, *PBLOB, *LPBLOB;
+
+_END_C_DECLS
+
+#define __BLOB_DATA_TYPE_DEFINED__
+#endif /* !__BLOB_DATA_TYPE_DEFINED__ */
+
+#if ! (defined _WTYPES_H || defined __NSPAPI_H_SOURCED__)
+/* Resume specification of the full content of <wtypes.h>; note that,
+ * only now, may we safely define the repeat inclusion guard.
+ */
 #define _WTYPES_H
-#if __GNUC__ >=3
-#pragma GCC system_header
-#endif
 
-#ifdef __cplusplus
-extern "C" {
-#endif
+_BEGIN_C_DECLS
 
-#define IID_NULL GUID_NULL
-#define CLSID_NULL GUID_NULL
-#define CBPCLIPDATA(d) ((d).cbSize-sizeof((d).ulClipFmt))
-#define ROTFLAGS_REGISTRATIONKEEPSALIVE        0x01
-#define ROTFLAGS_ALLOWANYCLIENT                0x02
-
-#ifndef __BLOB_T_DEFINED /* also in winsock2.h */
-#define __BLOB_T_DEFINED
-typedef struct _BLOB {
-       ULONG   cbSize;
-       BYTE    *pBlobData;
-} BLOB,*PBLOB,*LPBLOB;
-#endif
-typedef enum tagDVASPECT {
-       DVASPECT_CONTENT=1,
-       DVASPECT_THUMBNAIL=2,
-       DVASPECT_ICON=4,
-       DVASPECT_DOCPRINT=8
+typedef
+enum tagDVASPECT
+{ DVASPECT_CONTENT                     =        1,
+  DVASPECT_THUMBNAIL                   =        2,
+  DVASPECT_ICON                        =        4,
+  DVASPECT_DOCPRINT                    =        8
 } DVASPECT;
-typedef enum tagDVASPECT2 {
-       DVASPECT_OPAQUE=16,
-       DVASPECT_TRANSPARENT=32
+
+typedef
+enum tagDVASPECT2
+{ DVASPECT_OPAQUE                      =       16,
+  DVASPECT_TRANSPARENT                 =       32
 } DVASPECT2;
-typedef enum tagSTATFLAG {
-       STATFLAG_DEFAULT=0,
-       STATFLAG_NONAME=1
+
+typedef
+enum tagSTATFLAG
+{ STATFLAG_DEFAULT                     =        0,
+  STATFLAG_NONAME                      =        1
 } STATFLAG;
-typedef enum tagMEMCTX {
-       MEMCTX_LOCAL=0,
-       MEMCTX_TASK,
-       MEMCTX_SHARED,
-       MEMCTX_MACSYSTEM,
-       MEMCTX_UNKNOWN=-1,
-       MEMCTX_SAME=-2
+
+typedef
+enum tagMEMCTX
+{ MEMCTX_LOCAL                         =        0,
+  MEMCTX_TASK,
+  MEMCTX_SHARED,
+  MEMCTX_MACSYSTEM,
+  MEMCTX_UNKNOWN                       =       -1,
+  MEMCTX_SAME                          =       -2
 } MEMCTX;
-typedef enum tagMSHCTX {
-       MSHCTX_LOCAL=0,
-       MSHCTX_NOSHAREDMEM,
-       MSHCTX_DIFFERENTMACHINE,
-       MSHCTX_INPROC,
-       MSHCTX_CROSSCTX
+
+typedef
+enum tagMSHCTX
+{ MSHCTX_LOCAL                         =        0,
+  MSHCTX_NOSHAREDMEM,
+  MSHCTX_DIFFERENTMACHINE,
+  MSHCTX_INPROC,
+  MSHCTX_CROSSCTX
 } MSHCTX;
-typedef enum tagCLSCTX {
-       CLSCTX_INPROC_SERVER=1,CLSCTX_INPROC_HANDLER=2,CLSCTX_LOCAL_SERVER=4,
-       CLSCTX_INPROC_SERVER16=8,CLSCTX_REMOTE_SERVER=16
+
+typedef
+enum tagCLSCTX
+{ CLSCTX_INPROC_SERVER                 =        1,
+  CLSCTX_INPROC_HANDLER                =        2,
+  CLSCTX_LOCAL_SERVER                  =        4,
+  CLSCTX_INPROC_SERVER16               =        8,
+  CLSCTX_REMOTE_SERVER                 =       16
 } CLSCTX;
-typedef enum tagMSHLFLAGS {
-       MSHLFLAGS_NORMAL,MSHLFLAGS_TABLESTRONG,MSHLFLAGS_TABLEWEAK
+
+typedef
+enum tagMSHLFLAGS
+{ MSHLFLAGS_NORMAL,
+  MSHLFLAGS_TABLESTRONG,
+  MSHLFLAGS_TABLEWEAK
 } MSHLFLAGS;
-typedef struct _FLAGGED_WORD_BLOB {
-       unsigned long fFlags;
-       unsigned long clSize;
-       unsigned short asData[1];
-}FLAGGED_WORD_BLOB;
+
+typedef
+struct _FLAGGED_WORD_BLOB
+{ unsigned long                 fFlags;
+  unsigned long                 clSize;
+  unsigned short                asData[1];
+} FLAGGED_WORD_BLOB;
 
 #ifndef OLE2ANSI
-typedef WCHAR OLECHAR;
-typedef LPWSTR LPOLESTR;
-typedef LPCWSTR LPCOLESTR;
-#define OLESTR(s) L##s
+typedef WCHAR                   OLECHAR;
+typedef LPWSTR                  LPOLESTR;
+typedef LPCWSTR                 LPCOLESTR;
+
+#define OLESTR(s)               L##s
+
 #else
-typedef char OLECHAR;
-typedef LPSTR LPOLESTR;
-typedef LPCSTR LPCOLESTR;
-#define OLESTR(s) s
+typedef char                    OLECHAR;
+typedef LPSTR                   LPOLESTR;
+typedef LPCSTR                  LPCOLESTR;
+
+#define OLESTR(s)               s
 #endif
-typedef unsigned short VARTYPE;
-typedef short VARIANT_BOOL;
-typedef VARIANT_BOOL _VARIANT_BOOL;
-#define VARIANT_TRUE ((VARIANT_BOOL)0xffff)
-#define VARIANT_FALSE ((VARIANT_BOOL)0)
-typedef OLECHAR *BSTR;
-typedef FLAGGED_WORD_BLOB *wireBSTR;
-typedef BSTR *LPBSTR;
-typedef LONG SCODE;
-typedef void *HCONTEXT;
-typedef union tagCY {
-       _ANONYMOUS_STRUCT struct {
-               unsigned long Lo;
-               long Hi;
-       }_STRUCT_NAME(s);
-       LONGLONG int64;
+
+typedef unsigned short          VARTYPE;
+typedef short                   VARIANT_BOOL;
+typedef VARIANT_BOOL           _VARIANT_BOOL;
+
+#define VARIANT_TRUE   ((VARIANT_BOOL)(0xFFFF))
+#define VARIANT_FALSE  ((VARIANT_BOOL)(0))
+
+typedef OLECHAR                *BSTR;
+typedef FLAGGED_WORD_BLOB      *wireBSTR;
+typedef BSTR                   *LPBSTR;
+typedef LONG                    SCODE;
+typedef void                   *HCONTEXT;
+
+typedef
+union tagCY
+{ _ANONYMOUS_STRUCT struct
+  { unsigned long                 Lo;
+    long                          Hi;
+  }                            _STRUCT_NAME(s);
+  LONGLONG                      int64;
 } CY;
-typedef double DATE;
-typedef struct  tagBSTRBLOB {
-       ULONG cbSize;
-       PBYTE pData;
-}BSTRBLOB;
-typedef struct tagBSTRBLOB *LPBSTRBLOB;
-typedef struct tagCLIPDATA {
-       ULONG cbSize;
-       long ulClipFmt;
-       PBYTE pClipData;
-}CLIPDATA;
-typedef enum tagSTGC {
-       STGC_DEFAULT,STGC_OVERWRITE,STGC_ONLYIFCURRENT,
-       STGC_DANGEROUSLYCOMMITMERELYTODISKCACHE
-}STGC;
-typedef enum tagSTGMOVE {
-       STGMOVE_MOVE,STGMOVE_COPY,STGMOVE_SHALLOWCOPY
-}STGMOVE;
-enum VARENUM {
-       VT_EMPTY,VT_NULL,VT_I2,VT_I4,VT_R4,VT_R8,VT_CY,VT_DATE,VT_BSTR,VT_DISPATCH,
-       VT_ERROR,VT_BOOL,VT_VARIANT,VT_UNKNOWN,VT_DECIMAL,VT_I1=16,VT_UI1,VT_UI2,VT_UI4,VT_I8,
-       VT_UI8,VT_INT,VT_UINT,VT_VOID,VT_HRESULT,VT_PTR,VT_SAFEARRAY,VT_CARRAY,VT_USERDEFINED,
-       VT_LPSTR,VT_LPWSTR,VT_RECORD=36,VT_INT_PTR=37,VT_UINT_PTR=38,VT_FILETIME=64,VT_BLOB,VT_STREAM,VT_STORAGE,VT_STREAMED_OBJECT,
-       VT_STORED_OBJECT,VT_BLOB_OBJECT,VT_CF,VT_CLSID,VT_BSTR_BLOB=0xfff,VT_VECTOR=0x1000,
-       VT_ARRAY=0x2000,VT_BYREF=0x4000,VT_RESERVED=0x8000,VT_ILLEGAL= 0xffff,VT_ILLEGALMASKED=0xfff,
-       VT_TYPEMASK=0xfff
+
+typedef double  DATE;
+
+typedef
+struct  tagBSTRBLOB
+{ ULONG                         cbSize;
+  PBYTE                         pData;
+} BSTRBLOB, *LPBSTRBLOB;
+
+typedef
+struct tagCLIPDATA
+{ ULONG                         cbSize;
+  long                          ulClipFmt;
+  PBYTE                         pClipData;
+} CLIPDATA;
+
+typedef
+enum tagSTGC
+{ STGC_DEFAULT,
+  STGC_OVERWRITE,
+  STGC_ONLYIFCURRENT,
+  STGC_DANGEROUSLYCOMMITMERELYTODISKCACHE
+} STGC;
+
+typedef
+enum tagSTGMOVE
+{ STGMOVE_MOVE,
+  STGMOVE_COPY,
+  STGMOVE_SHALLOWCOPY
+} STGMOVE;
+
+enum VARENUM
+{ VT_EMPTY,
+  VT_NULL,
+  VT_I2,
+  VT_I4,
+  VT_R4,
+  VT_R8,
+  VT_CY,
+  VT_DATE,
+  VT_BSTR,
+  VT_DISPATCH,
+  VT_ERROR,
+  VT_BOOL,
+  VT_VARIANT,
+  VT_UNKNOWN,
+  VT_DECIMAL,
+  VT_I1                                =       16,
+  VT_UI1,
+  VT_UI2,
+  VT_UI4,
+  VT_I8,
+  VT_UI8,
+  VT_INT,
+  VT_UINT,
+  VT_VOID,
+  VT_HRESULT,
+  VT_PTR,
+  VT_SAFEARRAY,
+  VT_CARRAY,
+  VT_USERDEFINED,
+  VT_LPSTR,
+  VT_LPWSTR,
+  VT_RECORD                            =       36,
+  VT_INT_PTR                           =       37,
+  VT_UINT_PTR                          =       38,
+  VT_FILETIME                          =       64,
+  VT_BLOB,
+  VT_STREAM,
+  VT_STORAGE,
+  VT_STREAMED_OBJECT,
+  VT_STORED_OBJECT,
+  VT_BLOB_OBJECT,
+  VT_CF,
+  VT_CLSID,
+  VT_BSTR_BLOB                         =   0x0FFF,
+  VT_VECTOR                            =   0x1000,
+  VT_ARRAY                             =   0x2000,
+  VT_BYREF                             =   0x4000,
+  VT_RESERVED                          =   0x8000,
+  VT_ILLEGAL                           =   0xFFFF,
+  VT_ILLEGALMASKED                     =   0x0FFF,
+  VT_TYPEMASK                          =   0x0FFF
 };
 
-typedef struct _BYTE_SIZEDARR {
-       unsigned long clSize;
-       byte *pData;
-}BYTE_SIZEDARR;
-typedef struct _SHORT_SIZEDARR {
-       unsigned long clSize;
-       unsigned short *pData;
-}WORD_SIZEDARR;
-typedef struct _LONG_SIZEDARR {
-       unsigned long clSize;
-       unsigned long *pData;
-}DWORD_SIZEDARR;
-typedef struct _HYPER_SIZEDARR {
-       unsigned long clSize;
-       hyper *pData;
-}HYPER_SIZEDARR;
-typedef double DOUBLE;
-typedef struct tagDEC {
-       USHORT wReserved;
-       _ANONYMOUS_UNION union {
-               _ANONYMOUS_STRUCT struct {
-                       BYTE scale;
-                       BYTE sign;
-               }_STRUCT_NAME(s);
-               USHORT signscale;
-       } DUMMYUNIONNAME;
-       ULONG Hi32;
-       _ANONYMOUS_UNION union {
-               _ANONYMOUS_STRUCT struct {
-                       ULONG Lo32;
-                       ULONG Mid32;
-               }_STRUCT_NAME(s2);
-               ULONGLONG Lo64;
-       } DUMMYUNIONNAME2;
-} DECIMAL;
-typedef DECIMAL *LPDECIMAL;
-#define DECIMAL_NEG ((BYTE)0x80)
+typedef
+struct _BYTE_SIZEDARR
+{ unsigned long                 clSize;
+  byte                         *pData;
+} BYTE_SIZEDARR;
+
+typedef
+struct _SHORT_SIZEDARR
+{ unsigned long                 clSize;
+  unsigned short               *pData;
+} WORD_SIZEDARR;
+
+typedef
+struct _LONG_SIZEDARR
+{ unsigned long                 clSize;
+  unsigned long                *pData;
+} DWORD_SIZEDARR;
+
+typedef
+struct _HYPER_SIZEDARR
+{ unsigned long                 clSize;
+  hyper                        *pData;
+} HYPER_SIZEDARR;
+
+typedef double  DOUBLE;
+
+typedef
+struct tagDEC
+{ USHORT                        wReserved;
+  _ANONYMOUS_UNION union
+  { _ANONYMOUS_STRUCT struct
+    { BYTE                          scale;
+      BYTE                          sign;
+    }                            _STRUCT_NAME(s);
+    USHORT                        signscale;
+  }                             DUMMYUNIONNAME;
+  ULONG                         Hi32;
+  _ANONYMOUS_UNION union
+  { _ANONYMOUS_STRUCT struct
+    { ULONG                         Lo32;
+      ULONG                         Mid32;
+    }                            _STRUCT_NAME(s2);
+    ULONGLONG                     Lo64;
+  }                             DUMMYUNIONNAME2;
+} DECIMAL, *LPDECIMAL;
+
+#define DECIMAL_NEG ((BYTE)(0x80))
+
 #ifdef NONAMELESSUNION
-#define DECIMAL_SETZERO(d) {(d).DUMMYUNIONNAME2.Lo64=(d).Hi32=(d).DUMMYUNIONNAME.signscale=0;}
+#define DECIMAL_SETZERO(d)                                                  \
+  { (d).DUMMYUNIONNAME2.Lo64 = (d).Hi32 = (d).DUMMYUNIONNAME.signscale = 0;  \
+  }
+
 #else
-#define DECIMAL_SETZERO(d) {(d).Lo64=(d).Hi32=(d).signscale=0;}
-#endif
-typedef void *HMETAFILEPICT;
-#ifdef __cplusplus
-}
-#endif
+#define DECIMAL_SETZERO(d)  { (d).Lo64 = (d).Hi32 = (d).signscale = 0; }
 #endif
+
+typedef void  *HMETAFILEPICT;
+
+_END_C_DECLS
+
+#endif /* _WTYPES_H full content definitions */
+#endif /* _WTYPES_H: $RCSfile$: end of file */