dvander@27: #include "memfile.h" dvander@27: #include dvander@27: #include "osdefs.h" dvander@27: dvander@27: memfile_t *memfile_creat(const char *name, size_t init) dvander@27: { dvander@27: memfile_t mf; dvander@27: memfile_t *pmf; dvander@27: dvander@27: mf.size = init; dvander@27: mf.base = (char *)malloc(init); dvander@27: mf.usedoffs = 0; dvander@27: if (!mf.base) dvander@27: { dvander@27: return NULL; dvander@27: } dvander@27: dvander@27: mf.offs = 0; dvander@27: mf._static = 0; dvander@27: dvander@27: pmf = (memfile_t *)malloc(sizeof(memfile_t)); dvander@27: memcpy(pmf, &mf, sizeof(memfile_t)); dvander@27: dvander@27: pmf->name = strdup(name); dvander@27: dvander@27: return pmf; dvander@27: } dvander@27: dvander@27: void memfile_destroy(memfile_t *mf) dvander@27: { dvander@31: if (!mf) dvander@31: { dvander@31: return; dvander@31: } dvander@31: dvander@27: if (!mf->_static) dvander@27: { dvander@27: free(mf->name); dvander@27: free(mf->base); dvander@27: free(mf); dvander@27: } dvander@27: } dvander@27: dvander@27: void memfile_seek(memfile_t *mf, long seek) dvander@27: { dvander@27: mf->offs = seek; dvander@27: } dvander@27: dvander@27: long memfile_tell(memfile_t *mf) dvander@27: { dvander@27: return mf->offs; dvander@27: } dvander@27: dvander@27: size_t memfile_read(memfile_t *mf, void *buffer, size_t maxsize) dvander@27: { dvander@27: if (!maxsize || mf->offs >= mf->usedoffs) dvander@27: { dvander@27: return 0; dvander@27: } dvander@27: dvander@27: if (mf->usedoffs - mf->offs < (long)maxsize) dvander@27: { dvander@27: maxsize = mf->usedoffs - mf->offs; dvander@27: if (!maxsize) dvander@27: { dvander@27: return 0; dvander@27: } dvander@27: } dvander@27: dvander@27: memcpy(buffer, mf->base + mf->offs, maxsize); dvander@27: dvander@27: mf->offs += maxsize; dvander@27: dvander@27: return maxsize; dvander@27: } dvander@27: dvander@31: int memfile_write(memfile_t *mf, const void *buffer, size_t size) dvander@27: { dvander@27: if (mf->offs + size > mf->size) dvander@27: { dvander@27: size_t newsize = (mf->size + size) * 2; dvander@27: if (mf->_static) dvander@27: { dvander@27: char *oldbase = mf->base; dvander@27: mf->base = (char *)malloc(newsize); dvander@27: if (!mf->base) dvander@27: { dvander@27: return 0; dvander@27: } dvander@27: memcpy(mf->base, oldbase, mf->size); dvander@27: } else { dvander@27: mf->base = (char *)realloc(mf->base, newsize); dvander@27: if (!mf->base) dvander@27: { dvander@27: return 0; dvander@27: } dvander@27: } dvander@27: mf->_static = 0; dvander@27: mf->size = newsize; dvander@27: } dvander@27: memcpy(mf->base + mf->offs, buffer, size); dvander@27: mf->offs += size; dvander@27: dvander@27: if (mf->offs > mf->usedoffs) dvander@27: { dvander@27: mf->usedoffs = mf->offs; dvander@27: } dvander@27: dvander@27: return 1; dvander@27: } dvander@31: dvander@31: void memfile_reset(memfile_t *mf) dvander@31: { dvander@31: mf->usedoffs = 0; dvander@31: mf->offs = 0; dvander@31: }