Home | History | Annotate | Download | only in salt
      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
     34 extern "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 
     55 typedef signed char				int8_t;
     56 typedef unsigned char			u_int8_t;
     57 typedef signed short				int16_t;
     58 typedef unsigned short			u_int16_t;
     59 typedef signed long				int32_t;
     60 typedef unsigned long			u_int32_t;
     61 typedef _int64						int64_t;
     62 typedef _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 
     89 typedef void				*	sw_opaque;
     90 typedef void				*	sw_opaque_t;
     91 typedef int8_t					sw_int8;
     92 typedef u_int8_t				sw_uint8;
     93 typedef u_int8_t				sw_bool;
     94 typedef int16_t				sw_int16;
     95 typedef u_int16_t				sw_uint16;
     96 typedef int32_t				sw_int32;
     97 typedef u_int32_t				sw_uint32;
     98 typedef int64_t				sw_int64;
     99 typedef u_int64_t				sw_uint64;
    100 typedef char				*	sw_string;
    101 typedef sw_uint8			*	sw_octets;
    102 #if !defined(__VXWORKS__) || defined(__cplusplus)
    103 typedef const char		*	sw_const_string;
    104 typedef const u_int8_t	*	sw_const_octets;
    105 #else
    106 typedef char				*	sw_const_string;
    107 typedef u_int8_t			*	sw_const_octets;
    108 #endif
    109 typedef size_t					sw_size_t;
    110 typedef 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 
    184 extern sw_int32
    185 sw_strcasecmp(
    186 		sw_const_string	arg1,
    187 		sw_const_string	arg2);
    188 
    189 extern sw_int32
    190 sw_strncasecmp(
    191 		sw_const_string	arg1,
    192 		sw_const_string	arg2,
    193 		sw_len				n);
    194 
    195 extern sw_string
    196 sw_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 
    264 sw_string
    265 sw_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 
    296 sw_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 
    304 sw_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 
    313 void 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 
    341 typedef int							sw_sockdesc_t;
    342 typedef socklen_t					sw_socklen_t;
    343 
    344 #elif defined(WIN32)
    345 
    346 #	include <winsock2.h>
    347 
    348 typedef SOCKET						sw_sockdesc_t;
    349 typedef 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 
    388 typedef sw_int32					sw_sockdesc_t;
    389 typedef 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 
    410 sw_const_string
    411 sw_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