diff options
author | Martin Mares <mj@ucw.cz> | 1998-05-26 21:38:06 +0000 |
---|---|---|
committer | Martin Mares <mj@ucw.cz> | 1998-05-26 21:38:06 +0000 |
commit | b1487ee909ebd4cfc59f30d3678cb6667d4a72c8 (patch) | |
tree | 97a72045ece1b0141d1f0d7c25c5df2ccad49626 /lib | |
parent | ed68a5c6a4da7050995934adb07612dea1cf6644 (diff) |
Added generic functions for unaligned data access.
Diffstat (limited to 'lib')
-rw-r--r-- | lib/unaligned.h | 32 |
1 files changed, 31 insertions, 1 deletions
diff --git a/lib/unaligned.h b/lib/unaligned.h index 29fcee99..53e32e5d 100644 --- a/lib/unaligned.h +++ b/lib/unaligned.h @@ -1,5 +1,5 @@ /* - * Unaligned Data Accesses + * Unaligned Data Accesses -- Generic Version * * (c) 1998 Martin Mares <mj@ucw.cz> * @@ -9,4 +9,34 @@ #ifndef _BIRD_UNALIGNED_H_ #define _BIRD_UNALIGNED_H_ +#if CPU_NEEDS_ALIGN_WORD != 1 || CPU_NEEDS_ALIGN_LONG != 1 +#include <string.h> +#endif + +#if CPU_NEEDS_ALIGN_WORD == 1 +#define unaligned_u16(p) (*((u16 *)(p))) +#else +static inline u16 +unaligned_u16(void *p) +{ + u16 x; + + memcpy(&x, p, sizeof(x)); + return x; +} +#endif + +#if CPU_NEEDS_ALIGN_LONG == 1 +#define unaligned_u32(p) (*((u32 *)(p))) +#else +static inline u32 +unaligned_u32(void *p) +{ + u32 x; + + memcpy(&x, p, sizeof(x)); + return x; +} +#endif + #endif |