added watt32 headers and brought the DOS version up to parity with UNIX
[oftp] / libs / watt32 / sys / w32api.h
diff --git a/libs/watt32/sys/w32api.h b/libs/watt32/sys/w32api.h
new file mode 100644 (file)
index 0000000..3770f7e
--- /dev/null
@@ -0,0 +1,71 @@
+/*!\file sys/w32api.h
+ *
+ * Watt-32 API decoration for Win32 targets.
+ */
+#ifndef __SYS_W32API_H
+#define __SYS_W32API_H
+
+#if !defined(_WATT32_FAKE_WINSOCK_H) && (defined(_WINSOCK_H) || defined(_WINSOCKAPI_))
+  #error Never include the real <winsock.h> in Watt-32 programs.
+  #error Change your include-path so the fake <winsock.h> gets included first.
+#endif
+
+#if !defined(_WATT32_FAKE_WINSOCK2_H) && (defined(_WINSOCK2_H) || defined(_WINSOCK2API_))
+  #error Never include the real <winsock2.h> in Watt-32 programs.
+  #error Change your include-path so the fake <winsock2.h> gets included first.
+#endif
+
+#if !defined(_WATT32_FAKE_WS2TCPIP_H) && defined(_WS2TCPIP_H)
+  #error Never include the real <ws2tcpip.h> in Watt-32 programs.
+  #error Change your include-path so the fake <ws2tcpip.h> gets included first.
+#endif
+
+#if defined(WIN32) || defined(_WIN32)
+  /* Don't include the real <winsock*.h> */
+  #define _WINSOCKAPI_
+  #define _WINSOCK2API_
+  #define _WINSOCK_H
+  #define _WINSOCK2_H
+  #ifndef WIN32_LEAN_AND_MEAN
+  #define WIN32_LEAN_AND_MEAN
+  #endif
+  #include <windows.h>
+#endif
+
+/*
+ * For non-Win32 targets the .\util\mkimp program (a small C-preprocessor)
+ * is meant to search all headers for W32_FUNC/W32_DATA prefixes. All
+ * functions with a W32_FUNC prefix will produce an export stub function.
+ * See dj_dxe.mak. Very experimental at the moment.
+ *
+ * Note: only a small subset of the Winsock extensions are implemented in
+ *       watt-32.dll (hardly any WSA*() functions yet).
+ */
+#if (defined(WIN32) || defined(_WIN32)) && !defined(WATT32_STATIC)
+  #if defined(WATT32_BUILD)
+    #define W32_FUNC  extern __declspec(dllexport)
+    #define W32_DATA  extern __declspec(dllexport)
+  #else
+    #define W32_FUNC  extern __declspec(dllimport)
+    #define W32_DATA  extern __declspec(dllimport)
+  #endif
+#else
+  #define W32_FUNC  extern
+  #define W32_DATA  extern
+#endif
+
+/*
+ * W32_CALL is *not* defined to `stdcall' due to a bug in MingW's
+ * linker. This bug prevents a MingW generated WATT-32.DLL from
+ * being used by e.g. a MSVC program.
+ * Ref. http://sources.redhat.com/bugzilla/show_bug.cgi?id=351
+ * (last paragraph)
+ */
+#if (defined(WIN32) || defined(_WIN32)) && 0
+  #define W32_CALL  __stdcall /* maybe __fastcall instead for MSVC? */
+#else
+  #define W32_CALL
+#endif
+
+#endif
+