#include #include #include "string.h" struct string string_make(const char *str) { struct string s; s.len = strlen(str); s.cap = s.len + 1; s.data = malloc(s.cap); memcpy(s.data, str, s.cap); return s; } void string_free(struct string s) { free(s.data); } char* string_read(struct string s) { return s.data; } size_t string_append(struct string *s, char *arg) { const size_t arglen = strlen(arg); if (s->len + arglen + 1 > s->cap) { size_t newcap = s->cap * 2; while (s->len + arglen + 1 > newcap) newcap *= 2; s->data = realloc(s->data, newcap); } memcpy(s->data + s->len, arg, arglen + 1); const size_t origlen = s->len; s->len += arglen; return origlen; } void string_truncate(struct string *s, size_t length) { if (length < s->len) { s->len = length; s->data[length] = '\0'; } }