X-Git-Url: http://www.project-moonshot.org/gitweb/?a=blobdiff_plain;f=src%2Fstrbuffer.c;h=92c08923d43f60d28f7ed1881d6a07fee21edeb6;hb=ac96ac13d491f87f5aa8747e208b366c81354a0b;hp=2445a75963f073aff5501c4e1b8a2972607db441;hpb=3e0134782b942c1334e2cbb08ef4fce76e90301c;p=jansson.git diff --git a/src/strbuffer.c b/src/strbuffer.c index 2445a75..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 = max(size + 1, 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'; +}