Annotation of embedaddon/bird/lib/unaligned.h, revision 1.1
1.1 ! misho 1: /*
! 2: * Unaligned Data Accesses -- Generic Version, Network Order
! 3: *
! 4: * (c) 2000 Martin Mares <mj@ucw.cz>
! 5: *
! 6: * Can be freely distributed and used under the terms of the GNU GPL.
! 7: */
! 8:
! 9: #ifndef _BIRD_UNALIGNED_H_
! 10: #define _BIRD_UNALIGNED_H_
! 11:
! 12: /*
! 13: * We don't do any clever tricks with unaligned accesses since it's
! 14: * virtually impossible to figure out what alignment does the CPU want
! 15: * (unaligned accesses can be emulated by the OS which makes them work,
! 16: * but unusably slow). We use memcpy and hope GCC will optimize it out
! 17: * if possible.
! 18: */
! 19:
! 20: #include "lib/string.h"
! 21:
! 22: static inline u16
! 23: get_u16(const void *p)
! 24: {
! 25: u16 x;
! 26: memcpy(&x, p, 2);
! 27: return ntohs(x);
! 28: }
! 29:
! 30: static inline u32
! 31: get_u32(const void *p)
! 32: {
! 33: u32 x;
! 34: memcpy(&x, p, 4);
! 35: return ntohl(x);
! 36: }
! 37:
! 38: static inline u64
! 39: get_u64(const void *p)
! 40: {
! 41: u32 xh, xl;
! 42: memcpy(&xh, p, 4);
! 43: memcpy(&xl, p+4, 4);
! 44: return (((u64) ntohl(xh)) << 32) | ntohl(xl);
! 45: }
! 46:
! 47: static inline void
! 48: put_u16(void *p, u16 x)
! 49: {
! 50: x = htons(x);
! 51: memcpy(p, &x, 2);
! 52: }
! 53:
! 54: static inline void
! 55: put_u32(void *p, u32 x)
! 56: {
! 57: x = htonl(x);
! 58: memcpy(p, &x, 4);
! 59: }
! 60:
! 61: static inline void
! 62: put_u64(void *p, u64 x)
! 63: {
! 64: u32 xh, xl;
! 65: xh = htonl(x >> 32);
! 66: xl = htonl((u32) x);
! 67: memcpy(p, &xh, 4);
! 68: memcpy(p+4, &xl, 4);
! 69: }
! 70:
! 71: #endif
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>