Back

#include <unistd.h>
#include <stdio.h>

#define NALLOC 1024
typedef long Align;

union header
 {
    struct {
             union header *ptr;
        unsigned size;
      } s;
    Align x;
 };

typedef union header Header;
static Header base;
static Header *freep = NULL;
void *malloc(unsigned nbytes);
void free(void *ap);
Header *morecore(unsigned);

int main()
{

 return 0;
}

void *malloc(unsigned nbytes)
{
   Header *p, *prevp;
   unsigned nunits;

   nunits = (nbytes + sizeof(Header) -1) / sizeof(Header) + 1;
   if ((prevp = freep) == NULL)
    {
       base.s.ptr = freep = prevp = &base;
       base.s.size = 0;
    }

   for (p=prevp->s.ptr;  ; prevp=p, p=p->s.ptr)
    if (p->s.size >= nunits)
      {
        if (p->s.size == nunits) prevp->s.ptr = p->s.ptr;
        else
          {
             p->s.size -= nunits;
             p += p->s.size;
             p->s.size = nunits;
          }
   freep = prevp;
   return (void *)(p+1);
 }
}

Header *morecore(unsigned nu)
{
  char *cp;
  Header *up;

  if (nu < NALLOC) nu = NALLOC;
  cp = sbrk(nu * sizeof(Header));
  if (cp == (char *) -1) return NULL;
  up = (Header *) cp;
  up->s.size = nu;
  free((void *)(up +1));
  return freep;
}

void free(void *ap)
{
  Header *bp, *p;
  bp = (Header *)ap - 1;
  for (p=freep; !(bp>p && bp<p->s.ptr); p=p->s.ptr)
   if (p >= p->s.ptr && (bp > p || bp < p->s.ptr)) break;

  if (bp + bp->s.size == p->s.ptr)
   {
     bp->s.size =+ p->s.ptr->s.size;
     bp->s.ptr = p->s.ptr->s.ptr;
   }
  else
    bp->s.ptr = p->s.ptr;

  if (p + p->s.size == bp)
   {
     p->s.size += bp->s.size;
     p->s.ptr = bp->s.ptr;
   }
  else
    p->s.ptr = bp;
  freep = p;
}

Top