/***************************************************
 *                                                 *
 *      *** HAPPy Pascal Compiler ***              *
 *         作業用heapメモリ管理処理                *
 *                                                 *
 *         Copyright (c) H.Asano 1992              *
 *                                                 *
 ***************************************************/
 
#define EXTERN extern
 
#define Maxheap       32768             /* 最大heapメモリ量           */

#include <malloc.h>
#include <stdlib.h>
#include "pascomp.h"


extern void pcerr(int,char*) ;
extern void term(void) ;

static char *topheap  ;                 /* 今のheapメモリ先頭         */
static size_t total  = 0 ;              /* 確保量累計                 */


/***************************************/
/* initheap() : 初期メモリ一括確保処理 */
/***************************************/
void initheap(void)
{
     topheap = (char*)malloc(Maxheap);  /* 一括確保する               */
     if(topheap == nil) {
      pcerr(700,"");
      term() ;
     }
}

/**************************************/
/*    Malloc() : メモリ確保処理       */
/**************************************/
void *Malloc(size_t size)
{
  void *adr ;

     adr  = (void*)topheap   ;
     size = (size+1)/2 * 2   ;
     topheap  += size ;
     total    += size ;
     if(Maxheap >= total) return(adr);  /* メモリ割当が可能な時       */
     else {                             /* 割当不可能の時             */
      pcerr(700,"") ;                   /*   作業エリア確保失敗       */
      term()        ;                   /*   終了処理                 */
     }
}

/**************************************/
/*  mark() : 一括解放ﾎﾟｲﾝﾄマーク処理  */
/**************************************/
void *mark(void)
{
     return((void*)topheap) ;
}

/**************************************/
/*    release() : 一括解放処理        */
/**************************************/
void release(void *adr)
{
     total   -= (size_t)(topheap - (char*)adr) ;
     topheap =  (char*)adr ;
}
