mirror of
https://github.com/isledecomp/isle.git
synced 2024-11-26 17:46:38 -05:00
140 lines
2.5 KiB
C++
140 lines
2.5 KiB
C++
|
#include "legostorage.h"
|
||
|
|
||
|
#include "decomp.h"
|
||
|
|
||
|
#include <memory.h>
|
||
|
#include <string.h>
|
||
|
|
||
|
DECOMP_SIZE_ASSERT(LegoStorage, 0x8);
|
||
|
DECOMP_SIZE_ASSERT(LegoMemory, 0x10);
|
||
|
DECOMP_SIZE_ASSERT(LegoFile, 0xc);
|
||
|
|
||
|
// FUNCTION: LEGO1 0x10099080
|
||
|
LegoMemory::LegoMemory(void* p_buffer) : LegoStorage()
|
||
|
{
|
||
|
m_buffer = (LegoU8*) p_buffer;
|
||
|
m_position = 0;
|
||
|
}
|
||
|
|
||
|
// FUNCTION: LEGO1 0x10099160
|
||
|
LegoResult LegoMemory::Read(void* p_buffer, LegoU32 p_size)
|
||
|
{
|
||
|
memcpy(p_buffer, m_buffer + m_position, p_size);
|
||
|
m_position += p_size;
|
||
|
return SUCCESS;
|
||
|
}
|
||
|
|
||
|
// FUNCTION: LEGO1 0x10099190
|
||
|
LegoResult LegoMemory::Write(const void* p_buffer, LegoU32 p_size)
|
||
|
{
|
||
|
memcpy(m_buffer + m_position, p_buffer, p_size);
|
||
|
m_position += p_size;
|
||
|
return SUCCESS;
|
||
|
}
|
||
|
|
||
|
// FUNCTION: LEGO1 0x100991c0
|
||
|
LegoFile::LegoFile()
|
||
|
{
|
||
|
m_file = NULL;
|
||
|
}
|
||
|
|
||
|
// FUNCTION: LEGO1 0x10099250
|
||
|
LegoFile::~LegoFile()
|
||
|
{
|
||
|
if (m_file) {
|
||
|
fclose(m_file);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// FUNCTION: LEGO1 0x100992c0
|
||
|
LegoResult LegoFile::Read(void* p_buffer, LegoU32 p_size)
|
||
|
{
|
||
|
if (!m_file) {
|
||
|
return FAILURE;
|
||
|
}
|
||
|
if (fread(p_buffer, 1, p_size, m_file) != p_size) {
|
||
|
return FAILURE;
|
||
|
}
|
||
|
return SUCCESS;
|
||
|
}
|
||
|
|
||
|
// FUNCTION: LEGO1 0x10099300
|
||
|
LegoResult LegoFile::Write(const void* p_buffer, LegoU32 p_size)
|
||
|
{
|
||
|
if (!m_file) {
|
||
|
return FAILURE;
|
||
|
}
|
||
|
if (fwrite(p_buffer, 1, p_size, m_file) != p_size) {
|
||
|
return FAILURE;
|
||
|
}
|
||
|
return SUCCESS;
|
||
|
}
|
||
|
|
||
|
// FUNCTION: LEGO1 0x10099340
|
||
|
LegoResult LegoFile::GetPosition(LegoU32& p_position)
|
||
|
{
|
||
|
if (!m_file) {
|
||
|
return FAILURE;
|
||
|
}
|
||
|
LegoU32 position = ftell(m_file);
|
||
|
if (position == -1) {
|
||
|
return FAILURE;
|
||
|
}
|
||
|
p_position = position;
|
||
|
return SUCCESS;
|
||
|
}
|
||
|
|
||
|
// FUNCTION: LEGO1 0x10099370
|
||
|
LegoResult LegoFile::SetPosition(LegoU32 p_position)
|
||
|
{
|
||
|
if (!m_file) {
|
||
|
return FAILURE;
|
||
|
}
|
||
|
if (fseek(m_file, p_position, SEEK_SET) != 0) {
|
||
|
return FAILURE;
|
||
|
}
|
||
|
return SUCCESS;
|
||
|
}
|
||
|
|
||
|
// FUNCTION: LEGO1 0x100993a0
|
||
|
LegoResult LegoFile::Open(const char* p_name, LegoU32 p_mode)
|
||
|
{
|
||
|
if (m_file) {
|
||
|
fclose(m_file);
|
||
|
}
|
||
|
char mode[4];
|
||
|
mode[0] = '\0';
|
||
|
if (p_mode & c_read) {
|
||
|
m_mode = c_read;
|
||
|
strcat(mode, "r");
|
||
|
}
|
||
|
if (p_mode & c_write) {
|
||
|
if (m_mode != c_read)
|
||
|
m_mode = c_write;
|
||
|
strcat(mode, "w");
|
||
|
}
|
||
|
if ((p_mode & c_text) != 0)
|
||
|
strcat(mode, "t");
|
||
|
else
|
||
|
strcat(mode, "b");
|
||
|
|
||
|
if (!(m_file = fopen(p_name, mode))) {
|
||
|
return FAILURE;
|
||
|
}
|
||
|
return SUCCESS;
|
||
|
}
|
||
|
|
||
|
// FUNCTION: LEGO1 0x100994a0
|
||
|
LegoResult LegoMemory::GetPosition(LegoU32& p_position)
|
||
|
{
|
||
|
p_position = m_position;
|
||
|
return SUCCESS;
|
||
|
}
|
||
|
|
||
|
// FUNCTION: LEGO1 0x100994b0
|
||
|
LegoResult LegoMemory::SetPosition(LegoU32 p_position)
|
||
|
{
|
||
|
m_position = p_position;
|
||
|
return SUCCESS;
|
||
|
}
|