MySQL 5.6.14 Source Code Document
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
little_endian.h
1 /* Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
2 
3  This program is free software; you can redistribute it and/or modify
4  it under the terms of the GNU General Public License as published by
5  the Free Software Foundation; version 2 of the License.
6 
7  This program is distributed in the hope that it will be useful,
8  but WITHOUT ANY WARRANTY; without even the implied warranty of
9  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10  GNU General Public License for more details.
11 
12  You should have received a copy of the GNU General Public License
13  along with this program; if not, write to the Free Software
14  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
15 
16 /*
17  Data in little-endian format.
18 */
19 
20 #ifndef MY_BYTE_ORDER_ARCH_OPTIMIZED
21 #define float4get(V,M) memcpy(&V, (M), sizeof(float))
22 #define float4store(V,M) memcpy(V, (&M), sizeof(float))
23 #define float8get(V,M) doubleget((V),(M))
24 #define float8store(V,M) doublestore((V),(M))
25 
26 /* Bi-endian hardware.... */
27 #if defined(__FLOAT_WORD_ORDER) && (__FLOAT_WORD_ORDER == __BIG_ENDIAN)
28 #define doublestore(T,V) do { *(((char*)T)+0)=(char) ((uchar *) &V)[4];\
29  *(((char*)T)+1)=(char) ((uchar *) &V)[5];\
30  *(((char*)T)+2)=(char) ((uchar *) &V)[6];\
31  *(((char*)T)+3)=(char) ((uchar *) &V)[7];\
32  *(((char*)T)+4)=(char) ((uchar *) &V)[0];\
33  *(((char*)T)+5)=(char) ((uchar *) &V)[1];\
34  *(((char*)T)+6)=(char) ((uchar *) &V)[2];\
35  *(((char*)T)+7)=(char) ((uchar *) &V)[3]; }\
36  while(0)
37 #define doubleget(V,M) do { double def_temp;\
38  ((uchar*) &def_temp)[0]=(M)[4];\
39  ((uchar*) &def_temp)[1]=(M)[5];\
40  ((uchar*) &def_temp)[2]=(M)[6];\
41  ((uchar*) &def_temp)[3]=(M)[7];\
42  ((uchar*) &def_temp)[4]=(M)[0];\
43  ((uchar*) &def_temp)[5]=(M)[1];\
44  ((uchar*) &def_temp)[6]=(M)[2];\
45  ((uchar*) &def_temp)[7]=(M)[3];\
46  (V) = def_temp; } while(0)
47 #else /* Bi-endian hardware.... */
48 
49 /* Cast away type qualifiers (necessary as macro takes argument by value). */
50 #define doublestore(T,V) memcpy((T), (void*) &V, sizeof(double))
51 #define doubleget(V,M) memcpy(&V, (M), sizeof(double))
52 
53 #endif /* Bi-endian hardware.... */
54 
55 #endif /* !MY_BYTE_ORDER_ARCH_OPTIMIZED */
56 
57 #define ushortget(V,M) do { uchar *pM= (uchar*)(M);V = uint2korr(pM);} while(0)
58 #define shortget(V,M) do { uchar *pM= (uchar*)(M);V = sint2korr(pM);} while(0)
59 #define longget(V,M) do { uchar *pM= (uchar*)(M);V = sint4korr(pM);} while(0)
60 #define ulongget(V,M) do { uchar *pM= (uchar*)(M);V = uint4korr(pM);} while(0)
61 #define shortstore(T,V) int2store(T,V)
62 #define longstore(T,V) int4store(T,V)
63 
64 #ifndef floatstore
65 /* Cast away type qualifiers (necessary as macro takes argument by value). */
66 #define floatstore(T,V) memcpy((T), (void*) (&V), sizeof(float))
67 #define floatget(V,M) memcpy(&V, (M), sizeof(float))
68 #endif
69 
70 #define longlongget(V,M) memcpy(&V, (M), sizeof(ulonglong))
71 #define longlongstore(T,V) memcpy((T), &V, sizeof(ulonglong))