911748de1389cc2a68e03c2adca85243cf4c7d87
[jansson.git] / src / strbuffer.c
1 #define _GNU_SOURCE
2 #include <stdlib.h>
3 #include <string.h>
4 #include "strbuffer.h"
5 #include "util.h"
6
7 #define STRBUFFER_MIN_SIZE  16
8 #define STRBUFFER_FACTOR    2
9
10 void strbuffer_init(strbuffer_t *strbuff)
11 {
12     strbuff->value = NULL;
13     strbuff->length = 0;
14     strbuff->size = 0;
15 }
16
17 void strbuffer_close(strbuffer_t *strbuff)
18 {
19     free(strbuff->value);
20     strbuffer_init(strbuff);
21 }
22
23 const char *strbuffer_value(strbuffer_t *strbuff)
24 {
25     return strbuff->value;
26 }
27
28 char *strbuffer_steal_value(strbuffer_t *strbuff)
29 {
30     char *result = strbuff->value;
31     strbuffer_init(strbuff);
32     return result;
33 }
34
35 int strbuffer_append(strbuffer_t *strbuff, const char *string)
36 {
37     return strbuffer_append_bytes(strbuff, string, strlen(string));
38 }
39
40 int strbuffer_append_bytes(strbuffer_t *strbuff, const char *data, int size)
41 {
42     if(strbuff->length + size > strbuff->size)
43     {
44         if(strbuff->length == 0)
45             strbuff->size = max(size + 1, STRBUFFER_MIN_SIZE);
46         else
47             strbuff->size = max(strbuff->size * STRBUFFER_FACTOR,
48                                 strbuff->length + size + 1);
49
50         strbuff->value = realloc(strbuff->value, strbuff->size);
51         if(!strbuff->value)
52             return -1;
53
54         memset(strbuff->value + strbuff->length + size, 0,
55                strbuff->size - strbuff->length - size);
56     }
57
58     memcpy(strbuff->value + strbuff->length, data, size);
59     strbuff->length += size;
60
61     return 0;
62 }