/*
    ####             #    #     # #
    #   #            #    #       #          The FreeWare C library for 
    #   #  ##   ###  #  # #     # ###             RISC OS machines
    #   # #  # #     # #  #     # #  #   ___________________________________
    #   # ####  ###  ##   #     # #  #                                      
    #   # #        # # #  #     # #  #    Please refer to the accompanying
    ####   ### ####  #  # ##### # ###    documentation for conditions of use
    ________________________________________________________________________

    File:    MemDefs.h
    Author:  Copyright  1993, 1995 Jason Williams and Jason Howat
    Version: 2.00 (18 Jun 1995)
    Purpose: Dynamic memory management
 */


#ifndef __Desk_memdef_h
#define __Desk_memdef_h

#include "Desk.Mem.h" 

typedef struct
{
  void **handle;                 /* The handle/anchor pointing to this block */
  int  prevrealsize;             /* Real block size of previous chunk        */
  int  realsize, datasize;       /* Chunk's real size and size of data-chunk */
} Desk_mem_header;


  extern Desk_mem_header *Desk_mem__lastchunk;
  extern int        Desk_mem__heap;
  extern int        Desk_mem__heapsize;
  extern int        Desk_mem__pagesize;
  extern int        Desk_mem__free;


/* Rounds an address up to the nearest word boundary */
#define WORDALIGN(ADDR) (((ADDR) + 3) & (~3))

/* Rounds a datasize up to the smallest realsize that fits it */
#define CHUNKSIZE(DATA) (((DATA) + 3 + sizeof(Desk_mem_header)) & (~3))

/* Returns Desk_bool_TRUE if the given chunk is free */
#define ISFREE(CHUNK) ((CHUNK)->datasize == 0)

extern int Desk_Mem__HeapSize(int heapsize);
extern void Desk_Mem__ReduceSlot(void);
extern Desk_mem_header *Desk_Mem__NextChunk(Desk_mem_header *chunk);
extern Desk_mem_header *Desk_Mem__PrevChunk(Desk_mem_header *chunk);
extern Desk_bool Desk_Mem__FindChunk(Desk_mem_anchor *anchor, Desk_mem_header **chunk);
extern void Desk_Mem__SplitOffFreeChunk(Desk_mem_header *chunk);
extern void Desk_Mem__ShuffleDown(Desk_mem_header *start, Desk_mem_header *end);
extern void Desk_Mem__ShuffleUp(Desk_mem_header *start, Desk_mem_header *end);
extern void Desk_Mem__Amalgamate(Desk_mem_header **chunk);


/* #define Desk_MEM__DEBUG to include code to have debugging
 * information printed on stderr
 */
#undef Desk_MEM__DEBUG


#endif
