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