207 lines
7.0 KiB
C
207 lines
7.0 KiB
C
|
/****************************************************************************
|
||
|
*
|
||
|
* Open Watcom Project
|
||
|
*
|
||
|
* Portions Copyright (c) 1983-2002 Sybase, Inc. All Rights Reserved.
|
||
|
*
|
||
|
* ========================================================================
|
||
|
*
|
||
|
* This file contains Original Code and/or Modifications of Original
|
||
|
* Code as defined in and that are subject to the Sybase Open Watcom
|
||
|
* Public License version 1.0 (the 'License'). You may not use this file
|
||
|
* except in compliance with the License. BY USING THIS FILE YOU AGREE TO
|
||
|
* ALL TERMS AND CONDITIONS OF THE LICENSE. A copy of the License is
|
||
|
* provided with the Original Code and Modifications, and is also
|
||
|
* available at www.sybase.com/developer/opensource.
|
||
|
*
|
||
|
* The Original Code and all software distributed under the License are
|
||
|
* distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
|
||
|
* EXPRESS OR IMPLIED, AND SYBASE AND ALL CONTRIBUTORS HEREBY DISCLAIM
|
||
|
* ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF
|
||
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR
|
||
|
* NON-INFRINGEMENT. Please see the License for the specific language
|
||
|
* governing rights and limitations under the License.
|
||
|
*
|
||
|
* ========================================================================
|
||
|
*
|
||
|
* Description: Common type definitions and macros widely used by Open
|
||
|
* Watcom tools.
|
||
|
*
|
||
|
****************************************************************************/
|
||
|
|
||
|
|
||
|
#ifndef _WATCOM_H_INCLUDED_
|
||
|
#define _WATCOM_H_INCLUDED_
|
||
|
|
||
|
#include <errno.h>
|
||
|
#ifndef __WATCOMC__
|
||
|
#include "clibext.h"
|
||
|
#endif
|
||
|
|
||
|
#if !defined(__sun__) && !defined(sun) && !defined(__sgi) && !defined(__hppa) && !defined(_AIX) && !defined(__alpha) && !defined(_TYPES_H_) && !defined(_SYS_TYPES_H)
|
||
|
typedef unsigned uint;
|
||
|
#endif
|
||
|
|
||
|
typedef unsigned char uint_8;
|
||
|
typedef unsigned short uint_16;
|
||
|
#if defined (LONG_IS_64BITS)
|
||
|
typedef unsigned int uint_32;
|
||
|
#else
|
||
|
typedef unsigned long uint_32;
|
||
|
#endif
|
||
|
typedef unsigned char unsigned_8;
|
||
|
typedef unsigned short unsigned_16;
|
||
|
#if defined (LONG_IS_64BITS)
|
||
|
typedef unsigned int unsigned_32;
|
||
|
#else
|
||
|
typedef unsigned long unsigned_32;
|
||
|
#endif
|
||
|
|
||
|
typedef signed char int_8;
|
||
|
typedef signed short int_16;
|
||
|
#if defined (LONG_IS_64BITS)
|
||
|
typedef signed int int_32;
|
||
|
#else
|
||
|
typedef signed long int_32;
|
||
|
#endif
|
||
|
typedef signed char signed_8;
|
||
|
typedef signed short signed_16;
|
||
|
#if defined (LONG_IS_64BITS)
|
||
|
typedef signed int signed_32;
|
||
|
#else
|
||
|
typedef signed long signed_32;
|
||
|
#endif
|
||
|
|
||
|
typedef struct {
|
||
|
union {
|
||
|
unsigned_32 _32[2];
|
||
|
unsigned_16 _16[4];
|
||
|
unsigned_8 _8[8];
|
||
|
struct {
|
||
|
#if defined( __BIG_ENDIAN__ )
|
||
|
unsigned v : 1;
|
||
|
unsigned : 15;
|
||
|
unsigned : 16;
|
||
|
unsigned : 16;
|
||
|
unsigned : 16;
|
||
|
#else
|
||
|
unsigned : 16;
|
||
|
unsigned : 16;
|
||
|
unsigned : 16;
|
||
|
unsigned : 15;
|
||
|
unsigned v : 1;
|
||
|
#endif
|
||
|
} sign;
|
||
|
#if defined(__WATCOM_INT64__) || defined(__GNUC__)
|
||
|
unsigned long long _64[1];
|
||
|
#endif
|
||
|
} u;
|
||
|
} unsigned_64;
|
||
|
typedef unsigned_64 signed_64;
|
||
|
|
||
|
/* Macros for low/high end access on little and big endian machines */
|
||
|
|
||
|
#if defined( __BIG_ENDIAN__ )
|
||
|
#define I64LO32 1
|
||
|
#define I64HI32 0
|
||
|
#define I64LO16 3
|
||
|
#define I64HI16 0
|
||
|
#define I64LO8 7
|
||
|
#define I64HI8 0
|
||
|
#else
|
||
|
#define I64LO32 0
|
||
|
#define I64HI32 1
|
||
|
#define I64LO16 0
|
||
|
#define I64HI16 3
|
||
|
#define I64LO8 0
|
||
|
#define I64HI8 7
|
||
|
#endif
|
||
|
|
||
|
/* Define _crtn for prototypes for external C routines called from C++.
|
||
|
* Eg. extern _crtn void Foo();
|
||
|
*/
|
||
|
#if !defined( _crtn )
|
||
|
#if defined( __cplusplus )
|
||
|
#define _crtn "C"
|
||
|
#else
|
||
|
#define _crtn
|
||
|
#endif
|
||
|
#endif
|
||
|
|
||
|
/* Macros for little/big endian conversion; These exist to simplify writing
|
||
|
* code that handles both little and big endian data on either little or big
|
||
|
* endian host platforms. Some of these macros could be implemented as inline
|
||
|
* assembler where instructions to byte swap data in registers or read/write
|
||
|
* memory access with byte swapping is available.
|
||
|
*
|
||
|
* NOTE: The SWAP_XX macros will swap data in place. If you only want to take a
|
||
|
* a copy of the data and leave the original intact, then use the SWAPNC_XX
|
||
|
* macros.
|
||
|
*/
|
||
|
#define SWAPNC_16(w) (\
|
||
|
(((w) & 0x000000FFUL) << 8) |\
|
||
|
(((w) & 0x0000FF00UL) >> 8)\
|
||
|
)
|
||
|
#define SWAPNC_32(w) (\
|
||
|
(((w) & 0x000000FFUL) << 24) |\
|
||
|
(((w) & 0x0000FF00UL) << 8) |\
|
||
|
(((w) & 0x00FF0000UL) >> 8) |\
|
||
|
(((w) & 0xFF000000UL) >> 24)\
|
||
|
)
|
||
|
#define SWAPNC_64(w) (\
|
||
|
(((w) & 0x00000000000000FFULL) << 56) |\
|
||
|
(((w) & 0x000000000000FF00ULL) << 40) |\
|
||
|
(((w) & 0x0000000000FF0000ULL) << 24) |\
|
||
|
(((w) & 0x00000000FF000000ULL) << 8) |\
|
||
|
(((w) & 0x000000FF00000000ULL) >> 8) |\
|
||
|
(((w) & 0x0000FF0000000000ULL) >> 24) |\
|
||
|
(((w) & 0x00FF000000000000ULL) >> 40) |\
|
||
|
(((w) & 0xFF00000000000000ULL) >> 56)\
|
||
|
)
|
||
|
|
||
|
#if defined( __BIG_ENDIAN__ )
|
||
|
/* Macros to get little endian data */
|
||
|
#define GET_LE_16(w) SWAPNC_16(w)
|
||
|
#define GET_LE_32(w) SWAPNC_32(w)
|
||
|
#define GET_LE_64(w) SWAPNC_64(w)
|
||
|
/* Macros to get big endian data */
|
||
|
#define GET_BE_16(w) (w)
|
||
|
#define GET_BE_32(w) (w)
|
||
|
#define GET_BE_64(w) (w)
|
||
|
/* Macros to convert little endian data in place */
|
||
|
#define CONV_LE_16(w) (w) = SWAPNC_16(w)
|
||
|
#define CONV_LE_32(w) (w) = SWAPNC_32(w)
|
||
|
#define CONV_LE_64(w) (w) = SWAPNC_64(w)
|
||
|
/* Macros to convert big endian data in place */
|
||
|
#define CONV_BE_16(w)
|
||
|
#define CONV_BE_32(w)
|
||
|
#define CONV_BE_64(w)
|
||
|
/* Macros to swap byte order */
|
||
|
#define SWAP_16 CONV_LE_16
|
||
|
#define SWAP_32 CONV_LE_32
|
||
|
#define SWAP_64 CONV_LE_64
|
||
|
#else
|
||
|
/* Macros to get little endian data */
|
||
|
#define GET_LE_16(w) (w)
|
||
|
#define GET_LE_32(w) (w)
|
||
|
#define GET_LE_64(w) (w)
|
||
|
/* Macros to get big endian data */
|
||
|
#define GET_BE_16(w) SWAPNC_16(w)
|
||
|
#define GET_BE_32(w) SWAPNC_32(w)
|
||
|
#define GET_BE_64(w) SWAPNC_64(w)
|
||
|
/* Macros to convert little endian data in place */
|
||
|
#define CONV_LE_16(w)
|
||
|
#define CONV_LE_32(w)
|
||
|
#define CONV_LE_64(w)
|
||
|
/* Macros to convert big endian data in place */
|
||
|
#define CONV_BE_16(w) (w) = SWAPNC_16(w)
|
||
|
#define CONV_BE_32(w) (w) = SWAPNC_32(w)
|
||
|
#define CONV_BE_64(w) (w) = SWAPNC_64(w)
|
||
|
/* Macros to swap byte order */
|
||
|
#define SWAP_16 CONV_BE_16
|
||
|
#define SWAP_32 CONV_BE_32
|
||
|
#define SWAP_64 CONV_BE_64
|
||
|
#endif
|
||
|
|
||
|
#endif
|