home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 199.lha / GimmeLib / memchain.c < prev    next >
C/C++ Source or Header  |  1988-12-27  |  2KB  |  104 lines

  1. /*
  2.  *  FILE: memchain.c
  3.  *  Support routines for chaining memory, anchored to a head which
  4.  *  points to the latest chunk of memory allocated.
  5.  *
  6.  *  Public Domain, but keep my name in it as the original author.
  7.  *  31-Aug-88    Jan Sven Trabandt   first release version
  8.  *  31-Oct-88    Jan Sven Trabandt   chainAllocMem acts like normal AllocMem
  9.  *                      if no memory-chain pointer given
  10.  *                    parameters checked in all these functions
  11.  */
  12.  
  13.  
  14. #include "gimmelib/gimmefuncs.h"
  15.  
  16.  
  17. struct memnode {
  18.    struct memnode *next;
  19.    ULONG size;
  20. };
  21.  
  22.  
  23. void *chainAllocMem( headptr, size, type )
  24.     struct memnode  **headptr;
  25.     ULONG   size;
  26.     ULONG   type;
  27. {
  28.     register struct memnode *p;
  29.  
  30.     if( !headptr ) {
  31.     p = AllocMem( size, type );
  32.     } else {
  33.     size += sizeof(struct memnode);
  34.     if( p = AllocMem(size, type) ) {
  35.         p->size = size;
  36.         p->next = *headptr;
  37.         *headptr = p;
  38.         ++p;            /* make p point to user's memory */
  39.     }
  40.     }
  41.     return( p );
  42. } /* chainAllocMem */
  43.  
  44.  
  45. VOID chainFreeMem( head )
  46.     register struct memnode *head;
  47. {
  48.     struct memnode  *p;
  49.  
  50.     while( head ) {
  51.     p = head->next;
  52.     FreeMem( head, head->size );
  53.     head = p;
  54.     }
  55. } /* chainFreeMem */
  56.  
  57.  
  58. short linkChainMem( headptr, head )
  59.     struct memnode  **headptr;
  60.     struct memnode  *head;
  61. {
  62.     register struct memnode *p;
  63.  
  64.     if( headptr && head ) {
  65.     p = head;
  66.     if( *headptr ) {
  67.         for( ; p->next; p = p->next ) {
  68.         } /* for */
  69.         p->next = *headptr;
  70.     }
  71.     *headptr = head;
  72.     }
  73.     return( 0 );
  74. } /* linkChainMem */
  75.  
  76.  
  77. short pluckChainMem( headptr, mem )
  78.     struct memnode  **headptr;
  79.     void        *mem;
  80. {
  81.     register struct memnode *p;
  82.     struct memnode        *mine;
  83.  
  84.     if( !headptr ) {
  85.     return( -1 );
  86.     }
  87.     if( mem && *headptr ) {
  88.     mine = (struct memnode *)( ((UBYTE *) mem) -
  89.                     (ULONG)sizeof(struct memnode) );
  90.     if( mine == *headptr ) {
  91.         *headptr = mine->next;
  92.     } else {
  93.         for( p = *headptr; p->next != mine; p = p->next ) {
  94.         if( !p->next ) {
  95.             return( -1 );           /* not in this chain */
  96.         }
  97.         } /* for */
  98.         p->next = mine->next;
  99.     }
  100.     FreeMem( mine, mine->size );
  101.     }
  102.     return( 0 );
  103. } /* pluckChainMem */
  104.