#include <assert.h>
#include <string.h>

#include "misc.h"

static int qstrs_alloc;
static int qstrs_len;
static const char **qstrs;

void qstr_init(void) {
    qstrs_alloc = 400;
    qstrs_len = 1;
    qstrs = m_new(const char*, qstrs_alloc);
    qstrs[0] = "nil";
}

static qstr qstr_add(const char *str) {
    if (qstrs_len >= qstrs_alloc) {
        qstrs_alloc *= 2;
        qstrs = m_renew(const char*, qstrs, qstrs_alloc);
    }
    qstrs[qstrs_len++] = str;
    return qstrs_len - 1;
}

qstr qstr_from_str_static(const char *str) {
    for (int i = 0; i < qstrs_len; i++) {
        if (strcmp(qstrs[i], str) == 0) {
            return i;
        }
    }
    return qstr_add(str);
}

qstr qstr_from_str_take(char *str) {
    for (int i = 0; i < qstrs_len; i++) {
        if (strcmp(qstrs[i], str) == 0) {
            m_free(str);
            return i;
        }
    }
    return qstr_add(str);
}

qstr qstr_from_strn_copy(const char *str, int len) {
    for (int i = 0; i < qstrs_len; i++) {
        if (strncmp(qstrs[i], str, len) == 0 && qstrs[i][len] == '\0') {
            return i;
        }
    }
    return qstr_add(strndup(str, len));
}

const char *qstr_str(qstr qstr) {
    return qstrs[qstr];
}
