X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=lib%2Fmemcached_string.c;h=47dac67e62b103cb7591b79d5edc069272e84e80;hb=375ad7d822a4bbc121a79ce7e927385d6be7f754;hp=63ffb59af03a152c9f5b5924f28100f873580bd3;hpb=a95ca4ad9c0f9d23c8a83bd337acdecc221021ef;p=m6w6%2Flibmemcached diff --git a/lib/memcached_string.c b/lib/memcached_string.c index 63ffb59a..47dac67e 100644 --- a/lib/memcached_string.c +++ b/lib/memcached_string.c @@ -6,36 +6,50 @@ memcached_return memcached_string_check(memcached_string_st *string, size_t need { size_t current_offset= string->end - string->string; char *new_value; + size_t adjust= (need - (size_t)(string->current_size - (size_t)(string->end - string->string))) / string->block_size; - new_value= (char *)realloc(string->string, sizeof(char) * string->block_size); + adjust++; - if (!new_value) + new_value= (char *)realloc(string->string, + sizeof(char) * ((adjust * string->block_size) + string->current_size)); + + if (new_value == NULL) return MEMCACHED_MEMORY_ALLOCATION_FAILURE; string->string= new_value; string->end= string->string + current_offset; - string->current_size+= string->block_size; + string->current_size+= (string->block_size * adjust); /* We zero the block structure we just realloced */ - memset((string->string + string->current_size) - string->block_size , 0, + memset((string->string + current_offset), 0, sizeof(char) * string->block_size); } return MEMCACHED_SUCCESS; } -memcached_string_st *memcached_string_init(memcached_st *ptr, size_t initial_size) +memcached_string_st *memcached_string_create(memcached_st *ptr, size_t initial_size) { + memcached_return rc; memcached_string_st *string; /* Saving malloc calls :) */ - string= (memcached_string_st *)malloc(sizeof(memcached_string_st) + (sizeof(char) * initial_size)); + string= (memcached_string_st *)malloc(sizeof(memcached_string_st)); if (!string) return NULL; + string->end= string->string; memset(string, 0, sizeof(memcached_string_st)); string->block_size= initial_size; - memcached_string_check(string, initial_size); + + rc= memcached_string_check(string, initial_size); + if (rc != MEMCACHED_SUCCESS) + { + free(string); + return NULL; + } + + assert(string->string == string->end); return string; } @@ -44,7 +58,13 @@ memcached_return memcached_string_append_character(memcached_st *ptr, memcached_string_st *string, char character) { - memcached_string_check(string, 1); + memcached_return rc; + + rc= memcached_string_check(string, 1); + + if (rc != MEMCACHED_SUCCESS) + return rc; + *string->end= ' '; string->end++; @@ -54,25 +74,27 @@ memcached_return memcached_string_append_character(memcached_st *ptr, memcached_return memcached_string_append(memcached_st *ptr, memcached_string_st *string, char *value, size_t length) { - memcached_string_check(string, length); + memcached_return rc; + + WATCHPOINT; + rc= memcached_string_check(string, length); + WATCHPOINT; + + if (rc != MEMCACHED_SUCCESS) + return rc; + + WATCHPOINT; + assert(string->string); + assert(string->end >= string->string && string->end <= string->string + string->current_size); + + WATCHPOINT; memcpy(string->end, value, length); + WATCHPOINT; string->end+= length; return MEMCACHED_SUCCESS; } -#ifdef CRAP -size_t memcached_string_length(memcached_st *ptr, memcached_string_st *string) -{ - return (size_t)(string->end - string->string); -} - -size_t memcached_string_size(memcached_st *ptr, memcached_string_st *string) -{ - return string->current_size; -} -#endif - size_t memcached_string_backspace(memcached_st *ptr, memcached_string_st *string, size_t remove) { if (string->end - string->string > remove)