Guardedalloc: added MEM_reallocN function to do simple alloc/memcpy/free,
authorBrecht Van Lommel <brechtvanlommel@pandora.be>
Mon, 8 Feb 2010 14:59:59 +0000 (14:59 +0000)
committerBrecht Van Lommel <brechtvanlommel@pandora.be>
Mon, 8 Feb 2010 14:59:59 +0000 (14:59 +0000)
not as optimized as a system realloc but I've had to do this often enough
manually to justify a utility function.

intern/guardedalloc/MEM_guardedalloc.h
intern/guardedalloc/intern/mallocn.c

index e404f1749356d26a3c0bcb9549b4b4eb7cdf560f..2c3aab8eb2b2d37a81e2d2e3fd257598284b3093 100644 (file)
@@ -84,6 +84,13 @@ extern "C" {
         * newly allocated block.  */
        void *MEM_dupallocN(void *vmemh);
 
+       /**
+         * Reallocates a block of memory, and returns pointer to the newly
+         * allocated block, the old one is freed. this is not as optimized
+         * as a system realloc but just makes a new allocation and copies
+         * over from existing memory. */
+       void *MEM_reallocN(void *vmemh, unsigned int len);
+
        /**
         * Allocate a block of memory of size len, with tag name str. The
         * memory is cleared. The name must be static, because only a
index 446daea1c0389639bb5923c66aefd04a7eb896e4..6c6836db8294212c392421873c975e155c21abb9 100644 (file)
@@ -225,6 +225,28 @@ void *MEM_dupallocN(void *vmemh)
        return newp;
 }
 
+void *MEM_reallocN(void *vmemh, unsigned int len)
+{
+       void *newp= NULL;
+       
+       if (vmemh) {
+               MemHead *memh= vmemh;
+               memh--;
+
+               newp= MEM_mallocN(len, memh->name);
+               if(newp) {
+                       if(len < memh->len)
+                               memcpy(newp, vmemh, len);
+                       else
+                               memcpy(newp, vmemh, memh->len);
+               }
+
+               MEM_freeN(vmemh);
+       }
+
+       return newp;
+}
+
 static void make_memhead_header(MemHead *memh, unsigned int len, const char *str)
 {
        MemTail *memt;