@@ -9,6 +9,12 @@ extern void print_i(size_t);
99#define print_i (X )
1010#endif
1111
12+ /* optional C stdlib integration */
13+ #ifdef TA_USE_STDLIB
14+ #include <errno.h>
15+ #include <string.h>
16+ #endif
17+
1218typedef struct Block Block ;
1319
1420struct Block {
@@ -227,9 +233,16 @@ void *ta_alloc(size_t num) {
227233 if (block != NULL ) {
228234 return block -> addr ;
229235 }
236+ #ifdef TA_USE_STDLIB
237+ errno = ENOMEM ;
238+ #endif
230239 return NULL ;
231240}
232241
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
233246static void memclear (void * ptr , size_t num ) {
234247 size_t * ptrw = (size_t * )ptr ;
235248 size_t numw = (num & - sizeof (size_t )) / sizeof (size_t );
@@ -257,18 +270,22 @@ static void memcopy(void *dst, void *src, size_t num) {
257270 * dstb ++ = * srcb ++ ;
258271 }
259272}
273+ #endif
260274
261275void * ta_calloc (size_t num , size_t size ) {
262276 size_t orig = num ;
263277 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+ }
271285 }
286+ #ifdef TA_USE_STDLIB
287+ errno = ENOMEM ;
288+ #endif
272289 return NULL ;
273290}
274291
@@ -306,6 +323,9 @@ void *ta_realloc(void *ptr, size_t num) {
306323 ta_free (ptr );
307324 return block -> addr ;
308325 }
326+ #ifdef TA_USE_STDLIB
327+ errno = ENOMEM ;
328+ #endif
309329 return NULL ;
310330}
311331
0 commit comments