1
/* Copyright (C) 2000 MySQL AB
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.
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.
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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
16
#ifndef PLUGIN_MYISAM_MYISAMPACK_H
17
#define PLUGIN_MYISAM_MYISAMPACK_H
20
Storing of values in high byte first order.
22
integer keys and file pointers are stored with high byte first to get
26
/* these two are for uniformity */
27
#define mi_sint1korr(A) ((int8_t)(*A))
29
#define mi_sint2korr(A) ((int16_t) (((int16_t) (((const unsigned char*) (A))[1])) +\
30
((int16_t) ((int16_t) ((const char*) (A))[0]) << 8)))
31
#define mi_sint3korr(A) ((int32_t) (((((const unsigned char*) (A))[0]) & 128) ? \
32
(((uint32_t) 255L << 24) | \
33
(((uint32_t) ((const unsigned char*) (A))[0]) << 16) |\
34
(((uint32_t) ((const unsigned char*) (A))[1]) << 8) | \
35
((uint32_t) ((const unsigned char*) (A))[2])) : \
36
(((uint32_t) ((const unsigned char*) (A))[0]) << 16) |\
37
(((uint32_t) ((const unsigned char*) (A))[1]) << 8) | \
38
((uint32_t) ((const unsigned char*) (A))[2])))
39
#define mi_sint4korr(A) ((int32_t) (((int32_t) (((const unsigned char*) (A))[3])) +\
40
((int32_t) (((const unsigned char*) (A))[2]) << 8) +\
41
((int32_t) (((const unsigned char*) (A))[1]) << 16) +\
42
((int32_t) ((int16_t) ((const char*) (A))[0]) << 24)))
43
#define mi_sint8korr(A) ((int64_t) mi_uint8korr(A))
44
#define mi_uint2korr(A) ((uint16_t) (((uint16_t) (((const unsigned char*) (A))[1])) +\
45
((uint16_t) (((const unsigned char*) (A))[0]) << 8)))
46
#define mi_uint3korr(A) ((uint32_t) (((uint32_t) (((const unsigned char*) (A))[2])) +\
47
(((uint32_t) (((const unsigned char*) (A))[1])) << 8) +\
48
(((uint32_t) (((const unsigned char*) (A))[0])) << 16)))
49
#define mi_uint4korr(A) ((uint32_t) (((uint32_t) (((const unsigned char*) (A))[3])) +\
50
(((uint32_t) (((const unsigned char*) (A))[2])) << 8) +\
51
(((uint32_t) (((const unsigned char*) (A))[1])) << 16) +\
52
(((uint32_t) (((const unsigned char*) (A))[0])) << 24)))
53
#define mi_uint5korr(A) ((uint64_t)(((uint32_t) (((const unsigned char*) (A))[4])) +\
54
(((uint32_t) (((const unsigned char*) (A))[3])) << 8) +\
55
(((uint32_t) (((const unsigned char*) (A))[2])) << 16) +\
56
(((uint32_t) (((const unsigned char*) (A))[1])) << 24)) +\
57
(((uint64_t) (((const unsigned char*) (A))[0])) << 32))
58
#define mi_uint6korr(A) ((uint64_t)(((uint32_t) (((const unsigned char*) (A))[5])) +\
59
(((uint32_t) (((const unsigned char*) (A))[4])) << 8) +\
60
(((uint32_t) (((const unsigned char*) (A))[3])) << 16) +\
61
(((uint32_t) (((const unsigned char*) (A))[2])) << 24)) +\
62
(((uint64_t) (((uint32_t) (((const unsigned char*) (A))[1])) +\
63
(((uint32_t) (((const unsigned char*) (A))[0]) << 8)))) <<\
65
#define mi_uint7korr(A) ((uint64_t)(((uint32_t) (((const unsigned char*) (A))[6])) +\
66
(((uint32_t) (((const unsigned char*) (A))[5])) << 8) +\
67
(((uint32_t) (((const unsigned char*) (A))[4])) << 16) +\
68
(((uint32_t) (((const unsigned char*) (A))[3])) << 24)) +\
69
(((uint64_t) (((uint32_t) (((const unsigned char*) (A))[2])) +\
70
(((uint32_t) (((const unsigned char*) (A))[1])) << 8) +\
71
(((uint32_t) (((const unsigned char*) (A))[0])) << 16))) <<\
73
#define mi_uint8korr(A) ((uint64_t)(((uint32_t) (((const unsigned char*) (A))[7])) +\
74
(((uint32_t) (((const unsigned char*) (A))[6])) << 8) +\
75
(((uint32_t) (((const unsigned char*) (A))[5])) << 16) +\
76
(((uint32_t) (((const unsigned char*) (A))[4])) << 24)) +\
77
(((uint64_t) (((uint32_t) (((const unsigned char*) (A))[3])) +\
78
(((uint32_t) (((const unsigned char*) (A))[2])) << 8) +\
79
(((uint32_t) (((const unsigned char*) (A))[1])) << 16) +\
80
(((uint32_t) (((const unsigned char*) (A))[0])) << 24))) <<\
83
/* This one is for uniformity */
84
#define mi_int1store(T,A) *((unsigned char*)(T))= (unsigned char) (A)
86
#define mi_int2store(T,A) { uint32_t def_temp= (uint32_t) (A) ;\
87
((unsigned char*) (T))[1]= (unsigned char) (def_temp);\
88
((unsigned char*) (T))[0]= (unsigned char) (def_temp >> 8); }
89
#define mi_int3store(T,A) { /*lint -save -e734 */\
90
uint32_t def_temp= (uint32_t) (A);\
91
((unsigned char*) (T))[2]= (unsigned char) (def_temp);\
92
((unsigned char*) (T))[1]= (unsigned char) (def_temp >> 8);\
93
((unsigned char*) (T))[0]= (unsigned char) (def_temp >> 16);\
95
#define mi_int4store(T,A) { uint32_t def_temp= (uint32_t) (A);\
96
((unsigned char*) (T))[3]= (unsigned char) (def_temp);\
97
((unsigned char*) (T))[2]= (unsigned char) (def_temp >> 8);\
98
((unsigned char*) (T))[1]= (unsigned char) (def_temp >> 16);\
99
((unsigned char*) (T))[0]= (unsigned char) (def_temp >> 24); }
100
#define mi_int5store(T,A) { uint32_t def_temp= (uint32_t) (A),\
101
def_temp2= (uint32_t) ((A) >> 32);\
102
((unsigned char*) (T))[4]= (unsigned char) (def_temp);\
103
((unsigned char*) (T))[3]= (unsigned char) (def_temp >> 8);\
104
((unsigned char*) (T))[2]= (unsigned char) (def_temp >> 16);\
105
((unsigned char*) (T))[1]= (unsigned char) (def_temp >> 24);\
106
((unsigned char*) (T))[0]= (unsigned char) (def_temp2); }
107
#define mi_int6store(T,A) { uint32_t def_temp= (uint32_t) (A),\
108
def_temp2= (uint32_t) ((A) >> 32);\
109
((unsigned char*) (T))[5]= (unsigned char) (def_temp);\
110
((unsigned char*) (T))[4]= (unsigned char) (def_temp >> 8);\
111
((unsigned char*) (T))[3]= (unsigned char) (def_temp >> 16);\
112
((unsigned char*) (T))[2]= (unsigned char) (def_temp >> 24);\
113
((unsigned char*) (T))[1]= (unsigned char) (def_temp2);\
114
((unsigned char*) (T))[0]= (unsigned char) (def_temp2 >> 8); }
115
#define mi_int7store(T,A) { uint32_t def_temp= (uint32_t) (A),\
116
def_temp2= (uint32_t) ((A) >> 32);\
117
((unsigned char*) (T))[6]= (unsigned char) (def_temp);\
118
((unsigned char*) (T))[5]= (unsigned char) (def_temp >> 8);\
119
((unsigned char*) (T))[4]= (unsigned char) (def_temp >> 16);\
120
((unsigned char*) (T))[3]= (unsigned char) (def_temp >> 24);\
121
((unsigned char*) (T))[2]= (unsigned char) (def_temp2);\
122
((unsigned char*) (T))[1]= (unsigned char) (def_temp2 >> 8);\
123
((unsigned char*) (T))[0]= (unsigned char) (def_temp2 >> 16); }
124
#define mi_int8store(T,A) { uint32_t def_temp3= (uint32_t) (A),\
125
def_temp4= (uint32_t) ((A) >> 32);\
126
mi_int4store((unsigned char*) (T) + 0, def_temp4);\
127
mi_int4store((unsigned char*) (T) + 4, def_temp3); }
129
#ifdef WORDS_BIGENDIAN
131
#define mi_float4get(V,M) { float def_temp;\
132
((unsigned char*) &def_temp)[0]= ((const unsigned char*) (M))[0];\
133
((unsigned char*) &def_temp)[1]= ((const unsigned char*) (M))[1];\
134
((unsigned char*) &def_temp)[2]= ((const unsigned char*) (M))[2];\
135
((unsigned char*) &def_temp)[3]= ((const unsigned char*) (M))[3];\
138
#define mi_float8get(V,M) { double def_temp;\
139
((unsigned char*) &def_temp)[0]= ((unsigned char*) (M))[0];\
140
((unsigned char*) &def_temp)[1]= ((unsigned char*) (M))[1];\
141
((unsigned char*) &def_temp)[2]= ((unsigned char*) (M))[2];\
142
((unsigned char*) &def_temp)[3]= ((unsigned char*) (M))[3];\
143
((unsigned char*) &def_temp)[4]= ((unsigned char*) (M))[4];\
144
((unsigned char*) &def_temp)[5]= ((unsigned char*) (M))[5];\
145
((unsigned char*) &def_temp)[6]= ((unsigned char*) (M))[6];\
146
((unsigned char*) &def_temp)[7]= ((unsigned char*) (M))[7]; \
150
#define mi_float4get(V,M) { float def_temp;\
151
((unsigned char*) &def_temp)[0]= ((unsigned char*) (M))[3];\
152
((unsigned char*) &def_temp)[1]= ((unsigned char*) (M))[2];\
153
((unsigned char*) &def_temp)[2]= ((unsigned char*) (M))[1];\
154
((unsigned char*) &def_temp)[3]= ((unsigned char*) (M))[0];\
157
#if defined(__FLOAT_WORD_ORDER) && (__FLOAT_WORD_ORDER == __BIG_ENDIAN)
159
#define mi_float8get(V,M) { double def_temp;\
160
((unsigned char*) &def_temp)[0]= ((unsigned char*) (M))[3];\
161
((unsigned char*) &def_temp)[1]= ((unsigned char*) (M))[2];\
162
((unsigned char*) &def_temp)[2]= ((unsigned char*) (M))[1];\
163
((unsigned char*) &def_temp)[3]= ((unsigned char*) (M))[0];\
164
((unsigned char*) &def_temp)[4]= ((unsigned char*) (M))[7];\
165
((unsigned char*) &def_temp)[5]= ((unsigned char*) (M))[6];\
166
((unsigned char*) &def_temp)[6]= ((unsigned char*) (M))[5];\
167
((unsigned char*) &def_temp)[7]= ((unsigned char*) (M))[4];\
172
#define mi_float8get(V,M) { double def_temp;\
173
((unsigned char*) &def_temp)[0]= ((unsigned char*) (M))[7];\
174
((unsigned char*) &def_temp)[1]= ((unsigned char*) (M))[6];\
175
((unsigned char*) &def_temp)[2]= ((unsigned char*) (M))[5];\
176
((unsigned char*) &def_temp)[3]= ((unsigned char*) (M))[4];\
177
((unsigned char*) &def_temp)[4]= ((unsigned char*) (M))[3];\
178
((unsigned char*) &def_temp)[5]= ((unsigned char*) (M))[2];\
179
((unsigned char*) &def_temp)[6]= ((unsigned char*) (M))[1];\
180
((unsigned char*) &def_temp)[7]= ((unsigned char*) (M))[0];\
182
#endif /* __FLOAT_WORD_ORDER */
183
#endif /* WORDS_BIGENDIAN */
185
/* Fix to avoid warnings when sizeof(ha_rows) == sizeof(long) */
186
#define mi_rowstore(T,A) mi_int8store(T, A)
187
#define mi_rowkorr(T) mi_uint8korr(T)
189
#define mi_sizestore(T,A) mi_int8store(T, A)
190
#define mi_sizekorr(T) mi_uint8korr(T)
192
#endif /* PLUGIN_MYISAM_MYISAMPACK_H */