Upstream tarball 20080603
[amule.git] / src / ArchSpecific.h
blob6dca8b58159710087d9816496a6deab4c0cb74a5
1 //
2 // This file is part of the aMule Project.
3 //
4 // Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org )
5 // Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net )
6 //
7 // Any parts of this program derived from the xMule, lMule or eMule project,
8 // or contributed by third-party developers are copyrighted by their
9 // respective authors.
11 // This program is free software; you can redistribute it and/or modify
12 // it under the terms of the GNU General Public License as published by
13 // the Free Software Foundation; either version 2 of the License, or
14 // (at your option) any later version.
16 // This program is distributed in the hope that it will be useful,
17 // but WITHOUT ANY WARRANTY; without even the implied warranty of
18 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 // GNU General Public License for more details.
20 //
21 // You should have received a copy of the GNU General Public License
22 // along with this program; if not, write to the Free Software
23 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
26 #ifndef ARCHSPECIFIC_H
27 #define ARCHSPECIFIC_H
29 #include "Types.h"
31 #define ENDIAN_SWAP_16(x) (wxUINT16_SWAP_ON_BE(x))
32 #define ENDIAN_SWAP_I_16(x) x = wxUINT16_SWAP_ON_BE(x)
33 #define ENDIAN_SWAP_32(x) (wxUINT32_SWAP_ON_BE(x))
34 #define ENDIAN_SWAP_I_32(x) x = wxUINT32_SWAP_ON_BE(x)
36 #if ((defined __GNUC__) && __GNUC__ >= 2) || defined (_MSC_VER)
37 #define ENDIAN_SWAP_64(x) (wxUINT64_SWAP_ON_BE(x))
38 #define ENDIAN_SWAP_I_64(x) x = wxUINT64_SWAP_ON_BE(x)
39 #endif
41 // ntohs
42 #define ENDIAN_NTOHS(x) ( wxUINT16_SWAP_ON_LE(x) )
43 // ntohl
44 #define ENDIAN_NTOHL(x) ( wxUINT32_SWAP_ON_LE(x) )
45 // new
46 #define ENDIAN_NTOHLL(x) ( wxUINT64_SWAP_ON_LE(x) )
47 // htons
48 #define ENDIAN_HTONS(x) ( wxUINT16_SWAP_ON_LE(x) )
49 // htonl
50 #define ENDIAN_HTONL(x) ( wxUINT32_SWAP_ON_LE(x) )
51 // new
52 #define ENDIAN_HTONLL(x) ( wxUINT64_SWAP_ON_LE(x) )
55 /**
56 * Returns the value in the given bytestream.
58 * The value is returned exactly as it is found.
60 // \{
61 inline uint16 RawPeekUInt16(const void* p);
62 inline uint32 RawPeekUInt32(const void* p);
63 inline uint64 RawPeekUInt64(const void* p);
64 // \}
68 /**
69 * Writes the specified value into the bytestream.
71 * The value is written exactly as it is.
73 // \{
74 inline void RawPokeUInt16(void* p, uint16 nVal);
75 inline void RawPokeUInt32(void* p, uint32 nVal);
76 inline void RawPokeUInt64(void* p, uint64 nVal);
77 // \}
80 /**
81 * Returns the value in the given bytestream.
83 * The value is returned as little-endian.
85 // \{
86 inline uint8 PeekUInt8(const void* p);
87 inline uint16 PeekUInt16(const void* p);
88 inline uint32 PeekUInt32(const void* p);
89 inline uint64 PeekUInt64(const void* p);
90 // \}
93 /**
94 * Writes the specified value into the bytestream.
96 * The value is written as little-endian.
98 // \{
99 inline void PokeUInt8(void* p, uint8 nVal);
100 inline void PokeUInt16(void* p, uint16 nVal);
101 inline void PokeUInt32(void* p, uint32 nVal);
102 inline void PokeUInt64(void* p, uint64 nVal);
103 // \}
106 #if defined(__arm__) || defined(__sparc__) || defined(__mips__)
107 #define ARM_OR_SPARC
108 #endif
111 ///////////////////////////////////////////////////////////////////////////////
112 // Peek - helper functions for read-accessing memory without modifying the memory pointer
114 inline uint16 RawPeekUInt16(const void* p)
116 #ifndef ARM_OR_SPARC
117 return *((uint16*)p);
118 #else
119 uint16 value;
120 memcpy( &value, p, sizeof( uint16 ) );
121 return value;
122 #endif
126 inline uint32 RawPeekUInt32(const void* p)
128 #ifndef ARM_OR_SPARC
129 return *((uint32*)p);
130 #else
131 uint32 value;
132 memcpy( &value, p, sizeof( uint32 ) );
133 return value;
134 #endif
138 inline uint64 RawPeekUInt64(const void* p)
140 #ifndef ARM_OR_SPARC
141 return *((uint64*)p);
142 #else
143 uint64 value;
144 memcpy( &value, p, sizeof( uint64 ) );
145 return value;
146 #endif
150 inline uint8 PeekUInt8(const void* p)
152 return *((uint8*)p);
156 inline uint16 PeekUInt16(const void* p)
158 return ENDIAN_SWAP_16( RawPeekUInt16( p ) );
162 inline uint32 PeekUInt32(const void* p)
164 return ENDIAN_SWAP_32( RawPeekUInt32( p ) );
167 inline uint64 PeekUInt64(const void* p)
169 return ENDIAN_SWAP_64( RawPeekUInt64( p ) );
174 ///////////////////////////////////////////////////////////////////////////////
175 // Poke - helper functions for write-accessing memory without modifying the memory pointer
178 inline void RawPokeUInt16(void* p, uint16 nVal)
180 #ifndef ARM_OR_SPARC
181 *((uint16*)p) = nVal;
182 #else
183 memcpy( p, &nVal, sizeof(uint16) );
184 #endif
188 inline void RawPokeUInt32(void* p, uint32 nVal)
190 #ifndef ARM_OR_SPARC
191 *((uint32*)p) = nVal;
192 #else
193 memcpy( p, &nVal, sizeof(uint32) );
194 #endif
198 inline void RawPokeUInt64(void* p, uint64 nVal)
200 #ifndef ARM_OR_SPARC
201 *((uint64*)p) = nVal;
202 #else
203 memcpy( p, &nVal, sizeof(uint64) );
204 #endif
208 inline void PokeUInt8(void* p, uint8 nVal)
210 *((uint8*)p) = nVal;
214 inline void PokeUInt16(void* p, uint16 nVal)
216 RawPokeUInt16( p, ENDIAN_SWAP_16( nVal ) );
220 inline void PokeUInt32(void* p, uint32 nVal)
222 RawPokeUInt32( p, ENDIAN_SWAP_32( nVal ) );
225 inline void PokeUInt64(void* p, uint64 nVal)
227 RawPokeUInt64( p, ENDIAN_SWAP_64( nVal ) );
230 #endif
231 // File_checked_for_headers