123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306 |
- #ifndef MYISAMPACK_INCLUDED
- #define MYISAMPACK_INCLUDED
- /* Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License, version 2.0,
- as published by the Free Software Foundation.
- This program is also distributed with certain software (including
- but not limited to OpenSSL) that is licensed under separate terms,
- as designated in a particular file or component or in included license
- documentation. The authors of MySQL hereby grant you an additional
- permission to link the program and your derivative works with the
- separately licensed software that they have included with MySQL.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License, version 2.0, for more details.
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
- /**
- @file include/myisampack.h
- Storing of values in high byte first order.
- Integer keys and file pointers are stored with high byte first to get
- better compression.
- */
- #include "my_config.h"
- #ifdef HAVE_ENDIAN_H
- #include <endian.h>
- #endif
- #include <sys/types.h>
- #include "my_inttypes.h"
- /* these two are for uniformity */
- static inline int8 mi_sint1korr(const uchar *A) { return *A; }
- static inline uint8 mi_uint1korr(const uchar *A) { return *A; }
- static inline int16 mi_sint2korr(const uchar *A) {
- return (int16)((uint32)(A[1]) + ((uint32)(A[0]) << 8));
- }
- static inline int32 mi_sint3korr(const uchar *A) {
- return (int32)((A[0] & 128) ? ((255U << 24) | ((uint32)(A[0]) << 16) |
- ((uint32)(A[1]) << 8) | ((uint32)A[2]))
- : (((uint32)(A[0]) << 16) |
- ((uint32)(A[1]) << 8) | ((uint32)(A[2]))));
- }
- static inline int32 mi_sint4korr(const uchar *A) {
- return (int32)((uint32)(A[3]) + ((uint32)(A[2]) << 8) +
- ((uint32)(A[1]) << 16) + ((uint32)(A[0]) << 24));
- }
- static inline uint16 mi_uint2korr(const uchar *A) {
- return (uint16)((uint16)A[1]) + ((uint16)A[0] << 8);
- }
- static inline uint32 mi_uint3korr(const uchar *A) {
- return (uint32)((uint32)A[2] + ((uint32)A[1] << 8) + ((uint32)A[0] << 16));
- }
- static inline uint32 mi_uint4korr(const uchar *A) {
- return (uint32)((uint32)A[3] + ((uint32)A[2] << 8) + ((uint32)A[1] << 16) +
- ((uint32)A[0] << 24));
- }
- static inline ulonglong mi_uint5korr(const uchar *A) {
- return (ulonglong)((uint32)A[4] + ((uint32)A[3] << 8) + ((uint32)A[2] << 16) +
- ((uint32)A[1] << 24)) +
- ((ulonglong)A[0] << 32);
- }
- static inline ulonglong mi_uint6korr(const uchar *A) {
- return (ulonglong)((uint32)A[5] + ((uint32)A[4] << 8) + ((uint32)A[3] << 16) +
- ((uint32)A[2] << 24)) +
- (((ulonglong)((uint32)A[1] + ((uint32)A[0] << 8))) << 32);
- }
- static inline ulonglong mi_uint7korr(const uchar *A) {
- return (ulonglong)((uint32)A[6] + ((uint32)A[5] << 8) + ((uint32)A[4] << 16) +
- ((uint32)A[3] << 24)) +
- (((ulonglong)((uint32)A[2] + ((uint32)A[1] << 8) +
- ((uint32)A[0] << 16)))
- << 32);
- }
- static inline ulonglong mi_uint8korr(const uchar *A) {
- return (ulonglong)((uint32)A[7] + ((uint32)A[6] << 8) + ((uint32)A[5] << 16) +
- ((uint32)A[4] << 24)) +
- (((ulonglong)((uint32)A[3] + ((uint32)A[2] << 8) +
- ((uint32)A[1] << 16) + ((uint32)A[0] << 24)))
- << 32);
- }
- static inline longlong mi_sint8korr(const uchar *A) {
- return (longlong)mi_uint8korr(A);
- }
- /* This one is for uniformity */
- #define mi_int1store(T, A) *((uchar *)(T)) = (uchar)(A)
- #define mi_int2store(T, A) \
- { \
- uint def_temp = (uint)(A); \
- ((uchar *)(T))[1] = (uchar)(def_temp); \
- ((uchar *)(T))[0] = (uchar)(def_temp >> 8); \
- }
- #define mi_int3store(T, A) \
- { /*lint -save -e734 */ \
- ulong def_temp = (ulong)(A); \
- ((uchar *)(T))[2] = (uchar)(def_temp); \
- ((uchar *)(T))[1] = (uchar)(def_temp >> 8); \
- ((uchar *)(T))[0] = (uchar)(def_temp >> 16); \
- /*lint -restore */}
- #define mi_int4store(T, A) \
- { \
- ulong def_temp = (ulong)(A); \
- ((uchar *)(T))[3] = (uchar)(def_temp); \
- ((uchar *)(T))[2] = (uchar)(def_temp >> 8); \
- ((uchar *)(T))[1] = (uchar)(def_temp >> 16); \
- ((uchar *)(T))[0] = (uchar)(def_temp >> 24); \
- }
- #define mi_int5store(T, A) \
- { \
- ulong def_temp = (ulong)(A), def_temp2 = (ulong)((A) >> 32); \
- ((uchar *)(T))[4] = (uchar)(def_temp); \
- ((uchar *)(T))[3] = (uchar)(def_temp >> 8); \
- ((uchar *)(T))[2] = (uchar)(def_temp >> 16); \
- ((uchar *)(T))[1] = (uchar)(def_temp >> 24); \
- ((uchar *)(T))[0] = (uchar)(def_temp2); \
- }
- #define mi_int6store(T, A) \
- { \
- ulong def_temp = (ulong)(A), def_temp2 = (ulong)((A) >> 32); \
- ((uchar *)(T))[5] = (uchar)(def_temp); \
- ((uchar *)(T))[4] = (uchar)(def_temp >> 8); \
- ((uchar *)(T))[3] = (uchar)(def_temp >> 16); \
- ((uchar *)(T))[2] = (uchar)(def_temp >> 24); \
- ((uchar *)(T))[1] = (uchar)(def_temp2); \
- ((uchar *)(T))[0] = (uchar)(def_temp2 >> 8); \
- }
- #define mi_int7store(T, A) \
- { \
- ulong def_temp = (ulong)(A), def_temp2 = (ulong)((A) >> 32); \
- ((uchar *)(T))[6] = (uchar)(def_temp); \
- ((uchar *)(T))[5] = (uchar)(def_temp >> 8); \
- ((uchar *)(T))[4] = (uchar)(def_temp >> 16); \
- ((uchar *)(T))[3] = (uchar)(def_temp >> 24); \
- ((uchar *)(T))[2] = (uchar)(def_temp2); \
- ((uchar *)(T))[1] = (uchar)(def_temp2 >> 8); \
- ((uchar *)(T))[0] = (uchar)(def_temp2 >> 16); \
- }
- #define mi_int8store(T, A) \
- { \
- ulong def_temp3 = (ulong)(A), def_temp4 = (ulong)((A) >> 32); \
- mi_int4store((uchar *)(T) + 0, def_temp4); \
- mi_int4store((uchar *)(T) + 4, def_temp3); \
- }
- #ifdef WORDS_BIGENDIAN
- #define mi_float4store(T, A) \
- { \
- ((uchar *)(T))[0] = ((uchar *)&A)[0]; \
- ((uchar *)(T))[1] = ((uchar *)&A)[1]; \
- ((uchar *)(T))[2] = ((uchar *)&A)[2]; \
- ((uchar *)(T))[3] = ((uchar *)&A)[3]; \
- }
- static inline float mi_float4get(const uchar *M) {
- float def_temp;
- ((uchar *)&def_temp)[0] = M[0];
- ((uchar *)&def_temp)[1] = M[1];
- ((uchar *)&def_temp)[2] = M[2];
- ((uchar *)&def_temp)[3] = M[3];
- return def_temp;
- }
- #define mi_float8store(T, V) \
- { \
- ((uchar *)(T))[0] = ((uchar *)&V)[0]; \
- ((uchar *)(T))[1] = ((uchar *)&V)[1]; \
- ((uchar *)(T))[2] = ((uchar *)&V)[2]; \
- ((uchar *)(T))[3] = ((uchar *)&V)[3]; \
- ((uchar *)(T))[4] = ((uchar *)&V)[4]; \
- ((uchar *)(T))[5] = ((uchar *)&V)[5]; \
- ((uchar *)(T))[6] = ((uchar *)&V)[6]; \
- ((uchar *)(T))[7] = ((uchar *)&V)[7]; \
- }
- static inline double mi_float8get(const uchar *M) {
- double def_temp;
- ((uchar *)&def_temp)[0] = M[0];
- ((uchar *)&def_temp)[1] = M[1];
- ((uchar *)&def_temp)[2] = M[2];
- ((uchar *)&def_temp)[3] = M[3];
- ((uchar *)&def_temp)[4] = M[4];
- ((uchar *)&def_temp)[5] = M[5];
- ((uchar *)&def_temp)[6] = M[6];
- ((uchar *)&def_temp)[7] = M[7];
- return def_temp;
- }
- #else
- #define mi_float4store(T, A) \
- { \
- ((uchar *)(T))[0] = ((uchar *)&A)[3]; \
- ((uchar *)(T))[1] = ((uchar *)&A)[2]; \
- ((uchar *)(T))[2] = ((uchar *)&A)[1]; \
- ((uchar *)(T))[3] = ((uchar *)&A)[0]; \
- }
- static inline float mi_float4get(const uchar *M) {
- float def_temp;
- ((uchar *)&def_temp)[0] = M[3];
- ((uchar *)&def_temp)[1] = M[2];
- ((uchar *)&def_temp)[2] = M[1];
- ((uchar *)&def_temp)[3] = M[0];
- return def_temp;
- }
- #if defined(__FLOAT_WORD_ORDER) && (__FLOAT_WORD_ORDER == __BIG_ENDIAN)
- #define mi_float8store(T, V) \
- { \
- ((uchar *)(T))[0] = ((uchar *)&V)[3]; \
- ((uchar *)(T))[1] = ((uchar *)&V)[2]; \
- ((uchar *)(T))[2] = ((uchar *)&V)[1]; \
- ((uchar *)(T))[3] = ((uchar *)&V)[0]; \
- ((uchar *)(T))[4] = ((uchar *)&V)[7]; \
- ((uchar *)(T))[5] = ((uchar *)&V)[6]; \
- ((uchar *)(T))[6] = ((uchar *)&V)[5]; \
- ((uchar *)(T))[7] = ((uchar *)&V)[4]; \
- }
- static inline double mi_float8get(const uchar *M) {
- double def_temp;
- ((uchar *)&def_temp)[0] = M[3];
- ((uchar *)&def_temp)[1] = M[2];
- ((uchar *)&def_temp)[2] = M[1];
- ((uchar *)&def_temp)[3] = M[0];
- ((uchar *)&def_temp)[4] = M[7];
- ((uchar *)&def_temp)[5] = M[6];
- ((uchar *)&def_temp)[6] = M[5];
- ((uchar *)&def_temp)[7] = M[4];
- return def_temp;
- }
- #else
- #define mi_float8store(T, V) \
- { \
- ((uchar *)(T))[0] = ((uchar *)&V)[7]; \
- ((uchar *)(T))[1] = ((uchar *)&V)[6]; \
- ((uchar *)(T))[2] = ((uchar *)&V)[5]; \
- ((uchar *)(T))[3] = ((uchar *)&V)[4]; \
- ((uchar *)(T))[4] = ((uchar *)&V)[3]; \
- ((uchar *)(T))[5] = ((uchar *)&V)[2]; \
- ((uchar *)(T))[6] = ((uchar *)&V)[1]; \
- ((uchar *)(T))[7] = ((uchar *)&V)[0]; \
- }
- static inline double mi_float8get(const uchar *M) {
- double def_temp;
- ((uchar *)&def_temp)[0] = M[7];
- ((uchar *)&def_temp)[1] = M[6];
- ((uchar *)&def_temp)[2] = M[5];
- ((uchar *)&def_temp)[3] = M[4];
- ((uchar *)&def_temp)[4] = M[3];
- ((uchar *)&def_temp)[5] = M[2];
- ((uchar *)&def_temp)[6] = M[1];
- ((uchar *)&def_temp)[7] = M[0];
- return def_temp;
- }
- #endif /* __FLOAT_WORD_ORDER */
- #endif /* WORDS_BIGENDIAN */
- #define mi_rowstore(T, A) mi_int8store(T, A)
- #define mi_rowkorr(T) mi_uint8korr(T)
- #if SIZEOF_OFF_T > 4
- #define mi_sizestore(T, A) mi_int8store(T, A)
- #define mi_sizekorr(T) mi_uint8korr(T)
- #else
- #define mi_sizestore(T, A) \
- { \
- if ((A) == HA_OFFSET_ERROR) \
- memset((T), 255, 8); \
- else { \
- mi_int4store((T), 0); \
- mi_int4store(((T) + 4), A); \
- } \
- }
- #define mi_sizekorr(T) mi_uint4korr((uchar *)(T) + 4)
- #endif
- #endif /* MYISAMPACK_INCLUDED */
|