Annotation of embedaddon/bird2/lib/unaligned.h, revision 1.1.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 "sysdep/unix/endian.h"
                     21: #include "lib/string.h"
                     22: 
                     23: static inline u8
                     24: get_u8(const void *p)
                     25: {
                     26:   return * (u8 *) p;
                     27: }
                     28: 
                     29: static inline u16
                     30: get_u16(const void *p)
                     31: {
                     32:   u16 x;
                     33:   memcpy(&x, p, 2);
                     34:   return ntohs(x);
                     35: }
                     36: 
                     37: static inline u32
                     38: get_u24(const void *P)
                     39: {
                     40:   const byte *p = P;
                     41:   return (p[0] << 16) + (p[1] << 8) + p[2];
                     42: }
                     43: 
                     44: static inline u32
                     45: get_u32(const void *p)
                     46: {
                     47:   u32 x;
                     48:   memcpy(&x, p, 4);
                     49:   return ntohl(x);
                     50: }
                     51: 
                     52: static inline u64
                     53: get_u64(const void *p)
                     54: {
                     55:   u32 xh, xl;
                     56:   memcpy(&xh, p, 4);
                     57:   memcpy(&xl, p+4, 4);
                     58:   return (((u64) ntohl(xh)) << 32) | ntohl(xl);
                     59: }
                     60: 
                     61: static inline void
                     62: put_u8(void *p, u8 x)
                     63: {
                     64:   memcpy(p, &x, 1);
                     65: }
                     66: 
                     67: static inline void
                     68: put_u16(void *p, u16 x)
                     69: {
                     70:   x = htons(x);
                     71:   memcpy(p, &x, 2);
                     72: }
                     73: 
                     74: static inline void
                     75: put_u24(void *p, u32 x)
                     76: {
                     77:   x = htonl(x);
                     78:   memcpy(p, ((char *) &x) + 1, 3);
                     79: }
                     80: 
                     81: static inline void
                     82: put_u32(void *p, u32 x)
                     83: {
                     84:   x = htonl(x);
                     85:   memcpy(p, &x, 4);
                     86: }
                     87: 
                     88: static inline void
                     89: put_u64(void *p, u64 x)
                     90: {
                     91:   u32 xh, xl;
                     92:   xh = htonl(x >> 32);
                     93:   xl = htonl((u32) x);
                     94:   memcpy(p, &xh, 4);
                     95:   memcpy(p+4, &xl, 4);
                     96: }
                     97: 
                     98: static inline void
                     99: get_u32s(const void *p, u32 *x, int n)
                    100: {
                    101:   int i;
                    102:   memcpy(x, p, 4*n);
                    103:   for (i = 0; i < n; i++)
                    104:     x[i] = ntohl(x[i]);
                    105: }
                    106: 
                    107: static inline void
                    108: put_u32s(void *p, const u32 *x, int n)
                    109: {
                    110:   int i;
                    111:   for (i = 0; i < n; i++)
                    112:     put_u32((byte *) p + 4*i, x[i]);
                    113: }
                    114: 
                    115: 
                    116: #endif

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>