string.c
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:3k
源码类别:

MySQL数据库

开发平台:

Visual C++

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