X-Git-Url: http://www.project-moonshot.org/gitweb/?a=blobdiff_plain;f=src%2Fstrbuffer.c;h=3496024770d9396b21a45e927c71fe83e129dfc4;hb=8d75235ff22dc4aced697e198c3c024f1f4b88fe;hp=911748de1389cc2a68e03c2adca85243cf4c7d87;hpb=8c697312e424055100eb937f40f57f136bb644aa;p=jansson.git diff --git a/src/strbuffer.c b/src/strbuffer.c index 911748d..3496024 100644 --- a/src/strbuffer.c +++ b/src/strbuffer.c @@ -1,3 +1,10 @@ +/* + * Copyright (c) 2009, 2010 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 @@ -7,20 +14,35 @@ #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'; } -const char *strbuffer_value(strbuffer_t *strbuff) +const char *strbuffer_value(const strbuffer_t *strbuff) { return strbuff->value; } @@ -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'; +}