2 * See the file LICENSE for redistribution information.
4 * Copyright (c) 1996-2009 Oracle. All rights reserved.
11 #ifdef HAVE_COMPRESSION
16 * First byte | Next | Maximum
18 * ------------+------+---------------------------------------------------------
19 * [0 xxxxxxx] | 0 | 2^7 - 1
20 * [10 xxxxxx] | 1 | 2^14 + 2^7 - 1
21 * [110 xxxxx] | 2 | 2^21 + 2^14 + 2^7 - 1
22 * [1110 xxxx] | 3 | 2^28 + 2^21 + 2^14 + 2^7 - 1
23 * [11110 xxx] | 4 | 2^35 + 2^28 + 2^21 + 2^14 + 2^7 - 1
24 * [11111 000] | 5 | 2^40 + 2^35 + 2^28 + 2^21 + 2^14 + 2^7 - 1
25 * [11111 001] | 6 | 2^48 + 2^40 + 2^35 + 2^28 + 2^21 + 2^14 + 2^7 - 1
26 * [11111 010] | 7 | 2^56 + 2^48 + 2^40 + 2^35 + 2^28 + 2^21 + 2^14 + 2^7 - 1
27 * [11111 011] | 8 | 2^64 + 2^56 + 2^48 + 2^40 + 2^35 + 2^28 + 2^21 + 2^14 +
30 * NOTE: this compression algorithm depends
31 * on big-endian order, so swap if necessary.
35 #define CMP_INT_1BYTE_MAX 0x7F
36 #define CMP_INT_2BYTE_MAX 0x407F
37 #define CMP_INT_3BYTE_MAX 0x20407F
38 #define CMP_INT_4BYTE_MAX 0x1020407F
40 #if defined(_MSC_VER) && _MSC_VER < 1300
41 #define CMP_INT_5BYTE_MAX 0x081020407Fi64
42 #define CMP_INT_6BYTE_MAX 0x01081020407Fi64
43 #define CMP_INT_7BYTE_MAX 0x0101081020407Fi64
44 #define CMP_INT_8BYTE_MAX 0x010101081020407Fi64
46 #define CMP_INT_5BYTE_MAX 0x081020407FLL
47 #define CMP_INT_6BYTE_MAX 0x01081020407FLL
48 #define CMP_INT_7BYTE_MAX 0x0101081020407FLL
49 #define CMP_INT_8BYTE_MAX 0x010101081020407FLL
52 #define CMP_INT_2BYTE_VAL 0x80
53 #define CMP_INT_3BYTE_VAL 0xC0
54 #define CMP_INT_4BYTE_VAL 0xE0
55 #define CMP_INT_5BYTE_VAL 0xF0
56 #define CMP_INT_6BYTE_VAL 0xF8
57 #define CMP_INT_7BYTE_VAL 0xF9
58 #define CMP_INT_8BYTE_VAL 0xFA
59 #define CMP_INT_9BYTE_VAL 0xFB
60 /* CMP_INT_SPARE_VAL is defined in db_int.h */
62 #define CMP_INT_2BYTE_MASK 0x3F
63 #define CMP_INT_3BYTE_MASK 0x1F
64 #define CMP_INT_4BYTE_MASK 0x0F
65 #define CMP_INT_5BYTE_MASK 0x07
67 static const u_int8_t __db_marshaled_int_size[] = {
68 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
69 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
70 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
71 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
72 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
73 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
74 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
75 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
76 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
77 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
78 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
79 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
80 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
81 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
82 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
83 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
85 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
86 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
87 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
88 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
89 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
90 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
91 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
92 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
94 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
95 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
96 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
97 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
99 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04,
100 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04,
102 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
103 0x06, 0x07, 0x08, 0x09, 0xFF, 0xFF, 0xFF, 0xFF
107 * __db_compress_count_int --
108 * Return the number of bytes that the compressed version
109 * of the argument will occupy.
111 * PUBLIC: u_int32_t __db_compress_count_int __P((u_int64_t));
114 __db_compress_count_int(i)
117 if (i <= CMP_INT_1BYTE_MAX)
119 else if (i <= CMP_INT_2BYTE_MAX)
121 else if (i <= CMP_INT_3BYTE_MAX)
123 else if (i <= CMP_INT_4BYTE_MAX)
125 else if (i <= CMP_INT_5BYTE_MAX)
127 else if (i <= CMP_INT_6BYTE_MAX)
129 else if (i <= CMP_INT_7BYTE_MAX)
131 else if (i <= CMP_INT_8BYTE_MAX)
138 * __db_compress_int --
139 * Compresses the integer into the buffer, returning the number of
142 * PUBLIC: int __db_compress_int __P((u_int8_t *, u_int64_t));
145 __db_compress_int(buf, i)
149 if (i <= CMP_INT_1BYTE_MAX) {
150 /* no swapping for one byte value */
151 buf[0] = (u_int8_t)i;
154 u_int8_t *p = (u_int8_t*)&i;
155 if (i <= CMP_INT_2BYTE_MAX) {
156 i -= CMP_INT_1BYTE_MAX + 1;
157 if (__db_isbigendian() != 0) {
158 buf[0] = p[6] | CMP_INT_2BYTE_VAL;
161 buf[0] = p[1] | CMP_INT_2BYTE_VAL;
165 } else if (i <= CMP_INT_3BYTE_MAX) {
166 i -= CMP_INT_2BYTE_MAX + 1;
167 if (__db_isbigendian() != 0) {
168 buf[0] = p[5] | CMP_INT_3BYTE_VAL;
172 buf[0] = p[2] | CMP_INT_3BYTE_VAL;
177 } else if (i <= CMP_INT_4BYTE_MAX) {
178 i -= CMP_INT_3BYTE_MAX + 1;
179 if (__db_isbigendian() != 0) {
180 buf[0] = p[4] | CMP_INT_4BYTE_VAL;
185 buf[0] = p[3] | CMP_INT_4BYTE_VAL;
191 } else if (i <= CMP_INT_5BYTE_MAX) {
192 i -= CMP_INT_4BYTE_MAX + 1;
193 if (__db_isbigendian() != 0) {
194 buf[0] = p[3] | CMP_INT_5BYTE_VAL;
200 buf[0] = p[4] | CMP_INT_5BYTE_VAL;
207 } else if (i <= CMP_INT_6BYTE_MAX) {
208 i -= CMP_INT_5BYTE_MAX + 1;
209 if (__db_isbigendian() != 0) {
210 buf[0] = CMP_INT_6BYTE_VAL;
217 buf[0] = CMP_INT_6BYTE_VAL;
225 } else if (i <= CMP_INT_7BYTE_MAX) {
226 i -= CMP_INT_6BYTE_MAX + 1;
227 if (__db_isbigendian() != 0) {
228 buf[0] = CMP_INT_7BYTE_VAL;
236 buf[0] = CMP_INT_7BYTE_VAL;
245 } else if (i <= CMP_INT_8BYTE_MAX) {
246 i -= CMP_INT_7BYTE_MAX + 1;
247 if (__db_isbigendian() != 0) {
248 buf[0] = CMP_INT_8BYTE_VAL;
257 buf[0] = CMP_INT_8BYTE_VAL;
268 i -= CMP_INT_8BYTE_MAX + 1;
269 if (__db_isbigendian() != 0) {
270 buf[0] = CMP_INT_9BYTE_VAL;
280 buf[0] = CMP_INT_9BYTE_VAL;
296 * __db_decompress_count_int --
297 * Return the number of bytes occupied by the compressed
298 * integer pointed to by buf.
300 * PUBLIC: u_int32_t __db_decompress_count_int __P((const u_int8_t *));
303 __db_decompress_count_int(buf)
306 return __db_marshaled_int_size[*buf];
310 * __db_decompress_int --
311 * Decompresses the compressed integer pointer to by buf into i,
312 * returning the number of bytes read.
314 * PUBLIC: int __db_decompress_int __P((const u_int8_t *, u_int64_t *));
317 __db_decompress_int(buf, i)
329 len = __db_marshaled_int_size[c];
336 if (__db_isbigendian() != 0) {
337 p[6] = (c & CMP_INT_2BYTE_MASK);
340 p[1] = (c & CMP_INT_2BYTE_MASK);
343 tmp += CMP_INT_1BYTE_MAX + 1;
346 if (__db_isbigendian() != 0) {
347 p[5] = (c & CMP_INT_3BYTE_MASK);
351 p[2] = (c & CMP_INT_3BYTE_MASK);
355 tmp += CMP_INT_2BYTE_MAX + 1;
358 if (__db_isbigendian() != 0) {
359 p[4] = (c & CMP_INT_4BYTE_MASK);
364 p[3] = (c & CMP_INT_4BYTE_MASK);
369 tmp += CMP_INT_3BYTE_MAX + 1;
372 if (__db_isbigendian() != 0) {
373 p[3] = (c & CMP_INT_5BYTE_MASK);
379 p[4] = (c & CMP_INT_5BYTE_MASK);
385 tmp += CMP_INT_4BYTE_MAX + 1;
388 if (__db_isbigendian() != 0) {
401 tmp += CMP_INT_5BYTE_MAX + 1;
404 if (__db_isbigendian() != 0) {
419 tmp += CMP_INT_6BYTE_MAX + 1;
422 if (__db_isbigendian() != 0) {
439 tmp += CMP_INT_7BYTE_MAX + 1;
442 if (__db_isbigendian() != 0) {
461 tmp += CMP_INT_8BYTE_MAX + 1;
472 * __db_decompress_int32 --
473 * Decompresses the compressed 32 bit integer pointer to by buf into i,
474 * returning the number of bytes read.
476 * PUBLIC: int __db_decompress_int32 __P((const u_int8_t *, u_int32_t *));
479 __db_decompress_int32(buf, i)
491 len = __db_marshaled_int_size[c];
498 if (__db_isbigendian() != 0) {
499 p[2] = (c & CMP_INT_2BYTE_MASK);
502 p[1] = (c & CMP_INT_2BYTE_MASK);
505 tmp += CMP_INT_1BYTE_MAX + 1;
508 if (__db_isbigendian() != 0) {
509 p[1] = (c & CMP_INT_3BYTE_MASK);
513 p[2] = (c & CMP_INT_3BYTE_MASK);
517 tmp += CMP_INT_2BYTE_MAX + 1;
520 if (__db_isbigendian() != 0) {
521 p[0] = (c & CMP_INT_4BYTE_MASK);
526 p[3] = (c & CMP_INT_4BYTE_MASK);
531 tmp += CMP_INT_3BYTE_MAX + 1;
534 if (__db_isbigendian() != 0) {
545 tmp += CMP_INT_4BYTE_MAX + 1;