47dac67e62b103cb7591b79d5edc069272e84e80
[awesomized/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 WATCHPOINT;
80 rc= memcached_string_check(string, length);
81 WATCHPOINT;
82
83 if (rc != MEMCACHED_SUCCESS)
84 return rc;
85
86 WATCHPOINT;
87 assert(string->string);
88 assert(string->end >= string->string && string->end <= string->string + string->current_size);
89
90 WATCHPOINT;
91 memcpy(string->end, value, length);
92 WATCHPOINT;
93 string->end+= length;
94
95 return MEMCACHED_SUCCESS;
96 }
97
98 size_t memcached_string_backspace(memcached_st *ptr, memcached_string_st *string, size_t remove)
99 {
100 if (string->end - string->string > remove)
101 {
102 size_t difference;
103
104 difference= string->end - string->string;
105 string->end= string->string;
106
107 return difference;
108 }
109 string->end-= remove;
110
111 return remove;
112 }
113
114 memcached_return memcached_string_reset(memcached_st *ptr, memcached_string_st *string)
115 {
116 string->end= string->string;
117
118 return MEMCACHED_SUCCESS;
119 }
120
121 void memcached_string_free(memcached_st *ptr, memcached_string_st *string)
122 {
123 free(string->string);
124 free(string);
125 }