array.c
上传用户:jmzj888
上传日期:2007-01-02
资源大小:220k
文件大小:4k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright Abandoned 1996 TCX DataKonsult AB & Monty Program KB & Detron HB
  2.    This file is public domain and comes with NO WARRANTY of any kind */
  3. /*
  4.   Code for handling arrays with can grow dynamicly.
  5.   Copyright Monty Program KB.
  6.   By monty.
  7. */
  8. #include "mysys_priv.h"
  9. #include "m_string.h"
  10. /*
  11.   Initiate array and alloc space for init_alloc elements. Array is usable
  12.   even if space allocation failed
  13. */
  14. my_bool init_dynamic_array(DYNAMIC_ARRAY *array, uint element_size, uint init_alloc, uint alloc_increment)
  15. {
  16.   DBUG_ENTER("init_dynamic_array");
  17.   if (!alloc_increment)
  18.     alloc_increment=max((8192-MALLOC_OVERHEAD)/element_size,16);
  19.   if (!init_alloc)
  20.     init_alloc=alloc_increment;
  21.   array->elements=0;
  22.   array->max_element=init_alloc;
  23.   array->alloc_increment=alloc_increment;
  24.   array->size_of_element=element_size;
  25.   if (!(array->buffer=(char*) my_malloc(element_size*init_alloc,MYF(MY_WME))))
  26.   {
  27.     array->max_element=0;
  28.     DBUG_RETURN(TRUE);
  29.   }
  30.   DBUG_RETURN(FALSE);
  31. }
  32. my_bool insert_dynamic(DYNAMIC_ARRAY *array, gptr element)
  33. {
  34.   gptr buffer;
  35.   if (array->elements == array->max_element)
  36.   { /* Call only when nessesary */
  37.     if (!(buffer=alloc_dynamic(array)))
  38.       return TRUE;
  39.   }
  40.   else
  41.   {
  42.     buffer=array->buffer+(array->elements * array->size_of_element);
  43.     array->elements++;
  44.   }
  45.   memcpy(buffer,element,(size_t) array->size_of_element);
  46.   return FALSE;
  47. }
  48. /* Alloc room for one element */
  49. byte *alloc_dynamic(DYNAMIC_ARRAY *array)
  50. {
  51.   if (array->elements == array->max_element)
  52.   {
  53.     char *new_ptr;
  54.     if (!(new_ptr=(char*) my_realloc(array->buffer,(array->max_element+
  55.      array->alloc_increment)*
  56.      array->size_of_element,
  57.      MYF(MY_WME | MY_ALLOW_ZERO_PTR))))
  58.       return 0;
  59.     array->buffer=new_ptr;
  60.     array->max_element+=array->alloc_increment;
  61.   }
  62.   return array->buffer+(array->elements++ * array->size_of_element);
  63. }
  64. /* remove last element from array and return it */
  65. byte *pop_dynamic(DYNAMIC_ARRAY *array)
  66. {
  67.   if (array->elements)
  68.     return array->buffer+(--array->elements * array->size_of_element);
  69.   return 0;
  70. }
  71. my_bool set_dynamic(DYNAMIC_ARRAY *array, gptr element, uint index)
  72. {
  73.   if (index >= array->elements)
  74.   {
  75.     if (index >= array->max_element)
  76.     {
  77.       uint size;
  78.       char *new_ptr;
  79.       size=(index+array->alloc_increment)/array->alloc_increment;
  80.       size*= array->alloc_increment;
  81.       if (!(new_ptr=(char*) my_realloc(array->buffer,size*
  82.        array->size_of_element,
  83.        MYF(MY_WME | MY_ALLOW_ZERO_PTR))))
  84. return TRUE;
  85.       array->buffer=new_ptr;
  86.       array->max_element=size;
  87.     }
  88.     bzero((gptr) (array->buffer+array->elements*array->size_of_element),
  89.   (index - array->elements)*array->size_of_element);
  90.     array->elements=index+1;
  91.   }
  92.   memcpy(array->buffer+(index * array->size_of_element),element,
  93.  (size_t) array->size_of_element);
  94.   return FALSE;
  95. }
  96. void get_dynamic(DYNAMIC_ARRAY *array, gptr element, uint index)
  97. {
  98.   if (index >= array->elements)
  99.   {
  100.     DBUG_PRINT("warning",("To big array index: %d, array size is %d",
  101.   index,array->elements));
  102.     bzero(element,array->size_of_element);
  103.     return;
  104.   }
  105.   memcpy(element,array->buffer+index*array->size_of_element,
  106.  (size_t) array->size_of_element);
  107. }
  108. void delete_dynamic(DYNAMIC_ARRAY *array)
  109. {
  110.   if (array->buffer)
  111.   {
  112.     my_free(array->buffer,MYF(MY_WME));
  113.     array->buffer=0;
  114.     array->elements=array->max_element=0;
  115.   }
  116. }
  117. void freeze_size(DYNAMIC_ARRAY *array)
  118. {
  119.   uint elements=max(array->elements,1);
  120.   if (array->buffer && array->max_element != elements)
  121.   {
  122.     array->buffer=(char*) my_realloc(array->buffer,
  123.      elements*array->size_of_element,
  124.      MYF(MY_WME));
  125.     array->max_element=elements;
  126.   }
  127. }