

#include <stdlib.h>
/**
*
* name      sbrk -- Adjust linear heap break pointer
*           rbrk -- Reset linear heap
*
* synopsis  b = sbrk(n);
*           rbrk();
*           void *b;            block address
*           int n;              number of bytes
*
* description   This is an implementation of sbrk/rbrk
*               based upon the ANSI memory allocation
*               routines. Note that it uses a public
*               item named _LHINCR to define the
*               default size of the linear heap. This
*               size is used to allocate space via
*               malloc on the first call to sbrk
*               unless the requested size is larger.
*
**/
#define SBRK_ERR (void *)(-1)
/**
*
* Linear heap parameters
*
**/
unsigned _LHINCR = 8192;  // allocation size of
                             linear heap

static char *base = 0;    // base of linear heap
static unsigned size;     // size of linear heap
static unsigned xbrk = 0; // current break index
/**
*
* Allocate space from the linear heap.
*
**/
void *sbrk(int n)
{
unsigned x;

if(base == 0)
        {
        if(n <= 0) return(SBRK_ERR);
        size = (n > _LHINCR) ? n : _LHINCR;
        base = malloc(size);
        if(base == 0)
                {
                size = 0;
                return(SBRK_ERR);
                }
        xbrk = 0;
        }
if(n < 0)
        {
        if((xbrk + n) < 0) return(SBRK_ERR);
        }
else
        {
        if((xbrk + n) > size) return(SBRK_ERR);
        }
x = xbrk;
xbrk += n;
if(n > 0) memset(&base[x],0,n);
return(&base[x]);
}
/**
*
* Reset the linear heap
*
**/
void rbrk(void)
{
if(base != 0) 
        {
        free(base);
        base = 0;
        size = 0;
        xbrk = 0;
        }
}


