mySQL 5.0.11 sources for tomato
[tomato.git] / release / src / router / mysql / storage / innodb_plugin / mach / mach0data.c
blob2521ac36fde1af78b00e5e13a5a58e036333aeed
1 /*****************************************************************************
3 Copyright (c) 1995, 2009, Innobase Oy. All Rights Reserved.
5 This program is free software; you can redistribute it and/or modify it under
6 the terms of the GNU General Public License as published by the Free Software
7 Foundation; version 2 of the License.
9 This program is distributed in the hope that it will be useful, but WITHOUT
10 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11 FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
13 You should have received a copy of the GNU General Public License along with
14 this program; if not, write to the Free Software Foundation, Inc.,
15 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
17 *****************************************************************************/
19 /******************************************************************//**
20 @file mach/mach0data.c
21 Utilities for converting data from the database file
22 to the machine format.
24 Created 11/28/1995 Heikki Tuuri
25 ***********************************************************************/
27 #include "mach0data.h"
29 #ifdef UNIV_NONINL
30 #include "mach0data.ic"
31 #endif
33 /*********************************************************//**
34 Reads a ulint in a compressed form if the log record fully contains it.
35 @return pointer to end of the stored field, NULL if not complete */
36 UNIV_INTERN
37 byte*
38 mach_parse_compressed(
39 /*==================*/
40 byte* ptr, /*!< in: pointer to buffer from where to read */
41 byte* end_ptr,/*!< in: pointer to end of the buffer */
42 ulint* val) /*!< out: read value (< 2^32) */
44 ulint flag;
46 ut_ad(ptr && end_ptr && val);
48 if (ptr >= end_ptr) {
50 return(NULL);
53 flag = mach_read_from_1(ptr);
55 if (flag < 0x80UL) {
56 *val = flag;
57 return(ptr + 1);
59 } else if (flag < 0xC0UL) {
60 if (end_ptr < ptr + 2) {
61 return(NULL);
64 *val = mach_read_from_2(ptr) & 0x7FFFUL;
66 return(ptr + 2);
68 } else if (flag < 0xE0UL) {
69 if (end_ptr < ptr + 3) {
70 return(NULL);
73 *val = mach_read_from_3(ptr) & 0x3FFFFFUL;
75 return(ptr + 3);
76 } else if (flag < 0xF0UL) {
77 if (end_ptr < ptr + 4) {
78 return(NULL);
81 *val = mach_read_from_4(ptr) & 0x1FFFFFFFUL;
83 return(ptr + 4);
84 } else {
85 ut_ad(flag == 0xF0UL);
87 if (end_ptr < ptr + 5) {
88 return(NULL);
91 *val = mach_read_from_4(ptr + 1);
92 return(ptr + 5);
96 /*********************************************************//**
97 Reads a dulint in a compressed form if the log record fully contains it.
98 @return pointer to end of the stored field, NULL if not complete */
99 UNIV_INTERN
100 byte*
101 mach_dulint_parse_compressed(
102 /*=========================*/
103 byte* ptr, /*!< in: pointer to buffer from where to read */
104 byte* end_ptr,/*!< in: pointer to end of the buffer */
105 dulint* val) /*!< out: read value */
107 ulint high;
108 ulint low;
109 ulint size;
111 ut_ad(ptr && end_ptr && val);
113 if (end_ptr < ptr + 5) {
115 return(NULL);
118 high = mach_read_compressed(ptr);
120 size = mach_get_compressed_size(high);
122 ptr += size;
124 if (end_ptr < ptr + 4) {
126 return(NULL);
129 low = mach_read_from_4(ptr);
131 *val = ut_dulint_create(high, low);
133 return(ptr + 4);