
 /* SV_MemSubs.c
    - Memory Management Routines for SVO-Support -
    (c) 1990-93 by Andreas R. Kleinert
    Last changes : 16.12.1993
 */

#include "svobject.h"

/* OK */

 /* Memory-Support-Functions */

struct AIM_MemList * __saveds __stdargs AIM_GetMemList(void);
void	             __saveds __stdargs AIM_FreeMemList(struct AIM_MemList *MemList);
long		     __saveds __stdargs AIM_AddMemEntry(struct AIM_MemList *mlist, APTR pointer, long size);
APTR		     __saveds __stdargs AIM_AllocMemEntry(struct AIM_MemList *mlist, ULONG size, ULONG type);


struct AIM_MemList * __saveds __stdargs AIM_GetMemList(void)
{
 struct AIM_MemList  *MemList = N;
 struct List	    *samelist = N;

 samelist = (struct List *) AllocVec(sizeof(struct AIM_MemList), MEMF_CLEAR);
 if(samelist)
  {
   MemList = (APTR) samelist;

   MemList->ml_NumEntries = 0;

   samelist->lh_Head	 = (struct Node *) &(samelist->lh_Tail);
   samelist->lh_Tail	 = N;
   samelist->lh_TailPred = (struct Node *) &(samelist->lh_Head);
   samelist->lh_Type	 = NT_UNKNOWN;
  }else return(NULL);

 return(MemList);
}

void __saveds __stdargs AIM_FreeMemList(struct AIM_MemList *MemList)
{
 struct AIM_MemEntry *entry;

 if(MemList)
  {
   for(entry=(APTR) MemList->ml_EntryList.lh_Head;(entry)&&(entry!=(APTR) &(MemList->ml_EntryList.lh_Tail));)
    {
     Remove((APTR) entry);
     FreeVec(entry->MemPointer);
     FreeVec(entry);
     entry = (APTR) MemList->ml_EntryList.lh_Head;
    }

   FreeVec(MemList);
  }
}

long __saveds __stdargs AIM_AddMemEntry(struct AIM_MemList *mlist, APTR pointer, long size)
{
 struct AIM_MemEntry *entry;

 if(!mlist || !pointer || !size) return(FALSE);

 entry = (APTR) AllocVec(sizeof(struct AIM_MemEntry), (MEMF_CLEAR|MEMF_PUBLIC));
 if(!entry)
  {
   FreeVec(pointer);
   return(FALSE);
  }

 mlist->ml_NumEntries++;

 entry->MemPointer = pointer;

 AddHead((APTR)mlist, (APTR)entry);

 return(TRUE);
}

APTR __saveds __stdargs AIM_AllocMemEntry(struct AIM_MemList *mlist, ULONG size, ULONG type)
{
 APTR alloc;

 alloc = AllocVec(size, type);
 if(!alloc) return(N);

 if(!AIM_AddMemEntry(mlist, alloc, size))
  {
   FreeVec(alloc); alloc = N;
  }

 return(alloc);
}
