#include "TigerUtils.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;
    }
}
