1
/*****************************************************************************
3
Copyright (C) 1996, 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., 51 Franklin
15
St, Fifth Floor, Boston, MA 02110-1301 USA
17
*****************************************************************************/
19
/**************************************************//**
20
@file include/dyn0dyn.ic
1
/******************************************************
21
2
The dynamically allocated array
23
6
Created 2/5/1996 Heikki Tuuri
24
7
*******************************************************/
26
/** Value of dyn_block_struct::magic_n */
27
9
#define DYN_BLOCK_MAGIC_N 375767
28
/** Flag for dyn_block_struct::used that indicates a full block */
29
10
#define DYN_BLOCK_FULL_FLAG 0x1000000UL
31
/************************************************************//**
32
Adds a new block to a dyn array.
33
@return created block */
12
/****************************************************************
13
Adds a new block to a dyn array. */
36
16
dyn_array_add_block(
37
17
/*================*/
38
dyn_array_t* arr); /*!< in: dyn array */
41
/************************************************************//**
18
/* out: created block */
19
dyn_array_t* arr); /* in: dyn array */
22
/****************************************************************
42
23
Gets the first block in a dyn array. */
45
26
dyn_array_get_first_block(
46
27
/*======================*/
47
dyn_array_t* arr) /*!< in: dyn array */
28
dyn_array_t* arr) /* in: dyn array */
52
/************************************************************//**
33
/****************************************************************
53
34
Gets the last block in a dyn array. */
56
37
dyn_array_get_last_block(
57
38
/*=====================*/
58
dyn_array_t* arr) /*!< in: dyn array */
39
dyn_array_t* arr) /* in: dyn array */
60
41
if (arr->heap == NULL) {
65
46
return(UT_LIST_GET_LAST(arr->base));
68
/********************************************************************//**
69
Gets the next block in a dyn array.
70
@return pointer to next, NULL if end of list */
49
/************************************************************************
50
Gets the next block in a dyn array. */
73
53
dyn_array_get_next_block(
74
54
/*=====================*/
75
dyn_array_t* arr, /*!< in: dyn array */
76
dyn_block_t* block) /*!< in: dyn array block */
55
/* out: pointer to next, NULL if end of list */
56
dyn_array_t* arr, /* in: dyn array */
57
dyn_block_t* block) /* in: dyn array block */
78
59
ut_ad(arr && block);
86
67
return(UT_LIST_GET_NEXT(list, block));
89
/********************************************************************//**
90
Gets the number of used bytes in a dyn array block.
91
@return number of bytes used */
70
/************************************************************************
71
Gets the number of used bytes in a dyn array block. */
94
74
dyn_block_get_used(
95
75
/*===============*/
96
dyn_block_t* block) /*!< in: dyn array block */
76
/* out: number of bytes used */
77
dyn_block_t* block) /* in: dyn array block */
100
81
return((block->used) & ~DYN_BLOCK_FULL_FLAG);
103
/********************************************************************//**
104
Gets pointer to the start of data in a dyn array block.
105
@return pointer to data */
84
/************************************************************************
85
Gets pointer to the start of data in a dyn array block. */
108
88
dyn_block_get_data(
109
89
/*===============*/
110
dyn_block_t* block) /*!< in: dyn array block */
90
/* out: pointer to data */
91
dyn_block_t* block) /* in: dyn array block */
114
95
return(block->data);
117
/*********************************************************************//**
118
Initializes a dynamic array.
119
@return initialized dyn array */
98
/*************************************************************************
99
Initializes a dynamic array. */
122
102
dyn_array_create(
123
103
/*=============*/
124
dyn_array_t* arr) /*!< in: pointer to a memory buffer of
104
/* out: initialized dyn array */
105
dyn_array_t* arr) /* in: pointer to a memory buffer of
125
106
size sizeof(dyn_array_t) */
142
/************************************************************//**
123
/****************************************************************
143
124
Frees a dynamic array. */
148
dyn_array_t* arr) /*!< in: dyn array */
129
dyn_array_t* arr) /* in: dyn array */
150
131
if (arr->heap != NULL) {
151
132
mem_heap_free(arr->heap);
159
/*********************************************************************//**
140
/*************************************************************************
160
141
Makes room on top of a dyn array and returns a pointer to the added element.
161
The caller must copy the element to the pointer returned.
162
@return pointer to the element */
142
The caller must copy the element to the pointer returned. */
167
dyn_array_t* arr, /*!< in: dynamic array */
168
ulint size) /*!< in: size in bytes of the element */
147
/* out: pointer to the element */
148
dyn_array_t* arr, /* in: dynamic array */
149
ulint size) /* in: size in bytes of the element */
170
151
dyn_block_t* block;
196
177
return((block->data) + used);
199
/*********************************************************************//**
180
/*************************************************************************
200
181
Makes room on top of a dyn array and returns a pointer to a buffer in it.
201
182
After copying the elements, the caller must close the buffer using
203
@return pointer to the buffer */
208
dyn_array_t* arr, /*!< in: dynamic array */
209
ulint size) /*!< in: size in bytes of the buffer; MUST be
188
/* out: pointer to the buffer */
189
dyn_array_t* arr, /* in: dynamic array */
190
ulint size) /* in: size in bytes of the buffer; MUST be
210
191
smaller than DYN_ARRAY_DATA_SIZE! */
212
193
dyn_block_t* block;
242
223
return((block->data) + used);
245
/*********************************************************************//**
226
/*************************************************************************
246
227
Closes the buffer returned by dyn_array_open. */
251
dyn_array_t* arr, /*!< in: dynamic array */
252
byte* ptr) /*!< in: buffer space from ptr up was not used */
232
dyn_array_t* arr, /* in: dynamic array */
233
byte* ptr) /* in: buffer space from ptr up was not used */
254
235
dyn_block_t* block;
272
/************************************************************//**
273
Returns pointer to an element in dyn array.
274
@return pointer to element */
253
/****************************************************************
254
Returns pointer to an element in dyn array. */
277
257
dyn_array_get_element(
278
258
/*==================*/
279
dyn_array_t* arr, /*!< in: dyn array */
280
ulint pos) /*!< in: position of element as bytes
259
/* out: pointer to element */
260
dyn_array_t* arr, /* in: dyn array */
261
ulint pos) /* in: position of element as bytes
281
262
from array start */
283
264
dyn_block_t* block;
307
288
return(block->data + pos);
310
/************************************************************//**
311
Returns the size of stored data in a dyn array.
312
@return data size in bytes */
291
/****************************************************************
292
Returns the size of stored data in a dyn array. */
315
295
dyn_array_get_data_size(
316
296
/*====================*/
317
dyn_array_t* arr) /*!< in: dyn array */
297
/* out: data size in bytes */
298
dyn_array_t* arr) /* in: dyn array */
319
300
dyn_block_t* block;
341
/********************************************************//**
322
/************************************************************
342
323
Pushes n bytes to a dyn array. */
347
dyn_array_t* arr, /*!< in: dyn array */
348
const byte* str, /*!< in: string to write */
349
ulint len) /*!< in: string length */
328
dyn_array_t* arr, /* in: dyn array */
329
const byte* str, /* in: string to write */
330
ulint len) /* in: string length */