comparison src/dynarr.c @ 3210:72b7d685c194

[xemacs-hg @ 2006-01-20 17:59:48 by crestani] * dynarr.c (Dynarr_realloc): Determine size of memory region to copy correctly, fix types. * dynarr.c (Dynarr_lisp_realloc): Determine size of memory region to copy correctly. * dynarr.c (Dynarr_resize): Call Dynarr_realloc with number of elements instead of memory region size.
author crestani
date Fri, 20 Jan 2006 17:59:50 +0000
parents 141c2920ea48
children 168191f9515f
comparison
equal deleted inserted replaced
3209:948bd302ca41 3210:72b7d685c194
127 #include "lisp.h" 127 #include "lisp.h"
128 128
129 static int Dynarr_min_size = 8; 129 static int Dynarr_min_size = 8;
130 130
131 static void 131 static void
132 Dynarr_realloc (Dynarr *dy, Bytecount new_size) 132 Dynarr_realloc (Dynarr *dy, int new_size)
133 { 133 {
134 if (DUMPEDP (dy->base)) 134 if (DUMPEDP (dy->base))
135 { 135 {
136 void *new_base = malloc (new_size); 136 void *new_base = malloc (new_size);
137 memcpy (new_base, dy->base, dy->max > new_size ? dy->max : new_size); 137 memcpy (new_base, dy->base,
138 (dy->max < new_size ? dy->max : new_size) * dy->elsize);
138 dy->base = new_base; 139 dy->base = new_base;
139 } 140 }
140 else 141 else
141 dy->base = xrealloc (dy->base, new_size); 142 dy->base = xrealloc (dy->base, new_size * dy->elsize);
142 } 143 }
143 144
144 void * 145 void *
145 Dynarr_newf (int elsize) 146 Dynarr_newf (int elsize)
146 { 147 {
156 0, 0, 0, 0, 0, 157 0, 0, 0, 0, 0,
157 0, 158 0,
158 Dynarr); 159 Dynarr);
159 160
160 static void 161 static void
161 Dynarr_lisp_realloc (Dynarr *dy, Elemcount new_size) 162 Dynarr_lisp_realloc (Dynarr *dy, int new_size)
162 { 163 {
163 void *new_base = alloc_lrecord_array (dy->elsize, new_size, dy->lisp_imp); 164 void *new_base = alloc_lrecord_array (dy->elsize, new_size, dy->lisp_imp);
164 void *old_base = dy->base; 165 void *old_base = dy->base;
165 if (dy->base) 166 if (dy->base)
166 memcpy (new_base, dy->base, 167 memcpy (new_base, dy->base,
167 (dy->max > new_size ? dy->max : new_size) * dy->elsize); 168 (dy->max < new_size ? dy->max : new_size) * dy->elsize);
168 dy->base = new_base; 169 dy->base = new_base;
169 if (old_base) 170 if (old_base)
170 mc_free (old_base); 171 mc_free (old_base);
171 } 172 }
172 173
203 { 204 {
204 #ifdef NEW_GC 205 #ifdef NEW_GC
205 if (dy->lisp_imp) 206 if (dy->lisp_imp)
206 Dynarr_lisp_realloc (dy, newsize); 207 Dynarr_lisp_realloc (dy, newsize);
207 else 208 else
208 Dynarr_realloc (dy, newsize*dy->elsize); 209 Dynarr_realloc (dy, newsize);
209 #else /* not NEW_GC */ 210 #else /* not NEW_GC */
210 Dynarr_realloc (dy, newsize*dy->elsize); 211 Dynarr_realloc (dy, newsize);
211 #endif /* not NEW_GC */ 212 #endif /* not NEW_GC */
212 dy->max = newsize; 213 dy->max = newsize;
213 } 214 }
214 } 215 }
215 216