libkmod-hash: use generic function for unaligned access
diff --git a/libkmod/libkmod-hash.c b/libkmod/libkmod-hash.c
index 3a6c8bf..1d02da5 100644
--- a/libkmod/libkmod-hash.c
+++ b/libkmod/libkmod-hash.c
@@ -21,6 +21,7 @@
#include "libkmod.h"
#include "libkmod-hash.h"
+#include "libkmod-util.h"
#include <stdlib.h>
#include <string.h>
#include <errno.h>
@@ -83,15 +84,6 @@
free(hash);
}
-struct unaligned_short {
- unsigned short v;
-} __attribute__((packed));
-
-static inline unsigned short get16bits(const char *ptr)
-{
- return ((struct unaligned_short *)ptr)->v;
-}
-
static inline unsigned int hash_superfast(const char *key, unsigned int len)
{
/* Paul Hsieh (http://www.azillionmonkeys.com/qed/hash.html)
@@ -104,8 +96,8 @@
/* Main loop */
for (; len > 0; len--) {
- hash += get16bits(key);
- tmp = (get16bits(key + 2) << 11) ^ hash;
+ hash += get_unaligned((uint16_t *) key);
+ tmp = (get_unaligned((uint16_t *)(key + 2)) << 11) ^ hash;
hash = (hash << 16) ^ tmp;
key += 4;
hash += hash >> 11;
@@ -114,14 +106,14 @@
/* Handle end cases */
switch (rem) {
case 3:
- hash += get16bits(key);
+ hash += get_unaligned((uint16_t *) key);
hash ^= hash << 16;
hash ^= key[2] << 18;
hash += hash >> 11;
break;
case 2:
- hash += get16bits(key);
+ hash += get_unaligned((uint16_t *) key);
hash ^= hash << 11;
hash += hash >> 17;
break;
diff --git a/libkmod/libkmod-util.h b/libkmod/libkmod-util.h
index ffe7c43..dae613a 100644
--- a/libkmod/libkmod-util.h
+++ b/libkmod/libkmod-util.h
@@ -33,7 +33,7 @@
__p->__v; \
})
-#define bt_put_unaligned(val, ptr) \
+#define put_unaligned(val, ptr) \
do { \
struct __attribute__((packed)) { \
typeof(*(ptr)) __v; \