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,