home *** CD-ROM | disk | FTP | other *** search
/ Chip 2001 January / Chip_2001-01_cd1.bin / tema / mysql / mysql-3.23.28g-win-source.exe / mysys / string.c < prev    next >
C/C++ Source or Header  |  2000-08-31  |  3KB  |  118 lines

  1. /* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
  2.    
  3.    This library is free software; you can redistribute it and/or
  4.    modify it under the terms of the GNU Library General Public
  5.    License as published by the Free Software Foundation; either
  6.    version 2 of the License, or (at your option) any later version.
  7.    
  8.    This library is distributed in the hope that it will be useful,
  9.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  11.    Library General Public License for more details.
  12.    
  13.    You should have received a copy of the GNU Library General Public
  14.    License along with this library; if not, write to the Free
  15.    Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
  16.    MA 02111-1307, USA */
  17.  
  18. /*
  19.   Code for handling strings with can grow dynamicly.
  20.   Copyright Monty Program KB.
  21.   By monty.
  22. */
  23.  
  24. #include "mysys_priv.h"
  25. #include <m_string.h>
  26.  
  27. my_bool init_dynamic_string(DYNAMIC_STRING *str, const char *init_str,
  28.                 uint init_alloc, uint alloc_increment)
  29. {
  30.   uint length;
  31.   DBUG_ENTER("init_dynamic_string");
  32.  
  33.   if (!alloc_increment)
  34.     alloc_increment=128;
  35.   length=1;
  36.   if (init_str && (length= (uint) strlen(init_str)+1) < init_alloc)
  37.     init_alloc=((length+alloc_increment-1)/alloc_increment)*alloc_increment;
  38.   if (!init_alloc)
  39.     init_alloc=alloc_increment;
  40.  
  41.   if (!(str->str=(char*) my_malloc(init_alloc,MYF(MY_WME))))
  42.     DBUG_RETURN(TRUE);
  43.   str->length=length-1;
  44.   if (init_str)
  45.     memcpy(str->str,init_str,length);
  46.   str->max_length=init_alloc;
  47.   str->alloc_increment=alloc_increment;
  48.   DBUG_RETURN(FALSE);
  49. }
  50.  
  51. my_bool dynstr_set(DYNAMIC_STRING *str, const char *init_str)
  52. {
  53.   uint length;
  54.   DBUG_ENTER("dynstr_set");
  55.  
  56.   if (init_str && (length= (uint) strlen(init_str)+1) > str->max_length)
  57.   {
  58.     str->max_length=((length+str->alloc_increment-1)/str->alloc_increment)*
  59.       str->alloc_increment;
  60.     if (!str->max_length)
  61.       str->max_length=str->alloc_increment;
  62.     if (!(str->str=(char*) my_realloc(str->str,str->max_length,MYF(MY_WME))))
  63.       DBUG_RETURN(TRUE);
  64.   }
  65.   if (init_str)
  66.   {
  67.     str->length=length-1;
  68.     memcpy(str->str,init_str,length);
  69.   }
  70.   else
  71.     str->length=0;
  72.   DBUG_RETURN(FALSE);
  73. }
  74.  
  75. my_bool dynstr_realloc(DYNAMIC_STRING *str, ulong additional_size)
  76. {
  77.   DBUG_ENTER("dynstr_realloc");
  78.  
  79.   if (!additional_size) DBUG_RETURN(FALSE);
  80.   if (str->length + additional_size > str->max_length)
  81.   {
  82.     str->max_length=((str->length + additional_size+str->alloc_increment-1)/
  83.              str->alloc_increment)*str->alloc_increment;
  84.     if (!(str->str=(char*) my_realloc(str->str,str->max_length,MYF(MY_WME))))
  85.       DBUG_RETURN(TRUE);
  86.   }
  87.   DBUG_RETURN(FALSE);
  88. }
  89.  
  90.  
  91. my_bool dynstr_append(DYNAMIC_STRING *str, const char *append)
  92. {
  93.   char *new_ptr;
  94.   uint length=(uint) strlen(append)+1;
  95.   if (str->length+length > str->max_length)
  96.   {
  97.     uint new_length=(str->length+length+str->alloc_increment-1)/
  98.       str->alloc_increment;
  99.     new_length*=str->alloc_increment;
  100.     if (!(new_ptr=(char*) my_realloc(str->str,new_length,MYF(MY_WME))))
  101.       return TRUE;
  102.     str->str=new_ptr;
  103.     str->max_length=new_length;
  104.   }
  105.   memcpy(str->str + str->length,append,length);
  106.   str->length+=length-1;
  107.   return FALSE;
  108. }
  109.  
  110. void dynstr_free(DYNAMIC_STRING *str)
  111. {
  112.   if (str->str)
  113.   {
  114.     my_free(str->str,MYF(MY_WME));
  115.     str->str=0;
  116.   }
  117. }
  118.