88 lines
2.6 KiB
C++
88 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);
|
||
|
}
|
||
|
|
||
|
|