home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Club Amiga de Montreal - CAM
/
CAM_CD_1.iso
/
files
/
199.lha
/
GimmeLib
/
memchain.c
< prev
next >
Wrap
C/C++ Source or Header
|
1988-12-27
|
2KB
|
104 lines
/*
* FILE: memchain.c
* Support routines for chaining memory, anchored to a head which
* points to the latest chunk of memory allocated.
*
* Public Domain, but keep my name in it as the original author.
* 31-Aug-88 Jan Sven Trabandt first release version
* 31-Oct-88 Jan Sven Trabandt chainAllocMem acts like normal AllocMem
* if no memory-chain pointer given
* parameters checked in all these functions
*/
#include "gimmelib/gimmefuncs.h"
struct memnode {
struct memnode *next;
ULONG size;
};
void *chainAllocMem( headptr, size, type )
struct memnode **headptr;
ULONG size;
ULONG type;
{
register struct memnode *p;
if( !headptr ) {
p = AllocMem( size, type );
} else {
size += sizeof(struct memnode);
if( p = AllocMem(size, type) ) {
p->size = size;
p->next = *headptr;
*headptr = p;
++p; /* make p point to user's memory */
}
}
return( p );
} /* chainAllocMem */
VOID chainFreeMem( head )
register struct memnode *head;
{
struct memnode *p;
while( head ) {
p = head->next;
FreeMem( head, head->size );
head = p;
}
} /* chainFreeMem */
short linkChainMem( headptr, head )
struct memnode **headptr;
struct memnode *head;
{
register struct memnode *p;
if( headptr && head ) {
p = head;
if( *headptr ) {
for( ; p->next; p = p->next ) {
} /* for */
p->next = *headptr;
}
*headptr = head;
}
return( 0 );
} /* linkChainMem */
short pluckChainMem( headptr, mem )
struct memnode **headptr;
void *mem;
{
register struct memnode *p;
struct memnode *mine;
if( !headptr ) {
return( -1 );
}
if( mem && *headptr ) {
mine = (struct memnode *)( ((UBYTE *) mem) -
(ULONG)sizeof(struct memnode) );
if( mine == *headptr ) {
*headptr = mine->next;
} else {
for( p = *headptr; p->next != mine; p = p->next ) {
if( !p->next ) {
return( -1 ); /* not in this chain */
}
} /* for */
p->next = mine->next;
}
FreeMem( mine, mine->size );
}
return( 0 );
} /* pluckChainMem */