Listing 5 The srbk and rbrk Functions

#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;
       }
}