251cced1f8
Various minor things done to project files Updated sample extension project file and updated makefile to the new unified version (more changes likely on the way) Updated regex project file and makefile --HG-- extra : convert_revision : svn%3A39bc706e-5318-0410-9160-8a85361fbb7c/trunk%401971
117 lines
1.8 KiB
C
117 lines
1.8 KiB
C
#include "memfile.h"
|
|
#include <string.h>
|
|
#include "osdefs.h"
|
|
|
|
memfile_t *memfile_creat(const char *name, size_t init)
|
|
{
|
|
memfile_t mf;
|
|
memfile_t *pmf;
|
|
|
|
mf.size = init;
|
|
mf.base = (char *)malloc(init);
|
|
mf.usedoffs = 0;
|
|
if (!mf.base)
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
mf.offs = 0;
|
|
mf._static = 0;
|
|
|
|
pmf = (memfile_t *)malloc(sizeof(memfile_t));
|
|
memcpy(pmf, &mf, sizeof(memfile_t));
|
|
|
|
pmf->name = strdup(name);
|
|
|
|
return pmf;
|
|
}
|
|
|
|
void memfile_destroy(memfile_t *mf)
|
|
{
|
|
if (!mf)
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (!mf->_static)
|
|
{
|
|
free(mf->name);
|
|
free(mf->base);
|
|
free(mf);
|
|
}
|
|
}
|
|
|
|
void memfile_seek(memfile_t *mf, long seek)
|
|
{
|
|
mf->offs = seek;
|
|
}
|
|
|
|
long memfile_tell(memfile_t *mf)
|
|
{
|
|
return mf->offs;
|
|
}
|
|
|
|
size_t memfile_read(memfile_t *mf, void *buffer, size_t maxsize)
|
|
{
|
|
if (!maxsize || mf->offs >= mf->usedoffs)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
if (mf->usedoffs - mf->offs < (long)maxsize)
|
|
{
|
|
maxsize = mf->usedoffs - mf->offs;
|
|
if (!maxsize)
|
|
{
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
memcpy(buffer, mf->base + mf->offs, maxsize);
|
|
|
|
mf->offs += maxsize;
|
|
|
|
return maxsize;
|
|
}
|
|
|
|
int memfile_write(memfile_t *mf, const void *buffer, size_t size)
|
|
{
|
|
if (mf->offs + size > mf->size)
|
|
{
|
|
size_t newsize = (mf->size + size) * 2;
|
|
if (mf->_static)
|
|
{
|
|
char *oldbase = mf->base;
|
|
mf->base = (char *)malloc(newsize);
|
|
if (!mf->base)
|
|
{
|
|
return 0;
|
|
}
|
|
memcpy(mf->base, oldbase, mf->size);
|
|
} else {
|
|
mf->base = (char *)realloc(mf->base, newsize);
|
|
if (!mf->base)
|
|
{
|
|
return 0;
|
|
}
|
|
}
|
|
mf->_static = 0;
|
|
mf->size = newsize;
|
|
}
|
|
memcpy(mf->base + mf->offs, buffer, size);
|
|
mf->offs += size;
|
|
|
|
if (mf->offs > mf->usedoffs)
|
|
{
|
|
mf->usedoffs = mf->offs;
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
void memfile_reset(memfile_t *mf)
|
|
{
|
|
mf->usedoffs = 0;
|
|
mf->offs = 0;
|
|
}
|