Mercurial > hg > xemacs-beta
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 |