Mercurial > hg > dmlib
diff dmres.c @ 439:bc1da1f4cb4b
Implement fwrite and fputc in memio resources. They will only operate on pre-allocated memory area, thus not grow-as-write.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Sun, 04 Nov 2012 03:18:42 +0200 |
parents | 3d9c044ec08d |
children | b60220fd1669 |
line wrap: on
line diff
--- a/dmres.c Sun Nov 04 03:16:43 2012 +0200 +++ b/dmres.c Sun Nov 04 03:18:42 2012 +0200 @@ -466,7 +466,7 @@ { // Check for EOF if ((size_t) f->dataOffset < f->dataSize) - return (int) f->data[f->dataOffset++]; + return f->data[f->dataOffset++]; else return EOF; } @@ -489,6 +489,40 @@ } +static int dm_mem_fputc(int ch, DMResource * f) +{ + // Check for EOF + if ((size_t) f->dataOffset < f->dataSize) + { + f->data[f->dataOffset++] = ch; + return ch; + } + else + return EOF; +} + + +static size_t dm_mem_fwrite(void *buf, size_t size, size_t nmemb, DMResource * f) +{ + size_t length = (size * nmemb); + + // Check if we can write the whole chunk + if (((size_t) f->dataOffset + length) >= f->dataSize) + { + nmemb = (f->dataSize - f->dataOffset) / size; + length = size * nmemb; + } + + if (length > 0) + { + memcpy(f->data + f->dataOffset, buf, length); + f->dataOffset += length; + } + return nmemb; +} + + + #ifdef DM_USE_PACKFS DMResourceOps dfPackFileOps = { @@ -517,9 +551,9 @@ dm_mem_ftell, dm_mem_feof, dm_mem_fgetc, - NULL, + dm_mem_fputc, dm_mem_fread, - NULL, + dm_mem_fwrite, NULL, NULL,