b79fc161f1149bb9645965c6cc0658173deb9f47
[m6w6/libmemcached] / lib / memcached_string.c
1 #include "common.h"
2
3 memcached_return memcached_string_check(memcached_string_st *string, size_t need)
4 {
5 if (need > (size_t)(string->current_size - (size_t)(string->end - string->string)))
6 {
7 size_t current_offset= string->end - string->string;
8 char *new_value;
9 size_t adjust= (need - (size_t)(string->current_size - (size_t)(string->end - string->string))) / string->block_size;
10
11 adjust++;
12
13 new_value= (char *)realloc(string->string,
14 sizeof(char) * ((adjust * string->block_size) + string->current_size));
15
16 if (new_value == NULL)
17 return MEMCACHED_MEMORY_ALLOCATION_FAILURE;
18
19 string->string= new_value;
20 string->end= string->string + current_offset;
21
22 string->current_size+= (string->block_size * adjust);
23
24 /* We zero the block structure we just realloced */
25 memset((string->string + current_offset), 0,
26 sizeof(char) * string->block_size);
27 }
28
29 return MEMCACHED_SUCCESS;
30 }
31
32 memcached_string_st *memcached_string_create(memcached_st *ptr, size_t initial_size)
33 {
34 memcached_return rc;
35 memcached_string_st *string;
36
37 /* Saving malloc calls :) */
38 string= (memcached_string_st *)malloc(sizeof(memcached_string_st));
39 if (!string)
40 return NULL;
41 string->end= string->string;
42 memset(string, 0, sizeof(memcached_string_st));
43 string->block_size= initial_size;
44
45 rc= memcached_string_check(string, initial_size);
46 if (rc != MEMCACHED_SUCCESS)
47 {
48 free(string);
49 return NULL;
50 }
51
52 assert(string->string == string->end);
53
54 return string;
55 }
56
57 memcached_return memcached_string_append_character(memcached_st *ptr,
58 memcached_string_st *string,
59 char character)
60 {
61 memcached_return rc;
62
63 rc= memcached_string_check(string, 1);
64
65 if (rc != MEMCACHED_SUCCESS)
66 return rc;
67
68 *string->end= ' ';
69 string->end++;
70
71 return MEMCACHED_SUCCESS;
72 }
73
74 memcached_return memcached_string_append(memcached_st *ptr, memcached_string_st *string,
75 char *value, size_t length)
76 {
77 memcached_return rc;
78
79 rc= memcached_string_check(string, length);
80
81 if (rc != MEMCACHED_SUCCESS)
82 return rc;
83
84 assert(string->string);
85 assert(string->end >= string->string && string->end <= string->string + string->current_size);
86
87 memcpy(string->end, value, length);
88 string->end+= length;
89
90 return MEMCACHED_SUCCESS;
91 }
92
93 size_t memcached_string_backspace(memcached_st *ptr, memcached_string_st *string, size_t remove)
94 {
95 if (string->end - string->string > remove)
96 {
97 size_t difference;
98
99 difference= string->end - string->string;
100 string->end= string->string;
101
102 return difference;
103 }
104 string->end-= remove;
105
106 return remove;
107 }
108
109 memcached_return memcached_string_reset(memcached_st *ptr, memcached_string_st *string)
110 {
111 string->end= string->string;
112
113 return MEMCACHED_SUCCESS;
114 }
115
116 void memcached_string_free(memcached_st *ptr, memcached_string_st *string)
117 {
118 free(string->string);
119 free(string);
120 }