2 * Copyright (c) 2009-2011 Petri Lehtinen <petri@digip.org>
4 * Jansson is free software; you can redistribute it and/or modify
5 * it under the terms of the MIT license. See LICENSE for details.
11 #include "jansson_private.h"
12 #include "strbuffer.h"
14 #define STRBUFFER_MIN_SIZE 16
15 #define STRBUFFER_FACTOR 2
17 int strbuffer_init(strbuffer_t *strbuff)
19 strbuff->size = STRBUFFER_MIN_SIZE;
22 strbuff->value = malloc(strbuff->size);
26 /* initialize to empty */
27 strbuff->value[0] = '\0';
31 void strbuffer_close(strbuffer_t *strbuff)
36 strbuff->value = NULL;
39 void strbuffer_clear(strbuffer_t *strbuff)
42 strbuff->value[0] = '\0';
45 const char *strbuffer_value(const strbuffer_t *strbuff)
47 return strbuff->value;
50 char *strbuffer_steal_value(strbuffer_t *strbuff)
52 char *result = strbuff->value;
53 strbuffer_init(strbuff);
57 int strbuffer_append(strbuffer_t *strbuff, const char *string)
59 return strbuffer_append_bytes(strbuff, string, strlen(string));
62 int strbuffer_append_byte(strbuffer_t *strbuff, char byte)
64 return strbuffer_append_bytes(strbuff, &byte, 1);
67 int strbuffer_append_bytes(strbuffer_t *strbuff, const char *data, int size)
69 if(strbuff->length + size >= strbuff->size)
71 strbuff->size = max(strbuff->size * STRBUFFER_FACTOR,
72 strbuff->length + size + 1);
74 strbuff->value = realloc(strbuff->value, strbuff->size);
79 memcpy(strbuff->value + strbuff->length, data, size);
80 strbuff->length += size;
81 strbuff->value[strbuff->length] = '\0';
86 char strbuffer_pop(strbuffer_t *strbuff)
88 if(strbuff->length > 0) {
89 char c = strbuff->value[--strbuff->length];
90 strbuff->value[strbuff->length] = '\0';