Logo Search packages:      
Sourcecode: avahi version File versions  Download package

platform.h

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

Generated by  Doxygen 1.6.0   Back to index