1#ifndef _sw_platform_h 2#define _sw_platform_h 3 4/* 5 * Copyright 2003, 2004 Porchdog Software, Inc. All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without modification, 8 * are permitted provided that the following conditions are met: 9 * 10 * 1. Redistributions of source code must retain the above copyright notice, 11 * this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright notice, 13 * this list of conditions and the following disclaimer in the documentation 14 * and/or other materials provided with the distribution. 15 * 16 * THIS SOFTWARE IS PROVIDED BY PORCHDOG SOFTWARE ``AS IS'' AND ANY 17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 19 * IN NO EVENT SHALL THE HOWL PROJECT OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 20 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 21 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 22 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 23 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 24 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 25 * OF THE POSSIBILITY OF SUCH DAMAGE. 26 * 27 * The views and conclusions contained in the software and documentation are those 28 * of the authors and should not be interpreted as representing official policies, 29 * either expressed or implied, of Porchdog Software, Inc. 30 */ 31 32 33#ifdef __cplusplus 34extern "C" 35{ 36#endif 37 38 39#if defined(__VXWORKS__) 40 41# define HOWL_API 42# include <vxworks.h> 43# include <sysLib.h> 44 45# define sw_snooze(SECS) taskDelay(sysClkRateGet() * SECS) 46 47#elif defined(WIN32) 48 49# define WIN32_LEAN_AND_MEAN 50# define HOWL_API __stdcall 51# pragma warning(disable:4127) 52# include <windows.h> 53# include <stdlib.h> 54 55typedef signed char int8_t; 56typedef unsigned char u_int8_t; 57typedef signed short int16_t; 58typedef unsigned short u_int16_t; 59typedef signed long int32_t; 60typedef unsigned long u_int32_t; 61typedef _int64 int64_t; 62typedef _int64 u_int64_t; 63 64# define sw_snooze(SECS) Sleep(SECS * 1000) 65 66#else 67 68# define HOWL_API 69# if defined(HOWL_KERNEL) 70# include <howl_config.h> 71# endif 72# include <sys/types.h> 73# include <stdlib.h> 74# include <unistd.h> 75 76# define sw_snooze(SECS) sleep(SECS) 77 78#endif 79 80#if defined(__sun) 81 82# define u_int8_t uint8_t 83# define u_int16_t uint16_t 84# define u_int32_t uint32_t 85# define u_int64_t uint64_t 86 87#endif 88 89typedef void * sw_opaque; 90typedef void * sw_opaque_t; 91typedef int8_t sw_int8; 92typedef u_int8_t sw_uint8; 93typedef u_int8_t sw_bool; 94typedef int16_t sw_int16; 95typedef u_int16_t sw_uint16; 96typedef int32_t sw_int32; 97typedef u_int32_t sw_uint32; 98typedef int64_t sw_int64; 99typedef u_int64_t sw_uint64; 100typedef char * sw_string; 101typedef sw_uint8 * sw_octets; 102#if !defined(__VXWORKS__) || defined(__cplusplus) 103typedef const char * sw_const_string; 104typedef const u_int8_t * sw_const_octets; 105#else 106typedef char * sw_const_string; 107typedef u_int8_t * sw_const_octets; 108#endif 109typedef size_t sw_size_t; 110typedef int sw_result; 111 112 113 114/* -------------------------------------------------------- 115 * 116 * Endian-osity 117 * 118 * SW_ENDIAN is 0 for big endian platforms, 1 119 * for little endian platforms. 120 * 121 * The macro WORDS_BIGENDIAN will be defined 122 * by autoconf. If you are using Howl on 123 * a platform that doesn't have autoconf, define 124 * SW_ENDIAN directly 125 * -------------------------------------------------------- 126 */ 127 128#if !defined(SW_ENDIAN) 129 130# if defined(WORDS_BIGENDIAN) && WORDS_BIGENDIAN == 1 131 132# define SW_ENDIAN 0 133 134# else 135 136# define SW_ENDIAN 1 137 138# endif 139 140#endif 141 142 143/* -------------------------------------------------------- 144 * 145 * Strings 146 * 147 * These macros supports cross platform string functions 148 * for the following OSes 149 * 150 * Win32 151 * *NIX 152 * PalmOS 153 * VxWorks 154 * 155 * -------------------------------------------------------- 156 */ 157 158#if defined(WIN32) 159 160# include <string.h> 161 162# define sw_memset(ARG1, ARG2, ARG3) memset((char*) ARG1, ARG2, ARG3) 163# define sw_memcpy(ARG1, ARG2, ARG3) memmove((char*) ARG1, (char*) ARG2, ARG3) 164# define sw_memcmp(ARG1, ARG2, ARG3) memcmp((char*) ARG1, ARG2, ARG3) 165# define sw_strcasecmp(ARG1, ARG2) stricmp(ARG1, ARG2) 166# define sw_strncasecmp(ARG1, ARG2) strnicmp(ARG1, ARG2) 167# define sw_strcat(ARG1, ARG2) strcat(ARG1, ARG2) 168# define sw_strncat(ARG1, ARG2) strncat(ARG1, ARG2) 169# define sw_strchr(ARG1, ARG2) strchr(ARG1, ARG2) 170# define sw_strcmp(ARG1, ARG2) strcmp(ARG1, ARG2) 171# define sw_strncmp(ARG1, ARG2) strncmp(ARG1, ARG2) 172# define sw_strcoll(ARG1, ARG2) strcoll(ARG1, ARG2) 173# define sw_strcpy(ARG1, ARG2) (ARG2) ? strcpy(ARG1, ARG2) : strcpy(ARG1, "") 174# define sw_strncpy(ARG1, ARG2, N) (ARG2) ? strncpy(ARG1, ARG2, N) : strcpy(ARG1, "") 175# define sw_strcspn(ARG1, ARG2) strcspn(ARG1, ARG2) 176# define sw_strlen(ARG1) strlen(ARG1) 177# define sw_strstr(ARG1, ARG2) strstr(ARG1, ARG2) 178# define sw_strtok_r(ARG1, ARG2, ARG3) strtok_r(ARG1, ARG2, ARG3) 179 180#elif defined(__VXWORKS__) 181 182# include <string.h> 183 184extern sw_int32 185sw_strcasecmp( 186 sw_const_string arg1, 187 sw_const_string arg2); 188 189extern sw_int32 190sw_strncasecmp( 191 sw_const_string arg1, 192 sw_const_string arg2, 193 sw_len n); 194 195extern sw_string 196sw_strtok_r( 197 sw_string arg1, 198 sw_const_string arg2, 199 sw_string * lasts); 200 201# define sw_memset(ARG1, ARG2, ARG3) memset((char*) ARG1, ARG2, ARG3) 202# define sw_memcpy(ARG1, ARG2, ARG3) memcpy((char*) ARG1, (char*) ARG2, ARG3) 203# define sw_memcmp(ARG1, ARG2, ARG3) memcmp((char*) ARG1, ARG2, ARG3) 204# define sw_strcat(ARG1, ARG2) strcat(ARG1, ARG2) 205# define sw_strncat(ARG1, ARG2) strncat(ARG1, ARG2) 206# define sw_strchr(ARG1, ARG2) strchr(ARG1, ARG2) 207# define sw_strcmp(ARG1, ARG2) strcmp(ARG1, ARG2) 208# define sw_strncmp(ARG1, ARG2) strncmp(ARG1, ARG2) 209# define sw_strcoll(ARG1, ARG2) strcoll(ARG1, ARG2) 210# define sw_strcpy(ARG1, ARG2) ARG2 ? strcpy(ARG1, ARG2) : strcpy(ARG1, "") 211# define sw_strncpy(ARG1, ARG2, N) ARG2 ? strncpy(ARG1, ARG2, N) : strcpy(ARG1, "") 212# define sw_strcspn(ARG1, ARG2) strcspn(ARG1, ARG2) 213# define sw_strlen(ARG1) strlen(ARG1) 214# define sw_strstr(ARG1, ARG2) strstr(ARG1, ARG2) 215 216#elif defined(__PALMOS__) 217 218# include <StringMgr.h> 219 220# define sw_strcasecmp(ARG1, ARG2) strcasecmp(ARG1, ARG2) 221# define sw_strncasecmp(ARG1, ARG2) strncasecmp(ARG1, ARG2) 222# define sw_strcat(ARG1, ARG2) StrCat(ARG1, ARG2) 223# define sw_strncat(ARG1, ARG2) StrNCat(ARG1, ARG2) 224# define sw_strchr(ARG1, ARG2) StrChr(ARG1, ARG2) 225# define sw_strcmp(ARG1, ARG2) StrCampare(ARG1, ARG2) 226# define sw_strncmp(ARG1, ARG2) StrNCompare(ARG1, ARG2) 227# define sw_strcoll(ARG1, ARG2) strcoll(ARG1, ARG2) 228# define sw_strcpy(ARG1, ARG2) ARG2 ? StrCopy(ARG1, ARG2) : StrCopy(ARG1, "") 229# define sw_strncpy(ARG1, ARG2, N) ARG2 ? StrNCopy(ARG1, ARG2, N) : StrCopy(ARG1, "") 230# define sw_strcspn(ARG1, ARG2) strcspn(ARG1, ARG2) 231# define sw_strlen(ARG1) StrLen(ARG1) 232# define sw_strstr(ARG1, ARG2) strstr(ARG1, ARG2) 233# define sw_strtok_r(ARG1, ARG2, ARG3) strtok_r(ARG1, ARG2, ARG3) 234 235#else 236 237# include <string.h> 238 239# if defined(__Lynx__) 240 char * strchr(char*, int); 241# endif 242 243# define sw_memset(ARG1, ARG2, ARG3) memset((char*) ARG1, ARG2, ARG3) 244# define sw_memcpy(ARG1, ARG2, ARG3) memcpy((char*) ARG1, (char*) ARG2, ARG3) 245# define sw_memcmp(ARG1, ARG2, ARG3) memcmp((char*) ARG1, ARG2, ARG3) 246# define sw_strcasecmp(ARG1, ARG2) strcasecmp(ARG1, ARG2) 247# define sw_strncasecmp(ARG1, ARG2) strncasecmp(ARG1, ARG2) 248# define sw_strcat(ARG1, ARG2) strcat(ARG1, ARG2) 249# define sw_strncat(ARG1, ARG2) strncat(ARG1, ARG2) 250# define sw_strchr(ARG1, ARG2) strchr(ARG1, ARG2) 251# define sw_strcmp(ARG1, ARG2) strcmp(ARG1, ARG2) 252# define sw_strncmp(ARG1, ARG2) strncmp(ARG1, ARG2) 253# define sw_strcoll(ARG1, ARG2) strcoll(ARG1, ARG2) 254# define sw_strcpy(ARG1, ARG2) ARG2 ? strcpy(ARG1, ARG2) : strcpy(ARG1, "") 255# define sw_strncpy(ARG1, ARG2, N) ARG2 ? strncpy(ARG1, ARG2, N) : strcpy(ARG1, "") 256# define sw_strcspn(ARG1, ARG2) strcspn(ARG1, ARG2) 257# define sw_strlen(ARG1) strlen(ARG1) 258# define sw_strstr(ARG1, ARG2) strstr(ARG1, ARG2) 259# define sw_strtok_r(ARG1, ARG2, ARG3) strtok_r(ARG1, ARG2, ARG3) 260 261#endif 262 263 264sw_string 265sw_strdup( 266 sw_const_string str); 267 268 269/* -------------------------------------------------------- 270 * 271 * Memory 272 * 273 * These macros support cross platform heap functions. 274 * When compiling with DEBUG, some extra checking is 275 * done which can aid in tracking down heap corruption 276 * problems 277 * 278 * -------------------------------------------------------- 279 */ 280 281#if defined(NDEBUG) 282 283# define sw_malloc(SIZE) malloc(SIZE) 284# define sw_realloc(MEM,SIZE) realloc(MEM, SIZE) 285# define sw_free(MEM) if (MEM) free(MEM) 286 287#else 288 289# define sw_malloc(SIZE) _sw_debug_malloc(SIZE, __SW_FUNCTION__, __FILE__, __LINE__) 290# define sw_realloc(MEM,SIZE) _sw_debug_realloc(MEM, SIZE, __SW_FUNCTION__, __FILE__, __LINE__) 291# define sw_free(MEM) if (MEM) _sw_debug_free(MEM, __SW_FUNCTION__, __FILE__, __LINE__) 292 293#endif 294 295 296sw_opaque HOWL_API 297_sw_debug_malloc( 298 sw_size_t size, 299 sw_const_string function, 300 sw_const_string file, 301 sw_uint32 line); 302 303 304sw_opaque HOWL_API 305_sw_debug_realloc( 306 sw_opaque_t mem, 307 sw_size_t size, 308 sw_const_string function, 309 sw_const_string file, 310 sw_uint32 line); 311 312 313void HOWL_API 314_sw_debug_free( 315 sw_opaque_t mem, 316 sw_const_string function, 317 sw_const_string file, 318 sw_uint32 line); 319 320 321 322/* -------------------------------------------------------- 323 * 324 * Sockets 325 * 326 * These macros and APIs support cross platform socket 327 * calls. I am relying on BSD APIs, but even with those 328 * there are subtle and not so subtle platform differences 329 * 330 * -------------------------------------------------------- 331 */ 332 333#if defined(__VXWORKS__) 334 335# include <vxworks.h> 336# include <hostLib.h> 337# include <sockLib.h> 338# include <ioLib.h> 339# include <inetLib.h> 340 341typedef int sw_sockdesc_t; 342typedef socklen_t sw_socklen_t; 343 344#elif defined(WIN32) 345 346# include <winsock2.h> 347 348typedef SOCKET sw_sockdesc_t; 349typedef int sw_socklen_t; 350 351# define SW_E_WOULDBLOCK WSAEWOULDBLOCK 352# define SW_INVALID_SOCKET INVALID_SOCKET 353# define SW_SOCKET_ERROR SOCKET_ERROR 354 355# define sw_close_socket(X) closesocket(X) 356 357#else 358 359# if defined(sun) 360 361# include <unistd.h> 362 363# endif 364 365# include <sys/types.h> 366# include <signal.h> 367 368# if defined(__Lynx__) 369 370# include <socket.h> 371 372# else 373 374# include <sys/socket.h> 375 376# endif 377 378# include <netinet/in.h> 379# include <netinet/tcp.h> 380# include <netdb.h> 381# include <arpa/inet.h> 382# include <stdlib.h> 383# include <unistd.h> 384# include <sys/ioctl.h> 385# include <stdio.h> 386# include <errno.h> 387 388typedef sw_int32 sw_sockdesc_t; 389typedef socklen_t sw_socklen_t; 390 391# define SW_E_WOULDBLOCK EWOULDBLOCK 392# define SW_INVALID_SOCKET -1 393# define SW_SOCKET_ERROR -1 394 395# define sw_close_socket(X) close(X) 396 397#endif 398 399 400/* -------------------------------------------------------- 401 * 402 * strerror() 403 * 404 * This function will print a string rep of a system error 405 * code 406 * 407 * -------------------------------------------------------- 408 */ 409 410sw_const_string 411sw_strerror(); 412 413 414/* 415 * Obsolete types and macros. 416 * 417 * These are here for backwards compatibility, but will 418 * be removed in the future 419 */ 420#define sw_char sw_int8 421#define sw_uchar sw_uint8 422#define sw_octet sw_uint8 423#define sw_short sw_int16 424#define sw_ushort sw_uint16 425#define sw_long sw_int32 426#define sw_ulong sw_uint32 427 428 429#define SW_TRY(EXPR) { sw_result result; if ((result = EXPR) != SW_OKAY) return result; } ((void) 0) 430#define SW_TRY_GOTO(EXPR) { if ((result = EXPR) != SW_OKAY) goto exit; } ((void) 0) 431 432 433#ifdef __cplusplus 434} 435#endif 436 437 438#endif 439