From 5357b1f8784f3529fa4e76e9804b9c6492c9d293 Mon Sep 17 00:00:00 2001 From: Jean Delvare Date: Thu, 22 Apr 2004 19:08:09 +0000 Subject: Refactor WORD-like macros into types.h. --- types.h | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) (limited to 'types.h') diff --git a/types.h b/types.h index 1359c45..86e2a9a 100644 --- a/types.h +++ b/types.h @@ -1,7 +1,62 @@ #ifndef TYPES_H #define TYPES_H + typedef unsigned char u8; typedef unsigned short u16; typedef signed short i16; typedef unsigned int u32; + +/* + * These macros help us solve problems on systems that don't support + * non-aligned memory access. This isn't a big issue IMHO, since the tools + * in this package are intended mainly for Intel and compatible systems, + * which are little-endian and support non-aligned memory access. Anyway, + * you may use the following defines to control the way it works: + * - Define BIGENDIAN on big-endian systems. + * - Define ALIGNMENT_WORKAROUND if your system doesn't support + * non-aligned memory access. In this case, we use a slower, but safer, + * memory access method. + * You most probably will have to define none or the two of them. + */ + +#ifdef BIGENDIAN +typedef struct { + u32 h; + u32 l; +} u64; +#else +typedef struct { + u32 l; + u32 h; +} u64; +#endif + +#ifdef ALIGNMENT_WORKAROUND +static u64 U64(u32 low, u32 high) +{ + u64 self; + + self.l=low; + self.h=high; + + return self; +} +#endif + +#ifdef ALIGNMENT_WORKAROUND +# ifdef BIGENDIAN +# define WORD(x) (u16)((x)[1]+((x)[0]<<8)) +# define DWORD(x) (u32)((x)[3]+((x)[2]<<8)+((x)[1]<<16)+((x)[0]<<24)) +# define QWORD(x) (U64(DWORD(x+4), DWORD(x))) +# else /* BIGENDIAN */ +# define WORD(x) (u16)((x)[0]+((x)[1]<<8)) +# define DWORD(x) (u32)((x)[0]+((x)[1]<<8)+((x)[2]<<16)+((x)[3]<<24)) +# define QWORD(x) (U64(DWORD(x), DWORD(x+4))) +# endif /* BIGENDIAN */ +#else /* ALIGNMENT_WORKAROUND */ +#define WORD(x) (u16)(*(const u16 *)(x)) +#define DWORD(x) (u32)(*(const u32 *)(x)) +#define QWORD(x) (*(const u64 *)(x)) +#endif /* ALIGNMENT_WORKAROUND */ + #endif -- cgit v1.2.1