/*
** vbcc-Amiga-PowerPC version of newmalloc.c
** utilizes the Amiga pooled memory functions
**
** v0.1 04.10.97 phx
*/

#include <stdlib.h>
#include <string.h>
#include <powerup/gcclib/powerup_protos.h>


size_t _nalloc=16384;
void *_first_mlist=0;

void _freemem(void)
/*  Gibt allen Speicher frei    */
{
    if(_first_mlist) PPCDeletePool(_first_mlist);
}
void *malloc(size_t nbytes)
{
    size_t *p;
    if(!nbytes) return(0);
    if(!_first_mlist) _first_mlist=PPCCreatePool(0,_nalloc,_nalloc);
    if(!_first_mlist) return(0);
    p=PPCAllocPooled(_first_mlist,nbytes+sizeof(size_t));
    if(!p) return(0);
    *p=nbytes;
    return(p+1);
}
void free(void *ap)
{
    size_t *p=ap;
    if(!p||!_first_mlist) return;
    p--;
    PPCFreePooled(_first_mlist,p,*p+sizeof(size_t));
}

void *realloc(void *old,size_t nsize)
{
    size_t osize;void *new;
    if(!old) return(malloc(nsize));
    osize=*((size_t *)old-1);
    if(new=malloc(nsize)){
        memcpy(new,old,osize>nsize ? nsize:osize);
        free(old);
    }
    return(new);
}
