KVIrc 5.2.4
Developer APIs
KviByteOrder.h
Go to the documentation of this file.
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
32namespace KviByteOrder
33{
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
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
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
91 inline kvi_u16_t localCpuToLittleEndian16(kvi_u16_t u)
92 {
93 return swap16(u);
94 }
95
96 inline kvi_u32_t localCpuToLittleEndian32(kvi_u32_t u)
97 {
98 return swap32(u);
99 }
100
102 {
103 return swap64(u);
104 }
105
106 inline kvi_u16_t littleEndianToLocalCpu16(kvi_u16_t u)
107 {
108 return swap16(u);
109 }
110
111 inline kvi_u32_t littleEndianToLocalCpu32(kvi_u32_t u)
112 {
113 return swap32(u);
114 }
115
117 {
118 return swap64(u);
119 }
120
121 inline kvi_u16_t localCpuToBigEndian16(kvi_u16_t u)
122 {
123 return u;
124 }
125
126 inline kvi_u32_t localCpuToBigEndian32(kvi_u32_t u)
127 {
128 return u;
129 }
130
132 {
133 return u;
134 }
135
136 inline kvi_u16_t bigEndianToLocalCpu16(kvi_u16_t u)
137 {
138 return u;
139 }
140
141 inline kvi_u32_t bigEndianToLocalCpu32(kvi_u32_t u)
142 {
143 return u;
144 }
145
147 {
148 return u;
149 }
150
151 inline kvi_u16_t localCpuToNetworkByteOrder16(kvi_u16_t u)
152 {
153 return u;
154 }
155
156 inline kvi_u32_t localCpuToNetworkByteOrder32(kvi_u32_t u)
157 {
158 return u;
159 }
160
162 {
163 return u;
164 }
165
166 inline kvi_u16_t networkByteOrderToLocalCpu16(kvi_u16_t u)
167 {
168 return u;
169 }
170
171 inline kvi_u32_t networkByteOrderToLocalCpu32(kvi_u32_t u)
172 {
173 return u;
174 }
175
177 {
178 return u;
179 }
180
181#else
182
183// We ASSUME that the local cpu is little endian.. if it isn't.. well :)
184#define LOCAL_CPU_LITTLE_ENDIAN 1
185
186 inline kvi_u16_t localCpuToLittleEndian16(kvi_u16_t u)
187 {
188 return u;
189 }
190
191 inline kvi_u32_t localCpuToLittleEndian32(kvi_u32_t u)
192 {
193 return u;
194 }
195
197 {
198 return u;
199 }
200
201 inline kvi_u16_t littleEndianToLocalCpu16(kvi_u16_t u)
202 {
203 return u;
204 }
205
206 inline kvi_u32_t littleEndianToLocalCpu32(kvi_u32_t u)
207 {
208 return u;
209 }
210
212 {
213 return u;
214 }
215
216 inline kvi_u16_t localCpuToBigEndian16(kvi_u16_t u)
217 {
218 return swap16(u);
219 }
220
221 inline kvi_u32_t localCpuToBigEndian32(kvi_u32_t u)
222 {
223 return swap32(u);
224 }
225
227 {
228 return swap64(u);
229 }
230
231 inline kvi_u16_t bigEndianToLocalCpu16(kvi_u16_t u)
232 {
233 return swap16(u);
234 }
235
236 inline kvi_u32_t bigEndianToLocalCpu32(kvi_u32_t u)
237 {
238 return swap32(u);
239 }
240
242 {
243 return swap64(u);
244 }
245
246 inline kvi_u16_t localCpuToNetworkByteOrder16(kvi_u16_t u)
247 {
248 return swap16(u);
249 }
250
251 inline kvi_u32_t localCpuToNetworkByteOrder32(kvi_u32_t u)
252 {
253 return swap32(u);
254 }
255
257 {
258 return swap64(u);
259 }
260
261 inline kvi_u16_t networkByteOrderToLocalCpu16(kvi_u16_t u)
262 {
263 return swap16(u);
264 }
265
266 inline kvi_u32_t networkByteOrderToLocalCpu32(kvi_u32_t u)
267 {
268 return swap32(u);
269 }
270
272 {
273 return swap64(u);
274 }
275
276#endif
277
278} // namespace KviByteOrder
279
280#endif // !_KVI_BYTEORDER_H_
#define i
Definition detector.cpp:74
#define u
Definition detector.cpp:86
unsigned long long int kvi_u64_t
Definition kvi_inttypes.h:66
This file contains compile time settings.
Definition KviByteOrder.h:33
kvi_u64_t localCpuToNetworkByteOrder64(kvi_u64_t u)
Definition KviByteOrder.h:256
kvi_u64_t networkByteOrderToLocalCpu64(kvi_u64_t u)
Definition KviByteOrder.h:271
kvi_u16_t localCpuToNetworkByteOrder16(kvi_u16_t u)
Definition KviByteOrder.h:246
kvi_u64_t littleEndianToLocalCpu64(kvi_u64_t u)
Definition KviByteOrder.h:211
kvi_u16_t littleEndianToLocalCpu16(kvi_u16_t u)
Definition KviByteOrder.h:201
kvi_u64_t bigEndianToLocalCpu64(kvi_u64_t u)
Definition KviByteOrder.h:241
kvi_u64_t localCpuToLittleEndian64(kvi_u64_t u)
Definition KviByteOrder.h:196
kvi_u64_t swap64(kvi_u64_t i)
Swaps the endianness of a kvi_u64_t.
Definition KviByteOrder.h:40
kvi_u16_t localCpuToBigEndian16(kvi_u16_t u)
Definition KviByteOrder.h:216
kvi_u64_t localCpuToBigEndian64(kvi_u64_t u)
Definition KviByteOrder.h:226
kvi_u32_t swap32(kvi_u32_t i)
Swaps the endianness of a kvi_u32_t.
Definition KviByteOrder.h:59
kvi_u32_t bigEndianToLocalCpu32(kvi_u32_t u)
Definition KviByteOrder.h:236
kvi_u16_t localCpuToLittleEndian16(kvi_u16_t u)
Definition KviByteOrder.h:186
kvi_u16_t bigEndianToLocalCpu16(kvi_u16_t u)
Definition KviByteOrder.h:231
kvi_u32_t localCpuToBigEndian32(kvi_u32_t u)
Definition KviByteOrder.h:221
kvi_u16_t swap16(kvi_u16_t i)
Swaps the endianness of a kvi_u16_t.
Definition KviByteOrder.h:71
kvi_u32_t networkByteOrderToLocalCpu32(kvi_u32_t u)
Definition KviByteOrder.h:266
kvi_u32_t localCpuToNetworkByteOrder32(kvi_u32_t u)
Definition KviByteOrder.h:251
kvi_u32_t localCpuToLittleEndian32(kvi_u32_t u)
Definition KviByteOrder.h:191
kvi_u16_t networkByteOrderToLocalCpu16(kvi_u16_t u)
Definition KviByteOrder.h:261
kvi_u32_t littleEndianToLocalCpu32(kvi_u32_t u)
Definition KviByteOrder.h:206