Skip to content

Commit fce0c31

Browse files
committed
Optional better C stdlib integration
- Optionally set errno to ENOMEM when out of memory - Optionally use memset() to implement memclear() - Optionally use memcpy() to implement memcopy()
1 parent 44c4678 commit fce0c31

File tree

1 file changed

+27
-7
lines changed

1 file changed

+27
-7
lines changed

tinyalloc.c

Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
1218
typedef struct Block Block;
1319

1420
struct 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
233246
static 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

261275
void *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

Comments
 (0)