home *** CD-ROM | disk | FTP | other *** search
/ BCI NET 2 / BCI NET 2.iso / archives / programming / c / hce.lha / HCE / LibSource / clib / Misc / src / malloc.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-09-02  |  1.8 KB  |  116 lines

  1. /*
  2.  * malloc.c: Amiga version is quite a bit simpler than gem version.
  3.  *          15May89 - Created by Jeff Lydiatt
  4.  */
  5.  
  6. #include <exec/types.h>
  7. #include <stddef.h>
  8. #include <exec/memory.h>
  9.  
  10. typedef struct memchunk {
  11.     struct memchunk    *next;
  12.     struct memchunk    *prev;
  13.     long         size;
  14. } MEMCHUNK;
  15.  
  16. extern char *AllocMem();
  17. extern void FreeMem();
  18. extern void  (*_freeall)();
  19. void freeall(); /* forward reference */
  20.  
  21. static MEMCHUNK sentinel;
  22.  
  23. char *
  24. lalloc( size )
  25. unsigned long size;
  26. {
  27.     register MEMCHUNK *mp;
  28.     register unsigned long chunksize;    
  29.  
  30.     if (sentinel.prev == NULL) { /* 'Sozobon-C won't allow static def*/
  31.         sentinel.prev = &sentinel;
  32.         sentinel.next = &sentinel;
  33.     }
  34.  
  35.     chunksize = size + sizeof(MEMCHUNK);
  36.     mp = (MEMCHUNK *)AllocMem( chunksize, MEMF_CLEAR);
  37.     if ( mp == NULL )
  38.         return NULL;
  39.  
  40.     /*
  41.      * Keep the forward and backward links.
  42.      */
  43.  
  44.     sentinel.prev->next = mp;
  45.     mp->prev = sentinel.prev;
  46.     sentinel.prev = mp;
  47.  
  48.     mp->next = &sentinel;
  49.     mp->size = chunksize;
  50.     _freeall = freeall;
  51.     return ++mp;
  52. }
  53.  
  54. char *malloc(size)
  55. unsigned int size;
  56. {
  57.     return(lalloc((long)size));
  58. }
  59.  
  60.  
  61. void
  62. free( p )
  63. char *p;
  64. {
  65.     register MEMCHUNK *mp, *prevmp, *nextmp;
  66.     long Output();
  67.  
  68.     mp = (MEMCHUNK *)(p - sizeof(MEMCHUNK));
  69.  
  70.     /*
  71.      * Sanity check: the prev link should point to us. Do nothing if bad.
  72.      */
  73.  
  74.     prevmp = mp->prev;
  75.     nextmp = mp->next;
  76.     if ( prevmp->next != mp ) {
  77.         return;
  78.     }
  79.  
  80.     FreeMem( mp, mp->size );
  81.     prevmp->next = nextmp;
  82.     nextmp->prev = prevmp;
  83.  
  84.     return;
  85. }
  86.  
  87. char *calloc(n, size)
  88. unsigned int n;
  89. size_t size;
  90. {
  91.     register long total;
  92.     register char *p, *q;
  93.  
  94.     total = (((long) n) * ((long) size));
  95.     if(p = lalloc(total))
  96.         for(q=p; total--; *q++ = 0)
  97.             ;
  98.     return(p);
  99. }
  100.  
  101. /*
  102.  * Called by exit() to free any allocated memory.
  103.  */
  104.  
  105. static void
  106. freeall()
  107. {
  108.     register MEMCHUNK    *mp, *mp1;
  109.  
  110.     for ( mp = sentinel.prev; mp != &sentinel; ) {
  111.         mp1 = mp->prev;
  112.         FreeMem( mp, mp->size );
  113.         mp = mp1;
  114.     }
  115. }
  116.