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)
74 new_size = max(strbuff->size * STRBUFFER_FACTOR,
75 strbuff->length + size + 1);
77 new_value = jsonp_malloc(new_size);
81 memcpy(new_value, strbuff->value, strbuff->length);
83 jsonp_free(strbuff->value);
84 strbuff->value = new_value;
85 strbuff->size = new_size;
88 memcpy(strbuff->value + strbuff->length, data, size);
89 strbuff->length += size;
90 strbuff->value[strbuff->length] = '\0';
95 char strbuffer_pop(strbuffer_t *strbuff)
97 if(strbuff->length > 0) {
98 char c = strbuff->value[--strbuff->length];
99 strbuff->value[strbuff->length] = '\0';