summaryrefslogtreecommitdiffstats
path: root/lib/unaligned.h
diff options
context:
space:
mode:
authorMartin Mares <mj@ucw.cz>1998-05-26 23:38:06 +0200
committerMartin Mares <mj@ucw.cz>1998-05-26 23:38:06 +0200
commitb1487ee909ebd4cfc59f30d3678cb6667d4a72c8 (patch)
tree97a72045ece1b0141d1f0d7c25c5df2ccad49626 /lib/unaligned.h
parented68a5c6a4da7050995934adb07612dea1cf6644 (diff)
downloadbird-b1487ee909ebd4cfc59f30d3678cb6667d4a72c8.tar
bird-b1487ee909ebd4cfc59f30d3678cb6667d4a72c8.zip
Added generic functions for unaligned data access.
Diffstat (limited to 'lib/unaligned.h')
-rw-r--r--lib/unaligned.h32
1 files changed, 31 insertions, 1 deletions
diff --git a/lib/unaligned.h b/lib/unaligned.h
index 29fcee9..53e32e5 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