#ifndef _sw_platform_h #define _sw_platform_h /* * Copyright 2003, 2004 Porchdog Software, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY PORCHDOG SOFTWARE ``AS IS'' AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE HOWL PROJECT OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * The views and conclusions contained in the software and documentation are those * of the authors and should not be interpreted as representing official policies, * either expressed or implied, of Porchdog Software, Inc. */ #ifdef __cplusplus extern "C" { #endif #if defined(__VXWORKS__) # define HOWL_API # include <vxworks.h> # include <sysLib.h> # define sw_snooze(SECS) taskDelay(sysClkRateGet() * SECS) #elif defined(WIN32) # define WIN32_LEAN_AND_MEAN # define HOWL_API __stdcall # pragma warning(disable:4127) # include <windows.h> # include <stdlib.h> typedef signed char int8_t; typedef unsigned char u_int8_t; typedef signed short int16_t; typedef unsigned short u_int16_t; typedef signed long int32_t; typedef unsigned long u_int32_t; typedef _int64 int64_t; typedef _int64 u_int64_t; # define sw_snooze(SECS) Sleep(SECS * 1000) #else # define HOWL_API # if defined(HOWL_KERNEL) # include <howl_config.h> # endif # include <sys/types.h> # include <stdlib.h> # include <unistd.h> # define sw_snooze(SECS) sleep(SECS) #endif #if defined(__sun) # define u_int8_t uint8_t # define u_int16_t uint16_t # define u_int32_t uint32_t # define u_int64_t uint64_t #endif typedef void * sw_opaque; typedef void * sw_opaque_t; typedef int8_t sw_int8; typedef u_int8_t sw_uint8; typedef u_int8_t sw_bool; typedef int16_t sw_int16; typedef u_int16_t sw_uint16; typedef int32_t sw_int32; typedef u_int32_t sw_uint32; typedef int64_t sw_int64; typedef u_int64_t sw_uint64; typedef char * sw_string; typedef sw_uint8 * sw_octets; #if !defined(__VXWORKS__) || defined(__cplusplus) typedef const char * sw_const_string; typedef const u_int8_t * sw_const_octets; #else typedef char * sw_const_string; typedef u_int8_t * sw_const_octets; #endif typedef size_t sw_size_t; typedef int sw_result; /* -------------------------------------------------------- * * Endian-osity * * SW_ENDIAN is 0 for big endian platforms, 1 * for little endian platforms. * * The macro WORDS_BIGENDIAN will be defined * by autoconf. If you are using Howl on * a platform that doesn't have autoconf, define * SW_ENDIAN directly * -------------------------------------------------------- */ #if !defined(SW_ENDIAN) # if defined(WORDS_BIGENDIAN) && WORDS_BIGENDIAN == 1 # define SW_ENDIAN 0 # else # define SW_ENDIAN 1 # endif #endif /* -------------------------------------------------------- * * Strings * * These macros supports cross platform string functions * for the following OSes * * Win32 * *NIX * PalmOS * VxWorks * * -------------------------------------------------------- */ #if defined(WIN32) # include <string.h> # define sw_memset(ARG1, ARG2, ARG3) memset((char*) ARG1, ARG2, ARG3) # define sw_memcpy(ARG1, ARG2, ARG3) memmove((char*) ARG1, (char*) ARG2, ARG3) # define sw_memcmp(ARG1, ARG2, ARG3) memcmp((char*) ARG1, ARG2, ARG3) # define sw_strcasecmp(ARG1, ARG2) stricmp(ARG1, ARG2) # define sw_strncasecmp(ARG1, ARG2) strnicmp(ARG1, ARG2) # define sw_strcat(ARG1, ARG2) strcat(ARG1, ARG2) # define sw_strncat(ARG1, ARG2) strncat(ARG1, ARG2) # define sw_strchr(ARG1, ARG2) strchr(ARG1, ARG2) # define sw_strcmp(ARG1, ARG2) strcmp(ARG1, ARG2) # define sw_strncmp(ARG1, ARG2) strncmp(ARG1, ARG2) # define sw_strcoll(ARG1, ARG2) strcoll(ARG1, ARG2) # define sw_strcpy(ARG1, ARG2) (ARG2) ? strcpy(ARG1, ARG2) : strcpy(ARG1, "") # define sw_strncpy(ARG1, ARG2, N) (ARG2) ? strncpy(ARG1, ARG2, N) : strcpy(ARG1, "") # define sw_strcspn(ARG1, ARG2) strcspn(ARG1, ARG2) # define sw_strlen(ARG1) strlen(ARG1) # define sw_strstr(ARG1, ARG2) strstr(ARG1, ARG2) # define sw_strtok_r(ARG1, ARG2, ARG3) strtok_r(ARG1, ARG2, ARG3) #elif defined(__VXWORKS__) # include <string.h> extern sw_int32 sw_strcasecmp( sw_const_string arg1, sw_const_string arg2); extern sw_int32 sw_strncasecmp( sw_const_string arg1, sw_const_string arg2, sw_len n); extern sw_string sw_strtok_r( sw_string arg1, sw_const_string arg2, sw_string * lasts); # define sw_memset(ARG1, ARG2, ARG3) memset((char*) ARG1, ARG2, ARG3) # define sw_memcpy(ARG1, ARG2, ARG3) memcpy((char*) ARG1, (char*) ARG2, ARG3) # define sw_memcmp(ARG1, ARG2, ARG3) memcmp((char*) ARG1, ARG2, ARG3) # define sw_strcat(ARG1, ARG2) strcat(ARG1, ARG2) # define sw_strncat(ARG1, ARG2) strncat(ARG1, ARG2) # define sw_strchr(ARG1, ARG2) strchr(ARG1, ARG2) # define sw_strcmp(ARG1, ARG2) strcmp(ARG1, ARG2) # define sw_strncmp(ARG1, ARG2) strncmp(ARG1, ARG2) # define sw_strcoll(ARG1, ARG2) strcoll(ARG1, ARG2) # define sw_strcpy(ARG1, ARG2) ARG2 ? strcpy(ARG1, ARG2) : strcpy(ARG1, "") # define sw_strncpy(ARG1, ARG2, N) ARG2 ? strncpy(ARG1, ARG2, N) : strcpy(ARG1, "") # define sw_strcspn(ARG1, ARG2) strcspn(ARG1, ARG2) # define sw_strlen(ARG1) strlen(ARG1) # define sw_strstr(ARG1, ARG2) strstr(ARG1, ARG2) #elif defined(__PALMOS__) # include <StringMgr.h> # define sw_strcasecmp(ARG1, ARG2) strcasecmp(ARG1, ARG2) # define sw_strncasecmp(ARG1, ARG2) strncasecmp(ARG1, ARG2) # define sw_strcat(ARG1, ARG2) StrCat(ARG1, ARG2) # define sw_strncat(ARG1, ARG2) StrNCat(ARG1, ARG2) # define sw_strchr(ARG1, ARG2) StrChr(ARG1, ARG2) # define sw_strcmp(ARG1, ARG2) StrCampare(ARG1, ARG2) # define sw_strncmp(ARG1, ARG2) StrNCompare(ARG1, ARG2) # define sw_strcoll(ARG1, ARG2) strcoll(ARG1, ARG2) # define sw_strcpy(ARG1, ARG2) ARG2 ? StrCopy(ARG1, ARG2) : StrCopy(ARG1, "") # define sw_strncpy(ARG1, ARG2, N) ARG2 ? StrNCopy(ARG1, ARG2, N) : StrCopy(ARG1, "") # define sw_strcspn(ARG1, ARG2) strcspn(ARG1, ARG2) # define sw_strlen(ARG1) StrLen(ARG1) # define sw_strstr(ARG1, ARG2) strstr(ARG1, ARG2) # define sw_strtok_r(ARG1, ARG2, ARG3) strtok_r(ARG1, ARG2, ARG3) #else # include <string.h> # if defined(__Lynx__) char * strchr(char*, int); # endif # define sw_memset(ARG1, ARG2, ARG3) memset((char*) ARG1, ARG2, ARG3) # define sw_memcpy(ARG1, ARG2, ARG3) memcpy((char*) ARG1, (char*) ARG2, ARG3) # define sw_memcmp(ARG1, ARG2, ARG3) memcmp((char*) ARG1, ARG2, ARG3) # define sw_strcasecmp(ARG1, ARG2) strcasecmp(ARG1, ARG2) # define sw_strncasecmp(ARG1, ARG2) strncasecmp(ARG1, ARG2) # define sw_strcat(ARG1, ARG2) strcat(ARG1, ARG2) # define sw_strncat(ARG1, ARG2) strncat(ARG1, ARG2) # define sw_strchr(ARG1, ARG2) strchr(ARG1, ARG2) # define sw_strcmp(ARG1, ARG2) strcmp(ARG1, ARG2) # define sw_strncmp(ARG1, ARG2) strncmp(ARG1, ARG2) # define sw_strcoll(ARG1, ARG2) strcoll(ARG1, ARG2) # define sw_strcpy(ARG1, ARG2) ARG2 ? strcpy(ARG1, ARG2) : strcpy(ARG1, "") # define sw_strncpy(ARG1, ARG2, N) ARG2 ? strncpy(ARG1, ARG2, N) : strcpy(ARG1, "") # define sw_strcspn(ARG1, ARG2) strcspn(ARG1, ARG2) # define sw_strlen(ARG1) strlen(ARG1) # define sw_strstr(ARG1, ARG2) strstr(ARG1, ARG2) # define sw_strtok_r(ARG1, ARG2, ARG3) strtok_r(ARG1, ARG2, ARG3) #endif sw_string sw_strdup( sw_const_string str); /* -------------------------------------------------------- * * Memory * * These macros support cross platform heap functions. * When compiling with DEBUG, some extra checking is * done which can aid in tracking down heap corruption * problems * * -------------------------------------------------------- */ #if defined(NDEBUG) # define sw_malloc(SIZE) malloc(SIZE) # define sw_realloc(MEM,SIZE) realloc(MEM, SIZE) # define sw_free(MEM) if (MEM) free(MEM) #else # define sw_malloc(SIZE) _sw_debug_malloc(SIZE, __SW_FUNCTION__, __FILE__, __LINE__) # define sw_realloc(MEM,SIZE) _sw_debug_realloc(MEM, SIZE, __SW_FUNCTION__, __FILE__, __LINE__) # define sw_free(MEM) if (MEM) _sw_debug_free(MEM, __SW_FUNCTION__, __FILE__, __LINE__) #endif sw_opaque HOWL_API _sw_debug_malloc( sw_size_t size, sw_const_string function, sw_const_string file, sw_uint32 line); sw_opaque HOWL_API _sw_debug_realloc( sw_opaque_t mem, sw_size_t size, sw_const_string function, sw_const_string file, sw_uint32 line); void HOWL_API _sw_debug_free( sw_opaque_t mem, sw_const_string function, sw_const_string file, sw_uint32 line); /* -------------------------------------------------------- * * Sockets * * These macros and APIs support cross platform socket * calls. I am relying on BSD APIs, but even with those * there are subtle and not so subtle platform differences * * -------------------------------------------------------- */ #if defined(__VXWORKS__) # include <vxworks.h> # include <hostLib.h> # include <sockLib.h> # include <ioLib.h> # include <inetLib.h> typedef int sw_sockdesc_t; typedef socklen_t sw_socklen_t; #elif defined(WIN32) # include <winsock2.h> typedef SOCKET sw_sockdesc_t; typedef int sw_socklen_t; # define SW_E_WOULDBLOCK WSAEWOULDBLOCK # define SW_INVALID_SOCKET INVALID_SOCKET # define SW_SOCKET_ERROR SOCKET_ERROR # define sw_close_socket(X) closesocket(X) #else # if defined(sun) # include <unistd.h> # endif # include <sys/types.h> # include <signal.h> # if defined(__Lynx__) # include <socket.h> # else # include <sys/socket.h> # endif # include <netinet/in.h> # include <netinet/tcp.h> # include <netdb.h> # include <arpa/inet.h> # include <stdlib.h> # include <unistd.h> # include <sys/ioctl.h> # include <stdio.h> # include <errno.h> typedef sw_int32 sw_sockdesc_t; typedef socklen_t sw_socklen_t; # define SW_E_WOULDBLOCK EWOULDBLOCK # define SW_INVALID_SOCKET -1 # define SW_SOCKET_ERROR -1 # define sw_close_socket(X) close(X) #endif /* -------------------------------------------------------- * * strerror() * * This function will print a string rep of a system error * code * * -------------------------------------------------------- */ sw_const_string sw_strerror(); /* * Obsolete types and macros. * * These are here for backwards compatibility, but will * be removed in the future */ #define sw_char sw_int8 #define sw_uchar sw_uint8 #define sw_octet sw_uint8 #define sw_short sw_int16 #define sw_ushort sw_uint16 #define sw_long sw_int32 #define sw_ulong sw_uint32 #define SW_TRY(EXPR) { sw_result result; if ((result = EXPR) != SW_OKAY) return result; } ((void) 0) #define SW_TRY_GOTO(EXPR) { if ((result = EXPR) != SW_OKAY) goto exit; } ((void) 0) #ifdef __cplusplus } #endif #endif