1 #ifndef _KVI_BYTEORDER_H_
2 #define _KVI_BYTEORDER_H_
3 //=============================================================================
4 //
5 //   File : KviByteOrder.h
6 //   Creation date : Mon Dec 25 2006 19:56:16 CEST by Szymon Stefanek
7 //   Based on file : kvi_bswap.h
8 //   Creation date : Fri Mar 19 1999 03:15:21 CEST by Szymon Stefanek
9 //
10 //   This file is part of the KVIrc IRC client distribution
11 //   Copyright (C) 1999-2010 Szymon Stefanek (pragma at kvirc dot net)
12 //
13 //   This program is FREE software. You can redistribute it and/or
14 //   modify it under the terms of the GNU General Public License
15 //   as published by the Free Software Foundation; either version 2
16 //   of the License, or (at your option) any later version.
17 //
18 //   This program is distributed in the HOPE that it will be USEFUL,
19 //   but WITHOUT ANY WARRANTY; without even the implied warranty of
20 //   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 //   See the GNU General Public License for more details.
22 //
23 //   You should have received a copy of the GNU General Public License
24 //   along with this program. If not, write to the Free Software Foundation,
25 //   Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
26 //
27 //=============================================================================
28 
29 #include "kvi_settings.h"
30 #include "kvi_inttypes.h"
31 
32 namespace KviByteOrder
33 {
34 	/**
35 	* \brief Swaps the endianness of a kvi_u64_t
36 	*
37 	* \param i the original value
38 	* \return kvi_u64_t
39 	*/
swap64(kvi_u64_t i)40 	inline kvi_u64_t swap64(kvi_u64_t i)
41 	{
42 		// abcdefgh to hgfedcba
43 		return ((i << 56) |           /* h to a */
44 		    ((i & 0xff00) << 40) |    /* g to b */
45 		    ((i & 0xff0000) << 24) |  /* f to c */
46 		    ((i & 0xff000000) << 8) | /* e to d */
47 		    ((i >> 8) & 0xff000000) | /* d to e */
48 		    ((i >> 24) & 0xff0000) |  /* c to f */
49 		    ((i >> 40) & 0xff00) |    /* b to g */
50 		    (i >> 56));               /* a to h */
51 	}
52 
53 	/**
54 	* \brief Swaps the endianness of a kvi_u32_t
55 	*
56 	* \param i the original value
57 	* \return kvi_u32_t
58 	*/
swap32(kvi_u32_t i)59 	inline kvi_u32_t swap32(kvi_u32_t i)
60 	{
61 		// abcd to dcba
62 		return ((i << 24) | ((i & 0xff00) << 8) | ((i >> 8) & 0xff00) | (i >> 24));
63 	}
64 
65 	/**
66 	* \brief Swaps the endianness of a kvi_u16_t
67 	*
68 	* \param i the original value
69 	* \return kvi_u16_t
70 	*/
swap16(kvi_u16_t i)71 	inline kvi_u16_t swap16(kvi_u16_t i)
72 	{
73 		// ab to ba
74 		return ((i << 8) | (i >> 8));
75 	}
76 
77 //
78 // Byte Orders Reminder
79 //   Number                             0xaabbccdd
80 //   Little Endian Stores               0xdd 0xcc 0xbb 0xaa
81 //   Big Endian Stores                  0xaa 0xbb 0xcc 0xdd
82 //   Perverse Middle Endian             0xbb 0xaa 0xdd 0xcc or another braindamaged combination (unsupported)
83 //   Network Byte Order is Big Endian
84 //   Intel Stuff uses Little Endian
85 //   PPC is Big Endian
86 //   Universal binaries on MacOSX use both Big and Little Endian
87 //
88 
89 #ifdef BIG_ENDIAN_MACHINE_BYTE_ORDER
90 
localCpuToLittleEndian16(kvi_u16_t u)91 	inline kvi_u16_t localCpuToLittleEndian16(kvi_u16_t u)
92 	{
93 		return swap16(u);
94 	}
95 
localCpuToLittleEndian32(kvi_u32_t u)96 	inline kvi_u32_t localCpuToLittleEndian32(kvi_u32_t u)
97 	{
98 		return swap32(u);
99 	}
100 
localCpuToLittleEndian64(kvi_u64_t u)101 	inline kvi_u64_t localCpuToLittleEndian64(kvi_u64_t u)
102 	{
103 		return swap64(u);
104 	}
105 
littleEndianToLocalCpu16(kvi_u16_t u)106 	inline kvi_u16_t littleEndianToLocalCpu16(kvi_u16_t u)
107 	{
108 		return swap16(u);
109 	}
110 
littleEndianToLocalCpu32(kvi_u32_t u)111 	inline kvi_u32_t littleEndianToLocalCpu32(kvi_u32_t u)
112 	{
113 		return swap32(u);
114 	}
115 
littleEndianToLocalCpu64(kvi_u64_t u)116 	inline kvi_u64_t littleEndianToLocalCpu64(kvi_u64_t u)
117 	{
118 		return swap64(u);
119 	}
120 
localCpuToBigEndian16(kvi_u16_t u)121 	inline kvi_u16_t localCpuToBigEndian16(kvi_u16_t u)
122 	{
123 		return u;
124 	}
125 
localCpuToBigEndian32(kvi_u32_t u)126 	inline kvi_u32_t localCpuToBigEndian32(kvi_u32_t u)
127 	{
128 		return u;
129 	}
130 
localCpuToBigEndian64(kvi_u64_t u)131 	inline kvi_u64_t localCpuToBigEndian64(kvi_u64_t u)
132 	{
133 		return u;
134 	}
135 
bigEndianToLocalCpu16(kvi_u16_t u)136 	inline kvi_u16_t bigEndianToLocalCpu16(kvi_u16_t u)
137 	{
138 		return u;
139 	}
140 
bigEndianToLocalCpu32(kvi_u32_t u)141 	inline kvi_u32_t bigEndianToLocalCpu32(kvi_u32_t u)
142 	{
143 		return u;
144 	}
145 
bigEndianToLocalCpu64(kvi_u64_t u)146 	inline kvi_u64_t bigEndianToLocalCpu64(kvi_u64_t u)
147 	{
148 		return u;
149 	}
150 
localCpuToNetworkByteOrder16(kvi_u16_t u)151 	inline kvi_u16_t localCpuToNetworkByteOrder16(kvi_u16_t u)
152 	{
153 		return u;
154 	}
155 
localCpuToNetworkByteOrder32(kvi_u32_t u)156 	inline kvi_u32_t localCpuToNetworkByteOrder32(kvi_u32_t u)
157 	{
158 		return u;
159 	}
160 
localCpuToNetworkByteOrder64(kvi_u64_t u)161 	inline kvi_u64_t localCpuToNetworkByteOrder64(kvi_u64_t u)
162 	{
163 		return u;
164 	}
165 
networkByteOrderToLocalCpu16(kvi_u16_t u)166 	inline kvi_u16_t networkByteOrderToLocalCpu16(kvi_u16_t u)
167 	{
168 		return u;
169 	}
170 
networkByteOrderToLocalCpu32(kvi_u32_t u)171 	inline kvi_u32_t networkByteOrderToLocalCpu32(kvi_u32_t u)
172 	{
173 		return u;
174 	}
175 
networkByteOrderToLocalCpu64(kvi_u64_t u)176 	inline kvi_u64_t networkByteOrderToLocalCpu64(kvi_u64_t u)
177 	{
178 		return u;
179 	}
180 
181 #else //!BIG_ENDIAN_MACHINE_BYTE_ORDER
182 
183 // We ASSUME that the local cpu is little endian.. if it isn't.. well :)
184 #define LOCAL_CPU_LITTLE_ENDIAN 1
185 
localCpuToLittleEndian16(kvi_u16_t u)186 	inline kvi_u16_t localCpuToLittleEndian16(kvi_u16_t u)
187 	{
188 		return u;
189 	}
190 
localCpuToLittleEndian32(kvi_u32_t u)191 	inline kvi_u32_t localCpuToLittleEndian32(kvi_u32_t u)
192 	{
193 		return u;
194 	}
195 
localCpuToLittleEndian64(kvi_u64_t u)196 	inline kvi_u64_t localCpuToLittleEndian64(kvi_u64_t u)
197 	{
198 		return u;
199 	}
200 
littleEndianToLocalCpu16(kvi_u16_t u)201 	inline kvi_u16_t littleEndianToLocalCpu16(kvi_u16_t u)
202 	{
203 		return u;
204 	}
205 
littleEndianToLocalCpu32(kvi_u32_t u)206 	inline kvi_u32_t littleEndianToLocalCpu32(kvi_u32_t u)
207 	{
208 		return u;
209 	}
210 
littleEndianToLocalCpu64(kvi_u64_t u)211 	inline kvi_u64_t littleEndianToLocalCpu64(kvi_u64_t u)
212 	{
213 		return u;
214 	}
215 
localCpuToBigEndian16(kvi_u16_t u)216 	inline kvi_u16_t localCpuToBigEndian16(kvi_u16_t u)
217 	{
218 		return swap16(u);
219 	}
220 
localCpuToBigEndian32(kvi_u32_t u)221 	inline kvi_u32_t localCpuToBigEndian32(kvi_u32_t u)
222 	{
223 		return swap32(u);
224 	}
225 
localCpuToBigEndian64(kvi_u64_t u)226 	inline kvi_u64_t localCpuToBigEndian64(kvi_u64_t u)
227 	{
228 		return swap64(u);
229 	}
230 
bigEndianToLocalCpu16(kvi_u16_t u)231 	inline kvi_u16_t bigEndianToLocalCpu16(kvi_u16_t u)
232 	{
233 		return swap16(u);
234 	}
235 
bigEndianToLocalCpu32(kvi_u32_t u)236 	inline kvi_u32_t bigEndianToLocalCpu32(kvi_u32_t u)
237 	{
238 		return swap32(u);
239 	}
240 
bigEndianToLocalCpu64(kvi_u64_t u)241 	inline kvi_u64_t bigEndianToLocalCpu64(kvi_u64_t u)
242 	{
243 		return swap64(u);
244 	}
245 
localCpuToNetworkByteOrder16(kvi_u16_t u)246 	inline kvi_u16_t localCpuToNetworkByteOrder16(kvi_u16_t u)
247 	{
248 		return swap16(u);
249 	}
250 
localCpuToNetworkByteOrder32(kvi_u32_t u)251 	inline kvi_u32_t localCpuToNetworkByteOrder32(kvi_u32_t u)
252 	{
253 		return swap32(u);
254 	}
255 
localCpuToNetworkByteOrder64(kvi_u64_t u)256 	inline kvi_u64_t localCpuToNetworkByteOrder64(kvi_u64_t u)
257 	{
258 		return swap64(u);
259 	}
260 
networkByteOrderToLocalCpu16(kvi_u16_t u)261 	inline kvi_u16_t networkByteOrderToLocalCpu16(kvi_u16_t u)
262 	{
263 		return swap16(u);
264 	}
265 
networkByteOrderToLocalCpu32(kvi_u32_t u)266 	inline kvi_u32_t networkByteOrderToLocalCpu32(kvi_u32_t u)
267 	{
268 		return swap32(u);
269 	}
270 
networkByteOrderToLocalCpu64(kvi_u64_t u)271 	inline kvi_u64_t networkByteOrderToLocalCpu64(kvi_u64_t u)
272 	{
273 		return swap64(u);
274 	}
275 
276 #endif //!BIG_ENDIAN_MACHINE_BYTE_ORDER
277 
278 } // namespace KviByteOrder
279 
280 #endif // !_KVI_BYTEORDER_H_
281