Fix json_loadf and json_loadfd with empty input
[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     memset(strbuff->value, 0, strbuff->size);
20     return 0;
21 }
22
23 void strbuffer_close(strbuffer_t *strbuff)
24 {
25     free(strbuff->value);
26     strbuff->size = 0;
27     strbuff->length = 0;
28     strbuff->value = NULL;
29 }
30
31 const char *strbuffer_value(strbuffer_t *strbuff)
32 {
33     return strbuff->value;
34 }
35
36 char *strbuffer_steal_value(strbuffer_t *strbuff)
37 {
38     char *result = strbuff->value;
39     strbuffer_init(strbuff);
40     return result;
41 }
42
43 int strbuffer_append(strbuffer_t *strbuff, const char *string)
44 {
45     return strbuffer_append_bytes(strbuff, string, strlen(string));
46 }
47
48 int strbuffer_append_bytes(strbuffer_t *strbuff, const char *data, int size)
49 {
50     if(strbuff->length + size >= strbuff->size)
51     {
52         strbuff->size = max(strbuff->size * STRBUFFER_FACTOR,
53                             strbuff->length + size + 1);
54
55         strbuff->value = realloc(strbuff->value, strbuff->size);
56         if(!strbuff->value)
57             return -1;
58
59         memset(strbuff->value + strbuff->length + size, 0,
60                strbuff->size - strbuff->length - size);
61     }
62
63     memcpy(strbuff->value + strbuff->length, data, size);
64     strbuff->length += size;
65
66     return 0;
67 }