Annotation of embedaddon/bird/lib/unaligned.h, revision 1.1.1.2
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
1.1.1.2 ! misho 48: put_u8(void *p, u8 x)
! 49: {
! 50: memcpy(p, &x, 1);
! 51: }
! 52:
! 53: static inline void
1.1 misho 54: put_u16(void *p, u16 x)
55: {
56: x = htons(x);
57: memcpy(p, &x, 2);
58: }
59:
60: static inline void
61: put_u32(void *p, u32 x)
62: {
63: x = htonl(x);
64: memcpy(p, &x, 4);
65: }
66:
67: static inline void
68: put_u64(void *p, u64 x)
69: {
70: u32 xh, xl;
71: xh = htonl(x >> 32);
72: xl = htonl((u32) x);
73: memcpy(p, &xh, 4);
74: memcpy(p+4, &xl, 4);
75: }
76:
77: #endif
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>