7de7be410beedf432cdc0866ab344bc9e242b911
[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 int strbuffer_init(strbuffer_t *strbuff)
11 {
12     strbuff->size = STRBUFFER_MIN_SIZE;
13     strbuff->length = 0;
14
15     strbuff->value = malloc(strbuff->size);
16     if(!strbuff->value)
17         return -1;
18
19     /* initialize to empty */
20     strbuff->value[0] = '\0';
21     return 0;
22 }
23
24 void strbuffer_close(strbuffer_t *strbuff)
25 {
26     free(strbuff->value);
27     strbuff->size = 0;
28     strbuff->length = 0;
29     strbuff->value = NULL;
30 }
31
32 void strbuffer_clear(strbuffer_t *strbuff)
33 {
34     strbuff->length = 0;
35     strbuff->value[0] = '\0';
36 }
37
38 const char *strbuffer_value(const strbuffer_t *strbuff)
39 {
40     return strbuff->value;
41 }
42
43 char *strbuffer_steal_value(strbuffer_t *strbuff)
44 {
45     char *result = strbuff->value;
46     strbuffer_init(strbuff);
47     return result;
48 }
49
50 int strbuffer_append(strbuffer_t *strbuff, const char *string)
51 {
52     return strbuffer_append_bytes(strbuff, string, strlen(string));
53 }
54
55 int strbuffer_append_byte(strbuffer_t *strbuff, char byte)
56 {
57     return strbuffer_append_bytes(strbuff, &byte, 1);
58 }
59
60 int strbuffer_append_bytes(strbuffer_t *strbuff, const char *data, int size)
61 {
62     if(strbuff->length + size >= strbuff->size)
63     {
64         strbuff->size = max(strbuff->size * STRBUFFER_FACTOR,
65                             strbuff->length + size + 1);
66
67         strbuff->value = realloc(strbuff->value, strbuff->size);
68         if(!strbuff->value)
69             return -1;
70     }
71
72     memcpy(strbuff->value + strbuff->length, data, size);
73     strbuff->length += size;
74     strbuff->value[strbuff->length] = '\0';
75
76     return 0;
77 }
78
79 char strbuffer_pop(strbuffer_t *strbuff)
80 {
81     if(strbuff->length > 0) {
82         char c = strbuff->value[--strbuff->length];
83         strbuff->value[strbuff->length] = '\0';
84         return c;
85     }
86     else
87         return '\0';
88 }