43
43
my_bool init_dynamic_array2(DYNAMIC_ARRAY *array, uint element_size,
44
void *init_buffer, uint init_alloc,
44
void *init_buffer, uint init_alloc,
45
45
uint alloc_increment CALLER_INFO_PROTO)
47
47
DBUG_ENTER("init_dynamic_array");
63
63
array->size_of_element=element_size;
64
64
if ((array->buffer= init_buffer))
65
65
DBUG_RETURN(FALSE);
66
if (!(array->buffer=(uchar*) my_malloc_ci(element_size*init_alloc,MYF(MY_WME))))
66
if (!(array->buffer=(uchar*) my_malloc_ci(element_size*init_alloc,
68
69
array->max_element=0;
71
72
DBUG_RETURN(FALSE);
74
75
my_bool init_dynamic_array(DYNAMIC_ARRAY *array, uint element_size,
76
77
uint alloc_increment CALLER_INFO_PROTO)
78
79
/* placeholder to preserve ABI */
79
return my_init_dynamic_array_ci(array, element_size, init_alloc,
80
return my_init_dynamic_array_ci(array, element_size, init_alloc,
142
144
array->alloc_increment) *
143
145
array->size_of_element,
146
memcpy(new_ptr, array->buffer,
148
memcpy(new_ptr, array->buffer,
147
149
array->elements * array->size_of_element);
150
if (!(new_ptr=(char*) my_realloc(array->buffer,(array->max_element+
151
array->alloc_increment)*
152
array->size_of_element,
153
MYF(MY_WME | MY_ALLOW_ZERO_PTR))))
151
else if (!(new_ptr=(char*)
152
my_realloc(array->buffer,(array->max_element+
153
array->alloc_increment)*
154
array->size_of_element,
155
MYF(MY_WME | MY_ALLOW_ZERO_PTR))))
155
157
array->buffer= (uchar*) new_ptr;
156
158
array->max_element+=array->alloc_increment;
158
return array->buffer+(array->elements++ * array->size_of_element);
160
DBUG_RETURN(array->buffer+(array->elements++ * array->size_of_element));
201
203
if (idx >= array->elements)
203
if (idx >= array->max_element)
207
size=(idx+array->alloc_increment)/array->alloc_increment;
208
size*= array->alloc_increment;
209
if (array->buffer == (uchar *)(array + 1))
212
In this senerio, the buffer is statically preallocated,
213
so we have to create an all-new malloc since we overflowed
215
if (!(new_ptr= (char *) my_malloc(size *
216
array->size_of_element,
219
memcpy(new_ptr, array->buffer,
220
array->elements * array->size_of_element);
223
if (!(new_ptr=(char*) my_realloc(array->buffer,size*
224
array->size_of_element,
225
MYF(MY_WME | MY_ALLOW_ZERO_PTR))))
227
array->buffer= (uchar*) new_ptr;
228
array->max_element=size;
205
if (idx >= array->max_element && allocate_dynamic(array, idx))
230
207
bzero((uchar*) (array->buffer+array->elements*array->size_of_element),
231
(idx - array->elements)*array->size_of_element);
208
(idx - array->elements)*array->size_of_element);
232
209
array->elements=idx+1;
234
211
memcpy(array->buffer+(idx * array->size_of_element),element,
235
(size_t) array->size_of_element);
212
(size_t) array->size_of_element);
218
Ensure that dynamic array has enough elements
223
max_elements Numbers of elements that is needed
226
Any new allocated element are NOT initialized
230
TRUE Allocation of new memory failed
233
my_bool allocate_dynamic(DYNAMIC_ARRAY *array, uint max_elements)
235
DBUG_ENTER("allocate_dynamic");
237
if (max_elements >= array->max_element)
241
size= (max_elements + array->alloc_increment)/array->alloc_increment;
242
size*= array->alloc_increment;
243
if (array->buffer == (uchar *)(array + 1))
246
In this senerio, the buffer is statically preallocated,
247
so we have to create an all-new malloc since we overflowed
249
if (!(new_ptr= (uchar *) my_malloc(size *
250
array->size_of_element,
253
memcpy(new_ptr, array->buffer,
254
array->elements * array->size_of_element);
256
else if (!(new_ptr= (uchar*) my_realloc(array->buffer,size*
257
array->size_of_element,
258
MYF(MY_WME | MY_ALLOW_ZERO_PTR))))
260
array->buffer= new_ptr;
261
array->max_element= size;
240
268
Get an element from array by given index
245
273
uchar* Element to be returned. If idx > elements contain zeroes.
246
idx Index of element wanted.
274
idx Index of element wanted.
249
277
void get_dynamic(DYNAMIC_ARRAY *array, uchar* element, uint idx)