diff options
Diffstat (limited to 'string.c')
-rw-r--r-- | string.c | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/string.c b/string.c new file mode 100644 index 0000000..b85b46a --- /dev/null +++ b/string.c @@ -0,0 +1,41 @@ +#include <stdlib.h> +#include <string.h> +#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'; + } +} |