#ifndef TYPES_H #define TYPES_H #include "config.h" typedef unsigned char u8; typedef unsigned short u16; typedef signed short i16; typedef unsigned int u32; /* * You may use the following defines to adjust the type definitions * depending on the architecture: * - Define BIGENDIAN on big-endian systems. Untested, as all target * systems to date are little-endian. * - 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. This should be done automatically in config.h * for architectures which need it. */ #ifdef BIGENDIAN typedef struct { u32 h; u32 l; } u64; #else typedef struct { u32 l; u32 h; } u64; #endif #ifdef ALIGNMENT_WORKAROUND static inline 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