@@ -9,6 +9,12 @@ extern void print_i(size_t);
9
9
#define print_i (X )
10
10
#endif
11
11
12
+ /* optional C stdlib integration */
13
+ #ifdef TA_USE_STDLIB
14
+ #include <errno.h>
15
+ #include <string.h>
16
+ #endif
17
+
12
18
typedef struct Block Block ;
13
19
14
20
struct Block {
@@ -227,9 +233,16 @@ void *ta_alloc(size_t num) {
227
233
if (block != NULL ) {
228
234
return block -> addr ;
229
235
}
236
+ #ifdef TA_USE_STDLIB
237
+ errno = ENOMEM ;
238
+ #endif
230
239
return NULL ;
231
240
}
232
241
242
+ #ifdef TA_USE_STDLIB
243
+ #define memclear (ptr , num ) memset((ptr), 0, (num))
244
+ #define memcopy (dst , src , num ) memcpy((dst), (src), (num))
245
+ #else
233
246
static void memclear (void * ptr , size_t num ) {
234
247
size_t * ptrw = (size_t * )ptr ;
235
248
size_t numw = (num & - sizeof (size_t )) / sizeof (size_t );
@@ -257,18 +270,22 @@ static void memcopy(void *dst, void *src, size_t num) {
257
270
* dstb ++ = * srcb ++ ;
258
271
}
259
272
}
273
+ #endif
260
274
261
275
void * ta_calloc (size_t num , size_t size ) {
262
276
size_t orig = num ;
263
277
num *= size ;
264
- if ( size != 0 && num / size != orig ) {
265
- return NULL ; // overflow
266
- }
267
- Block * block = alloc_block ( num );
268
- if (block != NULL ) {
269
- memclear ( block -> addr , block -> size ) ;
270
- return block -> addr ;
278
+ // check for overflow
279
+ if ( size == 0 || num / size == orig ) {
280
+ Block * block = alloc_block ( num );
281
+ if ( block != NULL ) {
282
+ memclear (block -> addr , block -> size );
283
+ return block -> addr ;
284
+ }
271
285
}
286
+ #ifdef TA_USE_STDLIB
287
+ errno = ENOMEM ;
288
+ #endif
272
289
return NULL ;
273
290
}
274
291
@@ -306,6 +323,9 @@ void *ta_realloc(void *ptr, size_t num) {
306
323
ta_free (ptr );
307
324
return block -> addr ;
308
325
}
326
+ #ifdef TA_USE_STDLIB
327
+ errno = ENOMEM ;
328
+ #endif
309
329
return NULL ;
310
330
}
311
331
0 commit comments