diff options
Diffstat (limited to 'src/json/strbuffer.c')
-rw-r--r-- | src/json/strbuffer.c | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/src/json/strbuffer.c b/src/json/strbuffer.c new file mode 100644 index 000000000..8ba7faa9a --- /dev/null +++ b/src/json/strbuffer.c @@ -0,0 +1,101 @@ +/* + * Copyright (c) 2009 Petri Lehtinen <petri@digip.org> + * + * Jansson is free software; you can redistribute it and/or modify + * it under the terms of the MIT license. See LICENSE for details. + */ + +#include "../config.h" +#include "strbuffer.h" +#include "util.h" + +#define STRBUFFER_MIN_SIZE 16 +#define STRBUFFER_FACTOR 2 + +int +strbuffer_init (strbuffer_t * strbuff) +{ + strbuff->size = STRBUFFER_MIN_SIZE; + strbuff->length = 0; + + strbuff->value = g_malloc (strbuff->size); + if (!strbuff->value) + return -1; + + /* initialize to empty */ + strbuff->value[0] = '\0'; + return 0; +} + +void +strbuffer_close (strbuffer_t * strbuff) +{ + g_free (strbuff->value); + 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 (const strbuffer_t * strbuff) +{ + return strbuff->value; +} + +char * +strbuffer_steal_value (strbuffer_t * strbuff) +{ + char *result = strbuff->value; + strbuffer_init (strbuff); + return result; +} + +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) { + strbuff->size = max (strbuff->size * STRBUFFER_FACTOR, + strbuff->length + size + 1); + + strbuff->value = realloc (strbuff->value, strbuff->size); + if (!strbuff->value) + return -1; + } + + 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'; +} |