room101/MEMORY.CPP

87 lines
2.6 KiB
C++

#include "memory.hpp"
#include "file.hpp"
#include "main.hpp"
#include <assert.h>
/*******************************************************************************
** MemoryWrite
*******************************************************************************/
void
MemoryWrite(void* memory, int n, int size, FILE* file)
{
IntWrite(n, file);
IntWrite(size, file);
fwrite(memory, size, n, file);
}
/*******************************************************************************
** MemoryWrite
*******************************************************************************/
void
MemoryWrite(void* memory, FILE* file)
{
MemoryWrite(memory, NumberOf(memory), ItemSize(memory), file);
}
/*******************************************************************************
** MemoryRead
*******************************************************************************/
void*
MemoryRead(FILE* file)
{
int nelem = IntRead(file);
int elsize = IntRead(file);
void* memory = MemoryAlloc(nelem, elsize);
fread(memory, ItemSize(memory), NumberOf(memory), file);
return memory;
}
/*******************************************************************************
** MemoryRealloc
*******************************************************************************/
void*
MemoryRealloc(void* memory, int count, int size)
{
assert(count >= 0 && size >= 0);
int oldsize = MemorySize(memory);
int newsize = count * size;
int memsize = newsize + (newsize ? sizeof(MemoryHeader) : 0);
if (memsize || memory)
{
memory = realloc(memory ? &((MemoryHeader*)memory)[-1] : NULL, memsize);
}
if (memory)
{
((MemoryHeader*)memory)[0].size = size;
((MemoryHeader*)memory)[0].count = count;
memory = &((MemoryHeader*)memory)[1];
if (newsize > oldsize)
{
memset(&((char*)memory)[oldsize], 0, newsize - oldsize);
}
}
else
{
ThrowIf(memsize > 0, "Memory allocation error");
}
return memory;
}
/*******************************************************************************
** MemoryAlloc
*******************************************************************************/
void*
MemoryAlloc(int count, int size)
{
return MemoryRealloc(NULL, count, size);
}
/*******************************************************************************
** MemoryFree
*******************************************************************************/
void
MemoryFree(void* memory)
{
MemoryRealloc(memory, 0, 0);
}