#include <tabula.h>

#include <alias/str.h>

alias_str alias_str_clone(alias_MemoryCB *mcb, alias_str s) {
  uintmax_t l = strlen(s);
  return alias_memory_clone(mcb, s, l + 1, 1);
}

alias_str alias_str_clone_substring(alias_MemoryCB *mcb, alias_str s, uint32_t length) {
  uintmax_t l = strlen(s);
  if(l > length) {
    uint8_t * result = alias_memory_clone(mcb, s, length + 1, 1);
    result[length] = 0;
    return (alias_str)result;
  } else {
    return alias_str_clone(mcb, s);
  }
}

alias_str alias_str_format(alias_MemoryCB *mcb, alias_str format, ...) {
  va_list ap1, ap2;
  va_start(ap1, format);
  va_copy(ap2, ap1);
  int length = tabula_vcprintf(format, ap1);
  char *result = alias_malloc(mcb, length + 1, 1);
  tabula_snprintf(result, length, length, format, ap2);
  return result;
}

void alias_str_free(alias_MemoryCB *mcb, alias_str s) { alias_free(mcb, (void *)s, strlen(s) + 1, 1); }

bool alias_str_same(alias_str a, alias_str b) { return strcmp(a, b) == 0; }

int alias_str_compare(alias_str a, alias_str b) { return strcmp(a, b); }

uintmax_t alias_str_length(alias_str s) { return strlen(s); }

uintmax_t alias_str_size(alias_str s) { return strlen(s); }