#ifndef PLATFORM_H
#define PLATFORM_H
typedef
unsigned
char
BYTE
;
typedef
U32
DWORD
;
#define ROL(x,n) (((x) << ((n) & 0x1F)) | ((x) >> (32-((n) & 0x1F))))
#define ROR(x,n) (((x) >> ((n) & 0x1F)) | ((x) << (32-((n) & 0x1F))))
#if (0) && defined(__BORLANDC__) && (__BORLANDC__ >= 0x462)
#error "!!!This does not work for some reason!!!"
#include <stdlib.h> /* get prototype for _lrotl() , _lrotr() */
#pragma inline __lrotl__
#pragma inline __lrotr__
#undef ROL /* get rid of inefficient definitions */
#undef ROR
#define ROL(x,n) __lrotl__(x,n) /* use compiler intrinsic rotations */
#define ROR(x,n) __lrotr__(x,n)
#endif
#ifdef _MSC_VER
#include <stdlib.h> /* get prototypes for rotation functions */
#undef ROL
#undef ROR
#pragma intrinsic(_lrotl,_lrotr) /* use intrinsic compiler rotations */
#define ROL(x,n) _lrotl(x,n)
#define ROR(x,n) _lrotr(x,n)
#endif
#ifndef _M_IX86
#ifdef __BORLANDC__
#define _M_IX86 300 /* make sure this is defined for Intel CPUs */
#endif
#endif
#if defined(_M_IX86) || defined(__i386)
#define ALIGN32 0 /* need dword alignment? (no for Pentium) */
#else /* non-Intel platforms */
#define ALIGN32 1 /* (assume need alignment for non-Intel) */
#endif
#if BYTEORDER == 0x1234 || BYTEORDER == 0x12345678 || defined(__LITTLE_ENDIAN__)
#define LittleEndian 1
#define Bswap(x) (x) /* NOP for little-endian machines */
#define ADDR_XOR 0 /* NOP for little-endian machines */
#else
#define Bswap(x) ((ROR(x,8) & 0xFF00FF00) | (ROL(x,8) & 0x00FF00FF))
#define ADDR_XOR 3 /* convert byte address in dword */
#endif
#define _b(x,N) (((BYTE *)&x)[((N) & 3) ^ ADDR_XOR]) /* pick bytes out of a dword */
#define b0(x) _b(x,0) /* extract LSB of DWORD */
#define b1(x) _b(x,1)
#define b2(x) _b(x,2)
#define b3(x) _b(x,3) /* extract MSB of DWORD */
#endif