#include <sys/mman.h>
#include <unistd.h>
void *mmalloc(int size){
register int *res = mmap(0,size+4,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANONYMOUS,0,0);
if(res == -1){
perror("malloc: ");
exit(-1);
}
*res=size;
return &res[1];
}
void mfree(void *p){
register int *mem = p;
mem--;
//munmap(mem, 4+*mem);
mprotect(mem, *mem, PROT_NONE);
}
void *mrealloc(void *p, int size){
register int *mem = p;
int oldsize;
mem--;
oldsize = 4 + *mem;
mem = mremap(mem, oldsize, size+4, 1);
*mem = size;
return (void *)&mem[1];
}
void *mcalloc(int num, int size){
register void *p;
size *= num;
if ((p = mmalloc(size)))
memset(p, 0, size);
return (p);
}