3 memcached_return
memcached_string_check(memcached_string_st
*string
, size_t need
)
5 if (need
> (size_t)(string
->current_size
- (size_t)(string
->end
- string
->string
)))
7 size_t current_offset
= string
->end
- string
->string
;
9 size_t adjust
= (need
- (size_t)(string
->current_size
- (size_t)(string
->end
- string
->string
))) / string
->block_size
;
13 new_value
= (char *)realloc(string
->string
,
14 sizeof(char) * ((adjust
* string
->block_size
) + string
->current_size
));
16 if (new_value
== NULL
)
17 return MEMCACHED_MEMORY_ALLOCATION_FAILURE
;
19 string
->string
= new_value
;
20 string
->end
= string
->string
+ current_offset
;
22 string
->current_size
+= (string
->block_size
* adjust
);
24 /* We zero the block structure we just realloced */
25 memset((string
->string
+ current_offset
), 0,
26 sizeof(char) * string
->block_size
);
29 return MEMCACHED_SUCCESS
;
32 memcached_string_st
*memcached_string_create(memcached_st
*ptr
, size_t initial_size
)
35 memcached_string_st
*string
;
37 /* Saving malloc calls :) */
38 string
= (memcached_string_st
*)malloc(sizeof(memcached_string_st
));
41 string
->end
= string
->string
;
42 memset(string
, 0, sizeof(memcached_string_st
));
43 string
->block_size
= initial_size
;
45 rc
= memcached_string_check(string
, initial_size
);
46 if (rc
!= MEMCACHED_SUCCESS
)
52 WATCHPOINT_ASSERT(string
->string
== string
->end
);
57 memcached_return
memcached_string_append_character(memcached_st
*ptr
,
58 memcached_string_st
*string
,
63 rc
= memcached_string_check(string
, 1);
65 if (rc
!= MEMCACHED_SUCCESS
)
71 return MEMCACHED_SUCCESS
;
74 memcached_return
memcached_string_append(memcached_st
*ptr
, memcached_string_st
*string
,
75 char *value
, size_t length
)
79 rc
= memcached_string_check(string
, length
);
81 if (rc
!= MEMCACHED_SUCCESS
)
84 WATCHPOINT_ASSERT(string
->string
);
85 WATCHPOINT_ASSERT(string
->end
>= string
->string
&& string
->end
<= string
->string
+ string
->current_size
);
87 memcpy(string
->end
, value
, length
);
90 return MEMCACHED_SUCCESS
;
93 size_t memcached_string_backspace(memcached_st
*ptr
, memcached_string_st
*string
, size_t remove
)
95 if (string
->end
- string
->string
> remove
)
99 difference
= string
->end
- string
->string
;
100 string
->end
= string
->string
;
104 string
->end
-= remove
;
109 memcached_return
memcached_string_reset(memcached_st
*ptr
, memcached_string_st
*string
)
111 string
->end
= string
->string
;
113 return MEMCACHED_SUCCESS
;
116 void memcached_string_free(memcached_st
*ptr
, memcached_string_st
*string
)
118 free(string
->string
);