#ifndef SORM_STR_H
#define SORM_STR_H
#include <rlib.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct sormstr_t {
    char *content;
    size_t length;
    size_t buffer_size;
    size_t size;
} sormstr_t;

sormstr_t *sormstrn(size_t buffer_size) {
    sormstr_t *result = (sormstr_t *)malloc(sizeof(sormstr_t));
    result->length = 0;
    result->size = buffer_size;
    result->buffer_size = buffer_size;
    result->content = (char *)malloc(buffer_size);
    result->content[0] = 0;
    return result;
}
void sormstra(sormstr_t *str, const char *to_append) {
    size_t required_new_length = str->length + strlen(to_append);
    str->length += strlen(to_append);
    if (required_new_length > str->size) {
        str->size += required_new_length + str->buffer_size;
        str->content = realloc(str->content, str->size + 1);
    } else {
        // printf("NO NDEED\n");
    }
    strcat(str->content, to_append);
    str->content[str->length] = 0;
}
void sormstrd(sormstr_t *str) {
    if (str->content) {
        free(str->content);
    }
    free(str);
}
char *sormstrc(sormstr_t *str) {
    // sorm str convert
    char *content = str->content;
    str->content = NULL;
    sormstrd(str);
    return content;
}

#endif