man: --nbi, not --NBI
[wraplinux.git] / le.h
1 /* ----------------------------------------------------------------------- *
2  *
3  *   Copyright 2008 rPath, Inc. - All Rights Reserved
4  *
5  *   This program is free software; you can redistribute it and/or modify
6  *   it under the terms of the GNU General Public License as published by
7  *   the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
8  *   Boston MA 02110-1301, USA; either version 2 of the License, or
9  *   (at your option) any later version; incorporated herein by reference.
10  *
11  * ----------------------------------------------------------------------- */
12
13 /*
14  * le.h
15  *
16  * Write unaligned littleendian data
17  */
18
19 #ifndef LE_H
20 #define LE_H
21
22 #include <inttypes.h>
23
24 #if defined(__386__) || defined(__i386__) || defined(__x86_64__)
25
26 /* Littleendian architecture, unaligned accesses permitted */
27
28 static inline uint16_t rdle16(const uint16_t *p)
29 {
30         return *p;
31 }
32
33 static inline uint32_t rdle32(const uint32_t *p)
34 {
35         return *p;
36 }
37
38 static inline uint64_t rdle64(const uint64_t *p)
39 {
40         return *p;
41 }
42
43 static inline void wrle16(uint16_t v, uint16_t *p)
44 {
45         *p = v;
46 }
47
48 static inline void wrle32(uint32_t v, uint32_t *p)
49 {
50         *p = v;
51 }
52
53 static inline void wrle64(uint64_t v, uint64_t *p)
54 {
55         *p = v;
56 }
57
58 #else
59
60 static inline uint16_t rdle16(const uint16_t *p)
61 {
62         const uint8_t *_p = (const uint8_t *)p;
63         uint16_t _v;
64
65         _v  = (uint16_t)_p[0];
66         _v += (uint16_t)_p[1] << 8;
67
68         return _v;
69 }
70
71 static inline uint32_t rdle32(const uint32_t *p)
72 {
73         const uint8_t *_p = (const uint8_t *)p;
74         uint32_t _v;
75
76         _v  = (uint32_t)_p[0];
77         _v += (uint32_t)_p[1] << 8;
78         _v += (uint32_t)_p[2] << 16;
79         _v += (uint32_t)_p[3] << 24;
80
81         return _v;
82 }
83
84 static inline uint64_t rdle64(const uint64_t *p)
85 {
86         const uint8_t *_p = (const uint8_t *)p;
87         uint64_t _v;
88
89         _v  = (uint64_t)_p[0];
90         _v += (uint64_t)_p[1] << 8;
91         _v += (uint64_t)_p[2] << 16;
92         _v += (uint64_t)_p[3] << 24;
93         _v += (uint64_t)_p[4] << 32;
94         _v += (uint64_t)_p[5] << 40;
95         _v += (uint64_t)_p[6] << 48;
96         _v += (uint64_t)_p[7] << 56;
97
98         return _v;
99 }
100
101 static inline void wrle16(uint16_t v, uint16_t *p)
102 {
103         uint8_t *_p = (uint8_t *)p;
104
105         _p[0] = v;
106         _p[1] = v >> 8;
107 }
108
109 static inline void wrle32(uint32_t v, uint32_t *p)
110 {
111         uint8_t *_p = (uint8_t *)p;
112
113         _p[0] = v;
114         _p[1] = v >> 8;
115         _p[2] = v >> 16;
116         _p[3] = v >> 24;
117 }
118
119 static inline void wrle64(uint64_t v, uint64_t *p)
120 {
121         uint8_t *_p = (uint8_t *)p;
122
123         _p[0] = v;
124         _p[1] = v >> 8;
125         _p[2] = v >> 16;
126         _p[3] = v >> 24;
127         _p[4] = v >> 32;
128         _p[5] = v >> 40;
129         _p[6] = v >> 48;
130         _p[7] = v >> 56;
131 }
132
133 #endif
134
135 #endif /* LE_H */