diff dwcompat.h @ 1594:6baf177f335c

Rename compat.c/h dwcompat.c/h and configure option to --with-dwcompat. There are several other projects that include compat.c and compat.h... To avoid conflicts make sure the header and source files match the library.
author bsmith@81767d24-ef19-dc11-ae90-00e081727c95
date Thu, 23 Feb 2012 12:44:15 +0000
parents compat.h@9a21fbd6ae50
children 71e0a3ad07f7
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwcompat.h	Thu Feb 23 12:44:15 2012 +0000
@@ -0,0 +1,394 @@
+/* $Id$ */
+
+#ifndef _DWCOMPAT_H
+#define _DWCOMPAT_H
+
+/* This header includes and defines everything needed for a given OS/compiler */
+#if defined(__UNIX__) || defined(__MAC__)
+#include "config.h"
+
+/* Attempt to include 64 bit file functions on various unix flavors */
+#ifndef _FILE_OFFSET_BITS
+#define _FILE_OFFSET_BITS 64
+#endif
+#ifndef _LARGEFILE_SOURCE
+#define _LARGEFILE_SOURCE 1
+#endif
+#ifndef _LARGEFILE64_SOURCE
+#define _LARGEFILE64_SOURCE 1
+#endif
+#ifndef _LARGE_FILES
+#define _LARGE_FILES 1
+#endif
+#ifndef _DARWIN_USE_64_BIT_INODE
+#define _DARWIN_USE_64_BIT_INODE 1
+#endif
+
+#include <sys/stat.h>
+#include <unistd.h>
+void msleep(long period);
+#endif /* Unix */
+
+#ifndef __TARGET__
+#define __TARGET__ "dw"
+#endif
+
+#include <sys/types.h>
+#if HAVE_DIRENT_H
+#include <dirent.h>
+#define NAMLEN(dirent) strlen((dirent)->d_name)
+#else
+#define dirent direct
+#define NAMLEN(dirent) (dirent)->d_namlen
+#if HAVE_SYS_NDIR_H
+#include <sys/ndir.h>
+#endif /* HAVE_SYS_NDIR_H */
+#if HAVE_SYS_DIR_H
+#include <sys/dir.h>
+#endif /* HAVE_SYS_DIR_H */
+#if HAVE_NDIR_H
+#include <ndir.h>
+#endif /* HAVE_NDIR_H */
+#endif /* HAVE_DIRENT_H */
+
+#ifdef DIRSEP
+#undef DIRSEP
+#endif
+
+#ifdef __WATCOMC__
+#include <alloca.h>
+#include <sys/select.h>
+#include <sys/stat.h>
+#  ifdef _stati64
+#    ifdef stat
+#    undef stat
+#    endif
+#  define stat(a, b) _stati64(a, b)
+#  define dwstat _stati64
+#  endif
+#endif
+
+#if defined(__EMX__) || defined(__OS2__) || defined(__WIN32__) || defined(WINNT)
+#include <io.h>
+#include <process.h>
+
+#define DIRSEP "\\"
+#define TYPDIR "."
+#else
+#define DIRSEP "/"
+#define TYPDIR "/usr/local/" __TARGET__
+#endif
+#define INIDIR "~/." __TARGET__
+
+/* OS/2 */
+#if defined(__EMX__) || defined(__OS2__)
+#define INCL_WIN
+#define INCL_GPI
+#define INCL_VIO
+#define INCL_NLS
+#define INCL_DOS
+#define INCL_DEV
+#define INCL_DOSERRORS
+
+#ifdef __OS2__
+# if (defined(__IBMC__) || defined(__WATCOMC__) || defined(_System)) && !defined(API)
+# define API _System
+# endif
+#endif
+
+#ifndef API
+#define API
+#endif
+
+#define msleep(a) DosSleep(a)
+
+#ifdef __EMX__
+#include "platform/dirent.h"
+#include <sys/stat.h>
+#define HAVE_PIPE
+#ifdef FD_SETSIZE
+#undef FD_SETSIZE
+#endif
+#define FD_SETSIZE 1024
+#endif /* __EMX__ */
+
+#if defined(__EMX__) || defined(__WATCOMC__)
+#define strcasecmp stricmp
+#define strncasecmp strnicmp
+#endif
+
+#ifndef OS2
+#define OS2
+#endif /* OS2 */
+
+#include <os2.h>
+
+#ifndef BKS_TABBEDDIALOG
+#define BKS_TABBEDDIALOG          0x0800
+#endif
+
+#define PIPENAME "\\socket\\" __TARGET__ "%d"
+#define TPIPENAME "\\socket\\" __TARGET__ "%d"
+#else
+#define PIPENAME "/tmp/" __TARGET__ "%d"
+#define TPIPENAME "/tmp/" __TARGET__ "%d"
+#endif /* __EMX__ || __IBMC__ */
+
+#if defined(__OS2__) && (defined(__IBMC__) || defined(__WATCOMC__))
+#define BSD_SELECT
+
+#include <types.h>
+#include <time.h>
+#include <sys/stat.h>
+#include <sys/select.h>
+#include <sys/ioctl.h>
+#include <direct.h>
+#include <stdarg.h>
+/* For VAC we are using the Mozilla dirent.c */
+#ifndef __WATCOMC__
+#include "platform/dirent.h"
+#endif
+#endif
+
+/* Windows */
+#if defined(__WIN32__) || defined(WINNT)
+
+#if defined(MSVC) && !defined(API)
+# ifdef __MINGW32__
+#  ifdef BUILD_DLL
+#   define API APIENTRY __declspec(dllexport)
+#  else
+#   define API APIENTRY __declspec(dllimport)
+#  endif
+# else
+#  define API _cdecl
+# endif
+#endif
+
+#include <windows.h>
+#include <winsock.h>
+#include <time.h>
+#include <process.h>
+#include <sys/stat.h>
+
+#ifdef MSVC
+#include "platform/dirent.h"
+#define alloca _alloca
+#ifdef __stat64
+#undef stat
+#define stat(a, b) _stat64(a, b)
+#define dwstat __stat64
+#endif
+#else
+#include <dir.h>
+#include <dirent.h>
+#endif
+
+#include <stdarg.h>
+
+#if defined(__CYGWIN32__) /*|| defined(__MINGW32__)*/
+#include <sys/un.h>
+#endif /* __CYGWIN32__ || __MINGW32__ */
+
+#ifndef __CYGWIN32__
+#define NO_DOMAIN_SOCKETS
+#endif /* __CYGWIN32__ */
+
+#if defined(_P_NOWAIT) && !defined(P_NOWAIT)
+#define P_NOWAIT _P_NOWAIT
+#endif
+
+#define strcasecmp stricmp
+#define strncasecmp strnicmp
+#define msleep Sleep
+
+#endif /* WIN32 */
+
+/* Everything else ;) */
+#include <stdio.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif /* HAVE_UNISTD_H */
+#ifdef HAVE_SYS_STAT_H
+#include <sys/stat.h>
+#endif
+#include <stdlib.h>
+#include <stddef.h>
+#include <signal.h>
+#include <fcntl.h>
+
+#if !defined(__WIN32__) && !defined(WINNT)
+#include <sys/time.h>
+#include <sys/socket.h>
+#include <sys/un.h>
+#include <netinet/in.h>
+#include <netdb.h>
+#ifndef __IBMC__
+#include <arpa/inet.h>
+#endif
+#if defined(__OS2__) && defined(RES_DEFAULT)
+#undef RES_DEFAULT
+#endif
+#include <stdarg.h>
+#include <string.h>
+#endif /* !WIN32 */
+#include <ctype.h>
+
+#ifndef _MAX_PATH
+#define _MAX_PATH 255
+#endif
+
+/* IBM C doesn't allow "t" in the mode parameter
+ * because it violates the ANSI standard.
+ */
+#ifdef __IBMC__
+#define FOPEN_READ_TEXT "r"
+#define FOPEN_WRITE_TEXT "w"
+#define FOPEN_APPEND_TEXT "a"
+#else
+#define FOPEN_READ_TEXT "rt"
+#define FOPEN_WRITE_TEXT "wt"
+#define FOPEN_APPEND_TEXT "at"
+#endif
+#define FOPEN_READ_BINARY "rb"
+#define FOPEN_WRITE_BINARY "wb"
+#define FOPEN_APPEND_BINARY "ab"
+
+#ifndef API
+#define API
+#endif
+
+/* Compatibility layer for IBM C/Winsock
+ * Now using macros so we can allow cross
+ * compiler support.
+ */
+
+#if defined(__IBMC__) || (defined(__WIN32__) && !defined(__CYGWIN32__))
+#define sockread(a, b, c, d) recv(a, b, c, d)
+#else
+#define sockread(a, b, c, d) read(a, b, c)
+#endif
+
+#if defined(__IBMC__) || (defined(__WIN32__) && !defined(__CYGWIN32__))
+#define sockwrite(a, b, c, d) send(a, b, c, d)
+#else
+#define sockwrite(a, b, c, d) write(a, b, c)
+#endif
+
+#ifdef __IBMC__
+#define sockclose(a) soclose(a)
+#elif defined(__WIN32__) && !defined(__CYGWIN32__)
+#define sockclose(a) closesocket(a)
+#else
+#define sockclose(a) close(a)
+#endif
+
+#if defined(__OS2__) && !defined(__EMX__)
+#define nonblock(a)	{ int _nonblock = 1; ioctl(a, FIONBIO, (char *)&_nonblock, sizeof(_nonblock)); }
+#elif defined(__WIN32__) && !defined(__CYGWIN32__)
+#define nonblock(a) { int _nonblock = 1; ioctlsocket(a, FIONBIO, (unsigned long *)&_nonblock); }
+#else
+#define nonblock(a) fcntl(a, F_SETFL, O_NONBLOCK)
+#endif
+
+#if defined(__OS2__) && !defined(__EMX__)
+#define block(a) { int _block = 0; ioctl(a, FIONBIO, (char *)&_nonblock, sizeof(_block)); }
+#elif defined(__WIN32__) && !defined(__CYGWIN32__)
+#define block(a) { int _block = 0; ioctlsocket(a, FIONBIO, (unsigned long *)&_block); }
+#else
+#define block(a) fcntl(a, F_SETFL, 0)
+#endif
+
+#ifdef __IBMC__
+#define sockinit() sock_init();
+#elif defined(__WIN32__) || defined(WINNT)
+#define sockinit() { static WSADATA wsa; WSAStartup(MAKEWORD (1, 1), &wsa); }
+#else  /* !WIN32 */
+#define sockinit()
+#endif
+
+#if defined(__WIN32__) || defined(WINNT)
+#define sockshutdown() WSACleanup()
+#else /* !WIN32 */
+#define sockshutdown()
+#endif
+
+#ifdef HAVE_PIPE
+#define sockpipe(pipes) { if(pipe(pipes) < 0) pipes[0] = pipes[1] = -1; }
+#elif !defined(NO_DOMAIN_SOCKETS)
+#define sockpipe(pipes) { \
+	struct sockaddr_un un; \
+	int tmpsock = socket(AF_UNIX, SOCK_STREAM, 0); \
+	pipes[1] = socket(AF_UNIX, SOCK_STREAM, 0); \
+	memset(&un, 0, sizeof(un)); \
+	un.sun_family=AF_UNIX; \
+	sprintf(un.sun_path, PIPENAME, pipes[1]); \
+	bind(tmpsock, (struct sockaddr *)&un, sizeof(un)); \
+	listen(tmpsock, 0); \
+	connect(pipes[1], (struct sockaddr *)&un, sizeof(un)); \
+	pipes[0] = accept(tmpsock, 0, 0); \
+	sockclose(tmpsock); \
+	}
+#else
+#define sockpipe(pipes) { \
+	struct sockaddr_in server_addr; \
+	struct sockaddr_in listen_addr = { 0 }; \
+	int tmpsock, len = sizeof(struct sockaddr_in); \
+	struct hostent *he = gethostbyname("localhost"); \
+	pipes[0] = pipes[1] = -1; \
+	if(he) \
+	{ \
+		memset(&server_addr, 0, sizeof(server_addr)); \
+		server_addr.sin_family = AF_INET; \
+		server_addr.sin_port   = 0; \
+		server_addr.sin_addr.s_addr = INADDR_ANY; \
+		if ((tmpsock = socket(AF_INET, SOCK_STREAM, 0)) > -1 && bind(tmpsock, (struct sockaddr *)&server_addr, sizeof(server_addr)) > -1 && listen(tmpsock, 0) > -1) \
+	    { \
+		    memset(&listen_addr, 0, sizeof(listen_addr)); \
+		    getsockname(tmpsock, (struct sockaddr *)&listen_addr, &len); \
+		    server_addr.sin_family      = AF_INET; \
+		    server_addr.sin_port        = listen_addr.sin_port; \
+		    server_addr.sin_addr.s_addr = *((unsigned long *)he->h_addr); \
+		    if((pipes[1] = socket(AF_INET, SOCK_STREAM, 0)) > -1 && !connect(pipes[1], (struct sockaddr *)&server_addr, sizeof(server_addr))) \
+			   pipes[0] = accept(tmpsock, 0, 0); \
+	    } \
+		sockclose(tmpsock); \
+	} \
+}
+#endif
+
+/* Ok Windows and OS/2 both seem to be missing this */
+#if defined(__WIN32__) || defined(__OS2__)
+typedef int socklen_t;
+#endif
+
+/* If dwstat didn't otherwise get defined */
+#ifndef dwstat
+#define dwstat stat
+#endif
+
+#define socksprint(a, b) sockwrite(a, b, strlen(b), 0)
+
+char * API vargs(char *buf, int len, char *format, ...);
+int API makedir(char *path);
+void API setfileinfo(char *filename, char *url, char *logfile);
+long double API drivesize(int drive);
+long double API drivefree(int drive);
+int API isdrive(int drive);
+void API getfsname(int drive, char *buf, int len);
+FILE * API fsopen(char *path, char *modes);
+int API fsclose(FILE *fp);
+char * API fsgets(char *str, int size, FILE *stream);
+int API fsseek(FILE *stream, long offset, int whence);
+int API locale_init(char *filename, int my_locale);
+char * API locale_string(char *default_text, int message);
+void API nice_strformat(char *dest, long double val, int dec);
+void API initdir(int argc, char *argv[]);
+int API setpath(char *path);
+
+#ifdef __MINGW32__
+# undef API
+# define API APIENTRY
+#endif
+
+#endif