#include #include #include #include string_t *init_string(const char *src) { string_t *s = safe_calloc(1, sizeof(string_t)); size_t len = src ? strlen(src) : DEFAULT_STR_SIZE; size_t size = len * 2; s->buf = safe_calloc(size, sizeof(char)); s->buf[0] = '\0'; if (src) strcpy(s->buf, src); s->len = len; s->size = size; return s; } void string_push(string_t *s, char c) { if (s->len >= s->size - 2) { s->size *= 2; s->buf = safe_realloc(s->buf, s->size); } s->buf[s->len] = c; s->len++; } char string_pop(string_t *s) { char c = s->buf[s->len]; s->len--; return c; } void string_concat_const(string_t *s1, const char *s2) { for (int i = 0; i < strlen(s2); i++) { string_push(s1, s2[i]); } } void string_concat(string_t *s1, string_t *s2) { for (int i = 0; i < s2->len; i++) { string_push(s1, s2->buf[i]); } } void string_free(void *x) { string_t *s = x; free(s->buf); free(s); }