rlm@1: #ifndef VBA_PORT_H rlm@1: #define VBA_PORT_H rlm@1: rlm@1: #if _MSC_VER > 1000 rlm@1: #pragma once rlm@1: #endif // _MSC_VER > 1000 rlm@1: rlm@1: #include rlm@1: rlm@1: #ifndef NULL rlm@1: #define NULL 0 rlm@1: #endif rlm@1: rlm@1: typedef unsigned char bool8; rlm@1: rlm@1: #ifdef HAVE_STDINT_H rlm@1: #include rlm@1: rlm@1: typedef int8_t int8; rlm@1: typedef uint8_t uint8; rlm@1: typedef int16_t int16; rlm@1: typedef uint16_t uint16; rlm@1: typedef int32_t int32; rlm@1: typedef uint32_t uint32; rlm@1: typedef int64_t int64; rlm@1: typedef uint64_t uint64; rlm@1: typedef intptr_t pint; rlm@1: rlm@1: #else /* Don't have stdint.h */ rlm@1: rlm@1: #ifdef PTR_NOT_INT rlm@1: typedef long pint; rlm@1: #else /* pointer is int */ rlm@1: typedef int pint; rlm@1: #endif /* PTR_NOT_INT */ rlm@1: rlm@1: /* FIXME: Refactor this by moving out the BORLAND part and unifying typedefs */ rlm@1: #ifndef WIN32 rlm@1: typedef unsigned char uint8; rlm@1: typedef unsigned short uint16; rlm@1: typedef signed char int8; rlm@1: typedef short int16; rlm@1: typedef int int32; rlm@1: typedef unsigned int uint32; rlm@1: # ifdef __GNUC__ /* long long is not part of ISO C++ */ rlm@1: __extension__ typedef long long int64; rlm@1: __extension__ typedef unsigned long long uint64; rlm@1: # else rlm@1: typedef long long int64; rlm@1: typedef unsigned long long uint64; rlm@1: # endif rlm@1: #else /* WIN32 */ rlm@1: rlm@1: # ifdef __BORLANDC__ rlm@1: # include rlm@1: # else rlm@1: rlm@1: typedef unsigned char uint8; rlm@1: typedef unsigned short uint16; rlm@1: typedef signed char int8; rlm@1: typedef short int16; rlm@1: rlm@1: # ifndef WSAAPI rlm@1: /* winsock2.h typedefs int32 as well. */ rlm@1: typedef long int32; rlm@1: # endif rlm@1: rlm@1: typedef unsigned int uint32; rlm@1: rlm@1: # endif /* __BORLANDC__ */ rlm@1: rlm@1: typedef __int64 int64; rlm@1: typedef unsigned __int64 uint64; rlm@1: rlm@1: #endif /* WIN32 */ rlm@1: #endif /* HAVE_STDINT_H */ rlm@1: rlm@1: #ifndef WIN32 rlm@1: rlm@1: #ifndef PATH_MAX rlm@1: #define PATH_MAX 1024 rlm@1: #endif rlm@1: rlm@1: #define _MAX_DIR PATH_MAX rlm@1: #define _MAX_DRIVE 1 rlm@1: #define _MAX_FNAME PATH_MAX rlm@1: #define _MAX_EXT PATH_MAX rlm@1: #define _MAX_PATH PATH_MAX rlm@1: rlm@1: #define ZeroMemory(a, b) memset((a), 0, (b)) rlm@1: rlm@1: void _makepath(char *path, const char *drive, const char *dir, rlm@1: const char *fname, const char *ext); rlm@1: void _splitpath(const char *path, char *drive, char *dir, char *fname, rlm@1: char *ext); rlm@1: #else /* WIN32 */ rlm@1: #define strcasecmp stricmp rlm@1: #define strncasecmp strnicmp rlm@1: #endif rlm@1: rlm@1: typedef uint8 u8; rlm@1: typedef uint16 u16; rlm@1: typedef uint32 u32; rlm@1: typedef uint64 u64; rlm@1: typedef int8 s8; rlm@1: typedef int16 s16; rlm@1: typedef int32 s32; rlm@1: typedef int64 s64; rlm@1: rlm@1: // for consistency rlm@1: static inline u8 swap8(u8 v) rlm@1: { rlm@1: return v; rlm@1: } rlm@1: rlm@1: // swaps a 16-bit value rlm@1: static inline u16 swap16(u16 v) rlm@1: { rlm@1: return (v<<8)|(v>>8); rlm@1: } rlm@1: rlm@1: // swaps a 32-bit value rlm@1: static inline u32 swap32(u32 v) rlm@1: { rlm@1: return (v<<24)|((v<<8)&0xff0000)|((v>>8)&0xff00)|(v>>24); rlm@1: } rlm@1: rlm@1: #define READ8LE(x) \ rlm@1: *((u8 *)x) rlm@1: rlm@1: #define WRITE8LE(x, v) \ rlm@1: *((u8 *)x) = (v) rlm@1: rlm@1: #ifdef WORDS_BIGENDIAN rlm@1: #if defined(__GNUC__) && defined(__ppc__) rlm@1: rlm@1: #define READ16LE(base) \ rlm@1: ({ unsigned short lhbrxResult; \ rlm@1: __asm__("lhbrx %0, 0, %1" : "=r" (lhbrxResult) : "r" (base) : "memory"); \ rlm@1: lhbrxResult; }) rlm@1: rlm@1: #define READ32LE(base) \ rlm@1: ({ unsigned long lwbrxResult; \ rlm@1: __asm__("lwbrx %0, 0, %1" : "=r" (lwbrxResult) : "r" (base) : "memory"); \ rlm@1: lwbrxResult; }) rlm@1: rlm@1: #define WRITE16LE(base, value) \ rlm@1: __asm__("sthbrx %0, 0, %1" : : "r" (value), "r" (base) : "memory") rlm@1: rlm@1: #define WRITE32LE(base, value) \ rlm@1: __asm__("stwbrx %0, 0, %1" : : "r" (value), "r" (base) : "memory") rlm@1: rlm@1: #else rlm@1: #define READ16LE(x) \ rlm@1: swap16(*((u16 *)(x))) rlm@1: #define READ32LE(x) \ rlm@1: swap32(*((u32 *)(x))) rlm@1: #define WRITE16LE(x, v) \ rlm@1: *((u16 *)x) = swap16((v)) rlm@1: #define WRITE32LE(x, v) \ rlm@1: *((u32 *)x) = swap32((v)) rlm@1: #endif rlm@1: #else rlm@1: #define READ16LE(x) \ rlm@1: *((u16 *)x) rlm@1: #define READ32LE(x) \ rlm@1: *((u32 *)x) rlm@1: #define WRITE16LE(x, v) \ rlm@1: *((u16 *)x) = (v) rlm@1: #define WRITE32LE(x, v) \ rlm@1: *((u32 *)x) = (v) rlm@1: #endif rlm@1: rlm@1: #ifndef CTASSERT rlm@1: #define CTASSERT(x) typedef char __assert ## y[(x) ? 1 : -1]; rlm@1: #endif rlm@1: rlm@1: #endif // VBA_PORT_H