added watt32 headers and brought the DOS version up to parity with UNIX
[oftp] / libs / watt32 / sys / werrno.h
diff --git a/libs/watt32/sys/werrno.h b/libs/watt32/sys/werrno.h
new file mode 100644 (file)
index 0000000..34c06fc
--- /dev/null
@@ -0,0 +1,141 @@
+/*!\file sys/werrno.h
+ *
+ * sys_errlist[] and errno's for compilers with limited errnos.
+ * For WIN32, we do NOT use the <winsock.h> WSAE* codes.
+ *
+ * G. Vanem <giva@bgnett.no> 1998 - 2004
+ */
+
+#ifndef __SYS_WERRNO_H
+#define __SYS_WERRNO_H
+
+/* When doing "gcc -MM" with gcc 3.0 we must include <sys/version.h>
+ * (via stdio.h) in order for __DJGPP__ to be defined
+ */
+#include <stdio.h>
+#include <errno.h>
+
+#ifndef __SYS_W32API_H
+#include <sys/w32api.h>
+#endif
+
+/* Hack: fix for compiling with djgpp 2.04, but
+ *       ./util/dj_err.exe was compiled with 2.03
+ */
+#if defined(MIXING_DJGPP_203_AND_204)
+#undef ELOOP
+#endif
+
+#if defined(__MINGW32__)
+  #include <sys/mingw32.err>
+
+#elif defined(__HIGHC__)
+  #undef EDEADLK
+  #undef EDEADLOCK
+  #include <sys/highc.err>
+
+#elif defined(__BORLANDC__)
+  #ifdef __FLAT__
+  #undef ENAMETOOLONG  /* bcc32 4.0 */
+  #endif
+  #ifdef _WIN32
+  #undef ENOTEMPTY
+  #endif
+  #include <sys/borlandc.err>
+
+#elif defined(__TURBOC__)
+  #include <sys/turboc.err>
+
+#elif defined(__WATCOMC__)
+  #include <sys/watcom.err>
+
+#elif defined(__DJGPP__)
+  #include <sys/djgpp.err>
+
+#elif defined(__DMC__)                        /* Digital Mars Compiler */
+  #include <sys/digmars.err>
+
+#elif defined(_MSC_VER) && (_MSC_VER <= 800)  /* MSC 8.0 or older */
+  #include <sys/quickc.err>
+
+#elif defined(_MSC_VER) && (_MSC_VER > 800)   /* Visual C on Windows */
+  #undef EDEADLOCK
+  #include <sys/visualc.err>
+
+#elif defined(__CCDL__)                       /* LadSoft's cc386.exe */
+  #include <sys/ladsoft.err>
+
+#elif defined(__LCC__)
+  #include <sys/lcc.err>
+
+#elif defined(__POCC__)
+  #include <sys/pellesc.err>
+
+#else
+  #error Unknown target in <sys/werrno.h>.
+#endif
+
+/*
+ * Ugly hack ahead. Someone tell me a better way, but
+ * errno and friends are macros on Windows. Redefine them
+ * to point to our variables.
+ *
+ * On Windows, the usual 'errno' is a macro "(*_errno)()" that
+ * is problematic to use as a lvalue.
+ * On other platforms we modify the global 'errno' variable directly.
+ * (see SOCK_ERRNO() in misc.h). So no need to redefine it in any way.
+ */
+
+W32_DATA int   _w32_errno;
+W32_DATA int   _w32_sys_nerr;
+W32_DATA char *_w32_sys_errlist[];
+
+#if 0
+  #undef  sys_nerr
+  #define sys_nerr      _w32_sys_nerr
+
+  #undef  _sys_nerr
+  #define _sys_nerr     _w32_sys_nerr
+
+  #undef  __sys_nerr
+  #define __sys_nerr    _w32_sys_nerr
+
+  #undef  sys_errlist
+  #define sys_errlist   _w32_sys_errlist
+
+  #undef  _sys_errlist
+  #define _sys_errlist  _w32_sys_errlist
+
+  #undef  __sys_errlist
+  #define __sys_errlist _w32_sys_errlist
+#endif
+
+/*
+ * Incase you have trouble with duplicate defined symbols,
+ * make sure the "*_s()" versions are referenced before normal
+ * perror() and strerror() in your C-library.
+ */
+W32_FUNC void  perror_s   (const char *str);
+W32_FUNC char *strerror_s (int errnum);
+
+#if defined(__cplusplus)  /* Damn C++ */
+  #include <stdlib.h>
+  #include <string.h>
+
+#elif !defined(_MSC_VER) && !defined(WIN32)
+  #if !defined(_INC_STDLIB) && !defined(_STDLIB_H_) && !defined(_STDIO_H)
+  W32_FUNC void perror (const char *str);
+  #endif
+
+  #if !defined(_INC_STRING) && !defined(_STRING_H) && !defined(_STRING_H_)
+  W32_FUNC char *strerror (int errnum);
+  #endif
+#endif
+
+#if defined(WIN32) || defined(_WIN32)
+  W32_FUNC int  __stdcall WSAGetLastError (void);
+  W32_FUNC void __stdcall WSASetLastError (int err);
+#endif
+
+#endif  /* __SYS_WERRNO_H */
+