#include "defs.h"

Prototype __regargs void  update_list(PE *);
Prototype __regargs void  del_prienv(PE *);
Prototype           void  cleanup(void);
Prototype __regargs void  FreeRem(LONG *);
Prototype __regargs void *AllocRem(PE *, LONG);


/***********************  del_prienv()  **************************/
__regargs void
del_prienv(PE *pe)
{
  Remove(pe);
  FreeRem(pe->memory);

  do_storage_str(NULL);
  update_list(NULL);
}


/***********************  update_list()  *****************************/
int stored = 0;

__regargs void
update_list(PE *pe)
{
  int *store = &stored;

  if (pe != NULL)
  {
    ++*store;
    Enqueue(&List_storage_list, pe);
  }

  GT_SetGadgetAttrs(Gad_storage_list, win, NULL,
                    GTLV_Labels, &List_storage_list,
                    TAG_END);
  if (pe == NULL)
  {
    --*store;

    if (*store < 9)
      DrawImage(win->RPort, images[*store], 205, 32);  /*  refresh logo  */

  }
}

/***********************  cleanup(void) ******************************/
void
cleanup(void)
{
  if (autom)                /*  last chance */
  {
    for (SHORT i = 0; i < 2; ++i)
      do_all(i);
  }
  PE *pe;
  pe  = (PE *)List_storage_list.mlh_Head;
  while (pe != (PE *)&List_storage_list.mlh_Tail)
  {
    PE *pet = pe->pe_node.ln_Succ;
    RemHead(&List_storage_list);
    FreeRem(pe->memory);
    pe  = pet;
  }
  close_prt();
}

/***********************  FreeRem  ******************************/
__regargs void                                /*  like free() */
FreeRem(LONG *memory)
{
  LONG *ptr;
  while(ptr = memory)
  {
    memory  = (LONG *)ptr[0];
    FreeMem(ptr, ptr[1]);
  }
}

/***********************  AllocRem ******************************/
__regargs void *                              /*  like malloc() */
AllocRem(PE *pe, LONG bytes)
{
  LONG *ptr;
  ptr = (LONG *)AllocMem(bytes + 8, MPC);
  if (ptr)
  {
    (LONG *)ptr[0] = pe->memory;
    pe->memory = ptr;
    ptr[1] = bytes + 8;
    ptr += 2;
    return((void *)ptr);
  }
  else
  {
    quit  = TRUE;
    autom = TRUE;
  }
}

