7 #define STRBUFFER_MIN_SIZE 16
8 #define STRBUFFER_FACTOR 2
10 int strbuffer_init(strbuffer_t *strbuff)
12 strbuff->size = STRBUFFER_MIN_SIZE;
15 strbuff->value = malloc(strbuff->size);
19 /* initialize to empty */
20 strbuff->value[0] = '\0';
24 void strbuffer_close(strbuffer_t *strbuff)
29 strbuff->value = NULL;
32 void strbuffer_clear(strbuffer_t *strbuff)
35 strbuff->value[0] = '\0';
38 const char *strbuffer_value(const strbuffer_t *strbuff)
40 return strbuff->value;
43 char *strbuffer_steal_value(strbuffer_t *strbuff)
45 char *result = strbuff->value;
46 strbuffer_init(strbuff);
50 int strbuffer_append(strbuffer_t *strbuff, const char *string)
52 return strbuffer_append_bytes(strbuff, string, strlen(string));
55 int strbuffer_append_byte(strbuffer_t *strbuff, char byte)
57 return strbuffer_append_bytes(strbuff, &byte, 1);
60 int strbuffer_append_bytes(strbuffer_t *strbuff, const char *data, int size)
62 if(strbuff->length + size >= strbuff->size)
64 strbuff->size = max(strbuff->size * STRBUFFER_FACTOR,
65 strbuff->length + size + 1);
67 strbuff->value = realloc(strbuff->value, strbuff->size);
72 memcpy(strbuff->value + strbuff->length, data, size);
73 strbuff->length += size;
74 strbuff->value[strbuff->length] = '\0';
79 char strbuffer_pop(strbuffer_t *strbuff)
81 if(strbuff->length > 0) {
82 char c = strbuff->value[--strbuff->length];
83 strbuff->value[strbuff->length] = '\0';