@@ -243,6 +243,21 @@ static void memclear(void *ptr, size_t num) {
243
243
}
244
244
}
245
245
246
+ static void memcopy (void * dst , void * src , size_t num ) {
247
+ size_t * dstw = (size_t * )dst ;
248
+ size_t * srcw = (size_t * )src ;
249
+ size_t numw = (num & - sizeof (size_t )) / sizeof (size_t );
250
+ while (numw -- ) {
251
+ * dstw ++ = * srcw ++ ;
252
+ }
253
+ num &= (sizeof (size_t ) - 1 );
254
+ uint8_t * dstb = (uint8_t * )dstw ;
255
+ uint8_t * srcb = (uint8_t * )srcw ;
256
+ while (num -- ) {
257
+ * dstb ++ = * srcb ++ ;
258
+ }
259
+ }
260
+
246
261
void * ta_calloc (size_t num , size_t size ) {
247
262
size_t orig = num ;
248
263
num *= size ;
@@ -251,7 +266,44 @@ void *ta_calloc(size_t num, size_t size) {
251
266
}
252
267
Block * block = alloc_block (num );
253
268
if (block != NULL ) {
254
- memclear (block -> addr , num );
269
+ memclear (block -> addr , block -> size );
270
+ return block -> addr ;
271
+ }
272
+ return NULL ;
273
+ }
274
+
275
+ size_t ta_getsize (void * ptr ) {
276
+ if (ptr == NULL ) {
277
+ return 0 ;
278
+ }
279
+ Block * block = heap -> used ;
280
+ while (block != NULL ) {
281
+ if (ptr == block -> addr ) {
282
+ return block -> size ;
283
+ }
284
+ block = block -> next ;
285
+ }
286
+ return 0 ;
287
+ }
288
+
289
+ void * ta_realloc (void * ptr , size_t num ) {
290
+ if (ptr == NULL ) {
291
+ return ta_alloc (num );
292
+ } else if (num == 0 ) {
293
+ ta_free (ptr );
294
+ return NULL ;
295
+ }
296
+ size_t size = ta_getsize (ptr );
297
+ if (num <= size && size - num <= heap_split_thresh ) {
298
+ return ptr ; // keep current block
299
+ }
300
+ Block * block = alloc_block (num );
301
+ if (block != NULL ) {
302
+ if (size > num ) {
303
+ size = num ;
304
+ }
305
+ memcopy (block -> addr , ptr , size );
306
+ ta_free (ptr );
255
307
return block -> addr ;
256
308
}
257
309
return NULL ;
0 commit comments