23 lines
440 B
C
23 lines
440 B
C
#include <stdlib.h>
|
|
#include <errno.h>
|
|
#include <string.h>
|
|
|
|
void *calloc(size_t m, size_t n)
|
|
{
|
|
void *p;
|
|
size_t *z;
|
|
if (n && m > (size_t)-1/n) {
|
|
errno = ENOMEM;
|
|
return 0;
|
|
}
|
|
n *= m;
|
|
p = malloc(n);
|
|
if (!p) return 0;
|
|
/* Only do this for non-mmapped chunks */
|
|
if (((size_t *)p)[-1] & 7) {
|
|
/* Only write words that are not already zero */
|
|
m = (n + sizeof *z - 1)/sizeof *z;
|
|
for (z=p; m; m--, z++) if (*z) *z=0;
|
|
}
|
|
return p;
|
|
}
|