summaryrefslogtreecommitdiff
path: root/mysys/string.c
diff options
context:
space:
mode:
Diffstat (limited to 'mysys/string.c')
-rw-r--r--mysys/string.c18
1 files changed, 14 insertions, 4 deletions
diff --git a/mysys/string.c b/mysys/string.c
index 0696c72b922..96a503c1179 100644
--- a/mysys/string.c
+++ b/mysys/string.c
@@ -48,6 +48,7 @@ my_bool init_dynamic_string(DYNAMIC_STRING *str, const char *init_str,
DBUG_RETURN(FALSE);
}
+
my_bool dynstr_set(DYNAMIC_STRING *str, const char *init_str)
{
uint length;
@@ -72,6 +73,7 @@ my_bool dynstr_set(DYNAMIC_STRING *str, const char *init_str)
DBUG_RETURN(FALSE);
}
+
my_bool dynstr_realloc(DYNAMIC_STRING *str, ulong additional_size)
{
DBUG_ENTER("dynstr_realloc");
@@ -90,11 +92,17 @@ my_bool dynstr_realloc(DYNAMIC_STRING *str, ulong additional_size)
my_bool dynstr_append(DYNAMIC_STRING *str, const char *append)
{
+ return dynstr_append_mem(str,append,strlen(append));
+}
+
+
+my_bool dynstr_append_mem(DYNAMIC_STRING *str, const char *append,
+ uint length)
+{
char *new_ptr;
- uint length=(uint) strlen(append)+1;
- if (str->length+length > str->max_length)
+ if (str->length+length >= str->max_length)
{
- uint new_length=(str->length+length+str->alloc_increment-1)/
+ uint new_length=(str->length+length+str->alloc_increment)/
str->alloc_increment;
new_length*=str->alloc_increment;
if (!(new_ptr=(char*) my_realloc(str->str,new_length,MYF(MY_WME))))
@@ -103,10 +111,12 @@ my_bool dynstr_append(DYNAMIC_STRING *str, const char *append)
str->max_length=new_length;
}
memcpy(str->str + str->length,append,length);
- str->length+=length-1;
+ str->length+=length;
+ str->str[str->length]=0; /* Safety for C programs */
return FALSE;
}
+
void dynstr_free(DYNAMIC_STRING *str)
{
if (str->str)