#include <string.h>

#include "tzWrappers/TzwMemory.h"

#include "ifaa_mem_utils.h"

bool is_little_endian(void) {
    uint16_t data = 1;
    return *(uint8_t *) (&data);
}

uint16_t read16(const uint8_t *buffer) {
    if (is_little_endian()) {
        return buffer[1] << 8 | buffer[0];
    }
    return buffer[0] << 8 | buffer[1];
}

uint32_t read32(const uint8_t *buffer) {
    if (is_little_endian()) {
        return buffer[3] << 24 | buffer[2] << 16 | buffer[1] << 8 | buffer[0];
    }
    return buffer[0] << 24 | buffer[1] << 16 | buffer[2] << 8 | buffer[3];
}

void write16(uint8_t *buffer, uint16_t value) {
    if (is_little_endian()) {
        buffer[0] = value & 0xFF;
        buffer[1] = (value >> 8) & 0xFF;
    } else {
        buffer[1] = value & 0xFF;
        buffer[0] = (value >> 8) & 0xFF;
    }
}

void write32(uint8_t *buffer, uint32_t value) {
    if (is_little_endian()) {
        buffer[0] = value & 0xFF;
        buffer[1] = (value >> 8) & 0xFF;
        buffer[2] = (value >> 16) & 0xFF;
        buffer[3] = (value >> 24) & 0xFF;
    } else {
        buffer[3] = value & 0xFF;
        buffer[2] = (value >> 8) & 0xFF;
        buffer[1] = (value >> 16) & 0xFF;
        buffer[0] = (value >> 24) & 0xFF;
    }
}

char *malloc_string(uint8_t *buf, uint32_t size) {
    char *str = (char *) tzwMalloc(size + 1);
    if (str != NULL) {
        memcpy(str, buf, size);
        str[size] = '\0';
    }
    return str;
}

void free_string(char *str) {
    tzwFree(str);
}

#if 0
void *TEE_Malloc(uint32_t size, uint32_t hint) {
    void *ptr = tzwMalloc(size);
    if (ptr != NULL) {
        memset(ptr, 0, size);
    }
    return ptr;
}

void TEE_Free(void *p) {
    if (p) tzwFree(p);
}
#endif
