| #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 |