X-Git-Url: http://www.project-moonshot.org/gitweb/?p=jansson.git;a=blobdiff_plain;f=src%2Fstrbuffer.c;h=92c08923d43f60d28f7ed1881d6a07fee21edeb6;hp=ea74b6d3fb4573f449138553831039a6b08c7ccc;hb=53383860e804d1e4f6e038a2c76461867b1ef497;hpb=197d3aa1608a3442d95152d20e15c2b32204aaaf diff --git a/src/strbuffer.c b/src/strbuffer.c index ea74b6d..92c0892 100644 --- a/src/strbuffer.c +++ b/src/strbuffer.c @@ -1,28 +1,50 @@ +/* + * Copyright (c) 2009-2011 Petri Lehtinen + * + * Jansson is free software; you can redistribute it and/or modify + * it under the terms of the MIT license. See LICENSE for details. + */ + #define _GNU_SOURCE #include #include +#include "jansson_private.h" #include "strbuffer.h" -#include "util.h" #define STRBUFFER_MIN_SIZE 16 #define STRBUFFER_FACTOR 2 -void strbuffer_init(strbuffer_t *strbuff) +int strbuffer_init(strbuffer_t *strbuff) { - strbuff->value = NULL; + strbuff->size = STRBUFFER_MIN_SIZE; strbuff->length = 0; - strbuff->size = 0; + + strbuff->value = malloc(strbuff->size); + if(!strbuff->value) + return -1; + + /* initialize to empty */ + strbuff->value[0] = '\0'; + return 0; } void strbuffer_close(strbuffer_t *strbuff) { free(strbuff->value); - strbuffer_init(strbuff); + strbuff->size = 0; + strbuff->length = 0; + strbuff->value = NULL; +} + +void strbuffer_clear(strbuffer_t *strbuff) +{ + strbuff->length = 0; + strbuff->value[0] = '\0'; } -char *strbuffer_value(strbuffer_t *strbuff) +const char *strbuffer_value(const strbuffer_t *strbuff) { - return strdup(strbuff->value); + return strbuff->value; } char *strbuffer_steal_value(strbuffer_t *strbuff) @@ -37,26 +59,37 @@ int strbuffer_append(strbuffer_t *strbuff, const char *string) return strbuffer_append_bytes(strbuff, string, strlen(string)); } +int strbuffer_append_byte(strbuffer_t *strbuff, char byte) +{ + return strbuffer_append_bytes(strbuff, &byte, 1); +} + int strbuffer_append_bytes(strbuffer_t *strbuff, const char *data, int size) { - if(strbuff->length + size > strbuff->size) + if(strbuff->length + size >= strbuff->size) { - if(strbuff->length == 0) - strbuff->size = STRBUFFER_MIN_SIZE; - else - strbuff->size = max(strbuff->size * STRBUFFER_FACTOR, - strbuff->length + size + 1); + strbuff->size = max(strbuff->size * STRBUFFER_FACTOR, + strbuff->length + size + 1); strbuff->value = realloc(strbuff->value, strbuff->size); if(!strbuff->value) return -1; - - memset(strbuff->value + strbuff->length + size, 0, - strbuff->size - strbuff->length - size); } memcpy(strbuff->value + strbuff->length, data, size); strbuff->length += size; + strbuff->value[strbuff->length] = '\0'; return 0; } + +char strbuffer_pop(strbuffer_t *strbuff) +{ + if(strbuff->length > 0) { + char c = strbuff->value[--strbuff->length]; + strbuff->value[strbuff->length] = '\0'; + return c; + } + else + return '\0'; +}