11/*****************************************************************************
22
3- Copyright (c) 1995, 2018 , Oracle and/or its affiliates. All Rights Reserved.
3+ Copyright (c) 1995, 2019 , Oracle and/or its affiliates. All Rights Reserved.
44
55This program is free software; you can redistribute it and/or modify it under
66the terms of the GNU General Public License, version 2.0, as published by the
@@ -179,6 +179,18 @@ ulint mach_write_compressed(byte *b, ulint n) {
179179 /* 1110nnnn nnnnnnnn nnnnnnnn nnnnnnnn (28 bits) */
180180 mach_write_to_4(b, n | 0xE0000000);
181181 return (4);
182+ } else if (n >= 0xFFFFFC00) {
183+ /* 111110nn nnnnnnnn (10 bits) (extended) */
184+ mach_write_to_2(b, (n & 0x3FF) | 0xF800);
185+ return (2);
186+ } else if (n >= 0xFFFE0000) {
187+ /* 1111110n nnnnnnnn nnnnnnnn (17 bits) (extended) */
188+ mach_write_to_3(b, (n & 0x1FFFF) | 0xFC0000);
189+ return (3);
190+ } else if (n >= 0xFF000000) {
191+ /* 11111110 nnnnnnnn nnnnnnnn nnnnnnnn (24 bits) (extended) */
192+ mach_write_to_4(b, (n & 0xFFFFFF) | 0xFE000000);
193+ return (4);
182194 } else {
183195 /* 11110000 nnnnnnnn nnnnnnnn nnnnnnnn nnnnnnnn (32 bits) */
184196 mach_write_to_1(b, 0xF0);
@@ -204,6 +216,15 @@ ulint mach_get_compressed_size(ulint n) {
204216 } else if (n < 0x10000000) {
205217 /* 1110nnnn nnnnnnnn nnnnnnnn nnnnnnnn (28 bits) */
206218 return (4);
219+ } else if (n >= 0xFFFFFC00) {
220+ /* 111110nn nnnnnnnn (10 bits) (extended) */
221+ return (2);
222+ } else if (n >= 0xFFFE0000) {
223+ /* 1111110n nnnnnnnn nnnnnnnn (17 bits) (extended) */
224+ return (3);
225+ } else if (n >= 0xFF000000) {
226+ /* 11111110 nnnnnnnn nnnnnnnn nnnnnnnn (24 bits) (extended) */
227+ return (4);
207228 } else {
208229 /* 11110000 nnnnnnnn nnnnnnnn nnnnnnnn nnnnnnnn (32 bits) */
209230 return (5);
@@ -235,11 +256,24 @@ ulint mach_read_compressed(const byte *b) {
235256 /* 1110nnnn nnnnnnnn nnnnnnnn nnnnnnnn (28 bits) */
236257 val = mach_read_from_4(b) & 0xFFFFFFF;
237258 ut_ad(val > 0x1FFFFF);
238- } else {
259+ } else if (val < 0xF8) {
239260 /* 11110000 nnnnnnnn nnnnnnnn nnnnnnnn nnnnnnnn (32 bits) */
240261 ut_ad(val == 0xF0);
241262 val = mach_read_from_4(b + 1);
263+ /* this can treat not-extended format also. */
242264 ut_ad(val > 0xFFFFFFF);
265+ } else if (val < 0xFC) {
266+ /* 111110nn nnnnnnnn (10 bits) (extended) */
267+ val = (mach_read_from_2(b) & 0x3FF) | 0xFFFFFC00;
268+ } else if (val < 0xFE) {
269+ /* 1111110n nnnnnnnn nnnnnnnn (17 bits) (extended) */
270+ val = (mach_read_from_3(b) & 0x1FFFF) | 0xFFFE0000;
271+ ut_ad(val < 0xFFFFFC00);
272+ } else {
273+ /* 11111110 nnnnnnnn nnnnnnnn nnnnnnnn (24 bits) (extended) */
274+ ut_ad(val == 0xFE);
275+ val = mach_read_from_3(b + 1) | 0xFF000000;
276+ ut_ad(val < 0xFFFE0000);
243277 }
244278
245279 return (val);
@@ -271,12 +305,28 @@ ib_uint32_t mach_read_next_compressed(const byte **b) {
271305 val = mach_read_from_4(*b) & 0xFFFFFFF;
272306 ut_ad(val > 0x1FFFFF);
273307 *b += 4;
274- } else {
308+ } else if (val < 0xF8) {
275309 /* 11110000 nnnnnnnn nnnnnnnn nnnnnnnn nnnnnnnn (32 bits) */
276310 ut_ad(val == 0xF0);
277311 val = mach_read_from_4(*b + 1);
312+ /* this can treat not-extended format also. */
278313 ut_ad(val > 0xFFFFFFF);
279314 *b += 5;
315+ } else if (val < 0xFC) {
316+ /* 111110nn nnnnnnnn (10 bits) (extended) */
317+ val = (mach_read_from_2(*b) & 0x3FF) | 0xFFFFFC00;
318+ *b += 2;
319+ } else if (val < 0xFE) {
320+ /* 1111110n nnnnnnnn nnnnnnnn (17 bits) (extended) */
321+ val = (mach_read_from_3(*b) & 0x1FFFF) | 0xFFFE0000;
322+ ut_ad(val < 0xFFFFFC00);
323+ *b += 3;
324+ } else {
325+ /* 11111110 nnnnnnnn nnnnnnnn nnnnnnnn (24 bits) (extended) */
326+ ut_ad(val == 0xFE);
327+ val = mach_read_from_3(*b + 1) | 0xFF000000;
328+ ut_ad(val < 0xFFFE0000);
329+ *b += 4;
280330 }
281331
282332 return (static_cast<ib_uint32_t>(val));
@@ -457,13 +507,30 @@ ib_uint64_t mach_read_next_much_compressed(const byte **b) {
457507 val = mach_read_from_4(*b) & 0xFFFFFFF;
458508 ut_ad(val > 0x1FFFFF);
459509 *b += 4;
460- } else if (val == 0xF0 ) {
510+ } else if (val < 0xF8 ) {
461511 /* 11110000 nnnnnnnn nnnnnnnn nnnnnnnn nnnnnnnn (32 bits) */
512+ ut_ad(val == 0xF0);
462513 val = mach_read_from_4(*b + 1);
514+ /* this can treat not-extended format also. */
463515 ut_ad(val > 0xFFFFFFF);
464516 *b += 5;
517+ } else if (val < 0xFC) {
518+ /* 111110nn nnnnnnnn (10 bits) (extended) */
519+ val = (mach_read_from_2(*b) & 0x3FF) | 0xFFFFFC00;
520+ *b += 2;
521+ } else if (val < 0xFE) {
522+ /* 1111110n nnnnnnnn nnnnnnnn (17 bits) (extended) */
523+ val = (mach_read_from_3(*b) & 0x1FFFF) | 0xFFFE0000;
524+ ut_ad(val < 0xFFFFFC00);
525+ *b += 3;
526+ } else if (val == 0xFE) {
527+ /* 11111110 nnnnnnnn nnnnnnnn nnnnnnnn (24 bits) (extended) */
528+ ut_ad(val == 0xFE);
529+ val = mach_read_from_3(*b + 1) | 0xFF000000;
530+ ut_ad(val < 0xFFFE0000);
531+ *b += 4;
465532 } else {
466- /* 11111111 followed by up to 64 bits */
533+ /* 11111111 followed by up to 80 bits */
467534 ut_ad(val == 0xFF);
468535 ++*b;
469536 val = mach_read_next_compressed(b);
0 commit comments