3 memcached_return
memcached_string_check(memcached_string_st
*string
, size_t need
)
5 if (need
&& need
> (size_t)(string
->current_size
- (size_t)(string
->end
- string
->string
)))
7 size_t current_offset
= string
->end
- string
->string
;
12 /* This is the block multiplier. To keep it larger and surive division errors we must round it up */
13 adjust
= (need
- (size_t)(string
->current_size
- (size_t)(string
->end
- string
->string
))) / string
->block_size
;
16 new_size
= sizeof(char) * (size_t)((adjust
* string
->block_size
) + string
->current_size
);
17 /* Test for overflow */
19 return MEMCACHED_MEMORY_ALLOCATION_FAILURE
;
21 if (string
->root
->call_realloc
)
22 new_value
= (char *)string
->root
->call_realloc(string
->root
, string
->string
, new_size
);
24 new_value
= (char *)realloc(string
->string
, new_size
);
26 if (new_value
== NULL
)
27 return MEMCACHED_MEMORY_ALLOCATION_FAILURE
;
29 string
->string
= new_value
;
30 string
->end
= string
->string
+ current_offset
;
32 string
->current_size
+= (string
->block_size
* adjust
);
35 return MEMCACHED_SUCCESS
;
38 memcached_string_st
*memcached_string_create(memcached_st
*ptr
, memcached_string_st
*string
, size_t initial_size
)
42 /* Saving malloc calls :) */
45 memset(string
, 0, sizeof(memcached_string_st
));
46 string
->is_allocated
= MEMCACHED_NOT_ALLOCATED
;
51 string
= (memcached_string_st
*)ptr
->call_malloc(ptr
, sizeof(memcached_string_st
));
53 string
= (memcached_string_st
*)malloc(sizeof(memcached_string_st
));
57 memset(string
, 0, sizeof(memcached_string_st
));
58 string
->is_allocated
= MEMCACHED_ALLOCATED
;
60 string
->block_size
= MEMCACHED_BLOCK_SIZE
;
63 rc
= memcached_string_check(string
, initial_size
);
64 if (rc
!= MEMCACHED_SUCCESS
)
67 ptr
->call_free(ptr
, string
);
74 WATCHPOINT_ASSERT(string
->string
== string
->end
);
79 memcached_return
memcached_string_append_character(memcached_string_st
*string
,
84 WATCHPOINT_ASSERT(string
->is_allocated
!= MEMCACHED_USED
);
86 rc
= memcached_string_check(string
, 1);
88 if (rc
!= MEMCACHED_SUCCESS
)
94 return MEMCACHED_SUCCESS
;
97 memcached_return
memcached_string_append(memcached_string_st
*string
,
98 char *value
, size_t length
)
102 WATCHPOINT_ASSERT(string
->is_allocated
!= MEMCACHED_USED
);
104 rc
= memcached_string_check(string
, length
);
106 if (rc
!= MEMCACHED_SUCCESS
)
109 WATCHPOINT_ASSERT(length
<= string
->current_size
);
110 WATCHPOINT_ASSERT(string
->string
);
111 WATCHPOINT_ASSERT(string
->end
>= string
->string
);
113 memcpy(string
->end
, value
, length
);
114 string
->end
+= length
;
116 return MEMCACHED_SUCCESS
;
119 size_t memcached_string_backspace(memcached_string_st
*string
, size_t remove
)
121 WATCHPOINT_ASSERT(string
->is_allocated
!= MEMCACHED_USED
);
123 if (string
->end
- string
->string
> remove
)
127 difference
= string
->end
- string
->string
;
128 string
->end
= string
->string
;
132 string
->end
-= remove
;
137 char *memcached_string_c_copy(memcached_string_st
*string
)
141 WATCHPOINT_ASSERT(string
->is_allocated
!= MEMCACHED_USED
);
143 if (memcached_string_length(string
) == 0)
146 if (string
->root
->call_malloc
)
147 c_ptr
= (char *)string
->root
->call_malloc(string
->root
, (memcached_string_length(string
)+1) * sizeof(char));
149 c_ptr
= (char *)malloc((memcached_string_length(string
)+1) * sizeof(char));
154 memcpy(c_ptr
, memcached_string_value(string
), memcached_string_length(string
));
155 c_ptr
[memcached_string_length(string
)]= 0;
160 memcached_return
memcached_string_reset(memcached_string_st
*string
)
162 WATCHPOINT_ASSERT(string
->is_allocated
!= MEMCACHED_USED
);
163 string
->end
= string
->string
;
165 return MEMCACHED_SUCCESS
;
168 void memcached_string_free(memcached_string_st
*ptr
)
175 if (ptr
->root
->call_free
)
176 ptr
->root
->call_free(ptr
->root
, ptr
->string
);
181 if (ptr
->is_allocated
== MEMCACHED_ALLOCATED
)
183 if (ptr
->root
->call_free
)
184 ptr
->root
->call_free(ptr
->root
, ptr
);
189 ptr
->is_allocated
= MEMCACHED_USED
;