diff options
Diffstat (limited to 'innobase/mach/mach0data.c')
-rw-r--r-- | innobase/mach/mach0data.c | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/innobase/mach/mach0data.c b/innobase/mach/mach0data.c new file mode 100644 index 00000000000..336ce106a75 --- /dev/null +++ b/innobase/mach/mach0data.c @@ -0,0 +1,119 @@ +/********************************************************************** +Utilities for converting data from the database file +to the machine format. + +(c) 1995 Innobase Oy + +Created 11/28/1995 Heikki Tuuri +***********************************************************************/ + +#include "mach0data.h" + +#ifdef UNIV_NONINL +#include "mach0data.ic" +#endif + +/************************************************************* +Reads a ulint in a compressed form if the log record fully contains it. */ + +byte* +mach_parse_compressed( +/*==================*/ + /* out: pointer to end of the stored field, NULL if + not complete */ + byte* ptr, /* in: pointer to buffer from where to read */ + byte* end_ptr,/* in: pointer to end of the buffer */ + ulint* val) /* out: read value (< 2^32) */ +{ + ulint flag; + + ut_ad(ptr && end_ptr && val); + + if (ptr >= end_ptr) { + + return(NULL); + } + + flag = mach_read_from_1(ptr); + + if (flag < 0x80) { + *val = flag; + return(ptr + 1); + + } else if (flag < 0xC0) { + if (end_ptr < ptr + 2) { + return(NULL); + } + + *val = mach_read_from_2(ptr) & 0x7FFF; + + return(ptr + 2); + + } else if (flag < 0xE0) { + if (end_ptr < ptr + 3) { + return(NULL); + } + + *val = mach_read_from_3(ptr) & 0x3FFFFF; + + return(ptr + 3); + } else if (flag < 0xF0) { + if (end_ptr < ptr + 4) { + return(NULL); + } + + *val = mach_read_from_4(ptr) & 0x1FFFFFFF; + + return(ptr + 4); + } else { + ut_ad(flag == 0xF0); + + if (end_ptr < ptr + 5) { + return(NULL); + } + + *val = mach_read_from_4(ptr + 1); + return(ptr + 5); + } +} + +/************************************************************* +Reads a dulint in a compressed form if the log record fully contains it. */ + +byte* +mach_dulint_parse_compressed( +/*=========================*/ + /* out: pointer to end of the stored field, NULL if + not complete */ + byte* ptr, /* in: pointer to buffer from where to read */ + byte* end_ptr,/* in: pointer to end of the buffer */ + dulint* val) /* out: read value */ +{ + ulint high; + ulint low; + ulint size; + + ut_ad(ptr && end_ptr && val); + + if (end_ptr < ptr + 5) { + + return(NULL); + } + + high = mach_read_compressed(ptr); + + size = mach_get_compressed_size(high); + + ptr += size; + + if (end_ptr < ptr + 4) { + + return(NULL); + } + + low = mach_read_from_4(ptr); + + *val = ut_dulint_create(high, low); + + return(ptr + 4); +} |