diff src/dynarr.c @ 424:11054d720c21 r21-2-20

Import from CVS: tag r21-2-20
author cvs
date Mon, 13 Aug 2007 11:26:11 +0200
parents 697ef44129c6
children
line wrap: on
line diff
--- a/src/dynarr.c	Mon Aug 13 11:25:03 2007 +0200
+++ b/src/dynarr.c	Mon Aug 13 11:26:11 2007 +0200
@@ -111,6 +111,19 @@
 
 int Dynarr_min_size = 1;
 
+static void
+Dynarr_realloc (Dynarr *dy, int new_size)
+{
+  if (DUMPEDP (dy->base))
+    {
+      void *new_base = malloc (new_size);
+      memcpy (new_base, dy->base, dy->max > new_size ? new_size : dy->max);
+      dy->base = new_base;
+    }
+  else
+    dy->base = xrealloc (dy->base, new_size);
+}
+
 void *
 Dynarr_newf (int elsize)
 {
@@ -138,7 +151,7 @@
   /* Don't do anything if the array is already big enough. */
   if (newsize > dy->max)
     {
-      dy->base = xrealloc (dy->base, newsize*dy->elsize);
+      Dynarr_realloc (dy, newsize*dy->elsize);
       dy->max = newsize;
     }
 }
@@ -186,9 +199,10 @@
 {
   Dynarr *dy = (Dynarr *) d;
 
-  if (dy->base)
+  if (dy->base && !DUMPEDP (dy->base))
     xfree (dy->base);
-  xfree (dy);
+  if(!DUMPEDP (dy))
+    xfree (dy);
 }
 
 #ifdef MEMORY_USAGE_STATS