Kevin Dalley's patch for EOF
[awesomized/libmemcached] / lib / memcached_string.c
index 2bbda3fa1b8aee6be4e7199d48ef224f4d07d806..247fbe475dd0506794add134d0c15bb47f3096db 100644 (file)
@@ -27,10 +27,6 @@ memcached_return memcached_string_check(memcached_string_st *string, size_t need
     string->end= string->string + current_offset;
 
     string->current_size+= (string->block_size * adjust);
-
-    /* We zero the block structure we just realloced */
-    memset((string->string + current_offset), 0, 
-           sizeof(char) * string->block_size);
   }
 
   return MEMCACHED_SUCCESS;
@@ -74,6 +70,8 @@ memcached_return memcached_string_append_character(memcached_string_st *string,
 {
   memcached_return rc;
 
+  WATCHPOINT_ASSERT(string->is_allocated != MEMCACHED_USED);
+
   rc=  memcached_string_check(string, 1);
 
   if (rc != MEMCACHED_SUCCESS)
@@ -90,6 +88,8 @@ memcached_return memcached_string_append(memcached_string_st *string,
 {
   memcached_return rc;
 
+  WATCHPOINT_ASSERT(string->is_allocated != MEMCACHED_USED);
+
   rc= memcached_string_check(string, length);
 
   if (rc != MEMCACHED_SUCCESS)
@@ -107,6 +107,8 @@ memcached_return memcached_string_append(memcached_string_st *string,
 
 size_t memcached_string_backspace(memcached_string_st *string, size_t remove)
 {
+  WATCHPOINT_ASSERT(string->is_allocated != MEMCACHED_USED);
+
   if (string->end - string->string  > remove)
   {
     size_t difference;
@@ -124,26 +126,37 @@ size_t memcached_string_backspace(memcached_string_st *string, size_t remove)
 char *memcached_string_c_copy(memcached_string_st *string)
 {
   char *c_ptr;
-  c_ptr= (char *)malloc(memcached_string_length(string) * sizeof(char));
+
+  WATCHPOINT_ASSERT(string->is_allocated != MEMCACHED_USED);
+
+  c_ptr= (char *)malloc((memcached_string_length(string)+1) * sizeof(char));
   if (!c_ptr)
     return NULL;
 
   memcpy(c_ptr, memcached_string_value(string), memcached_string_length(string));
+  c_ptr[memcached_string_length(string)]= 0;
 
   return c_ptr;
 }
 
 memcached_return memcached_string_reset(memcached_string_st *string)
 {
+  WATCHPOINT_ASSERT(string->is_allocated != MEMCACHED_USED);
   string->end= string->string;
   
   return MEMCACHED_SUCCESS;
 }
 
-void memcached_string_free(memcached_string_st *string)
+void memcached_string_free(memcached_string_st *ptr)
 {
-  if (string->string)
-    free(string->string);
-  if (string->is_allocated == MEMCACHED_ALLOCATED)
-    free(string);
+  if (ptr == NULL)
+    return;
+
+  if (ptr->string)
+    free(ptr->string);
+
+  if (ptr->is_allocated == MEMCACHED_ALLOCATED)
+    free(ptr);
+  else
+    ptr->is_allocated= MEMCACHED_USED;
 }