home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / CPM / BDSC / BDSC-4 / BDSLIB.ARK / MALLOC.C < prev    next >
Text File  |  1983-07-15  |  2KB  |  111 lines

  1. /*
  2.  * malloc
  3.  * This is exactly the same as the alloc() function provided in BDS C.
  4.  * It conforms very closely to the function in the Version 7 U**X C
  5.  * Library.
  6.  * Last Edit 7/1/83
  7.  */
  8.  
  9. char *
  10. malloc(nbytes)
  11. unsigned nbytes;
  12. {
  13.     struct _header *p, *q, *cp;
  14.     int nunits; 
  15.     nunits = 1 + (nbytes + (sizeof (_Base) - 1)) / sizeof (_Base);
  16.     if ((q = _allocp) == NULL) {
  17.         _Base._ptr = _allocp = q = &_Base;
  18.         _Base._size = 0;
  19.      }
  20.     for (p = q -> _ptr; ; q = p, p = p -> _ptr) {
  21.         if (p -> _size >= nunits) {
  22.             if (p -> _size == nunits)
  23.                 q -> _ptr = p -> _ptr;
  24.             else {
  25.                 p -> _size -= nunits;
  26.                 p += p -> _size;
  27.                 p -> _size = nunits;
  28.              }
  29.             _allocp = q;
  30.             return p + 1;
  31.          }
  32.         if (p == _allocp) {
  33.             if ((cp = sbrk(nunits * sizeof (_Base))) == ERROR)
  34.                 return NULL;
  35.             cp -> _size = nunits; 
  36.             free(cp+1);    /* remember: pointer arithmetic! */
  37.             p = _allocp;
  38.         }
  39.      }
  40. }
  41.  
  42. /*
  43.  * calloc
  44.  * Allocate space with zero fill for `n' items of size 'size'. Conforms
  45.  * closely to the function in the Version 7 U**X Standard Library.
  46.  * Last Edit 7/1/83
  47.  */
  48.  
  49. char *
  50. calloc(n,size)
  51. int n, size;
  52. {
  53.     char *valp;
  54.     int i;
  55.     i = n*size;
  56.  
  57.     if ((valp=malloc(i)) == NULL) return NULL;
  58.     while (--i >= 0) valp[i] = '\0';
  59.     return(valp);
  60. }
  61.  
  62. /*
  63.  * realloc
  64.  * This function increases the size of a contiguous space previously
  65.  * allocated using calloc() or malloc(). It conforms exactly to the
  66.  * function in the Version 7 U**X Library. Note that the old space
  67.  * should be freed just prior to calling realloc().
  68.  * Last Edit 7/1/83
  69.  */
  70.  
  71. char *
  72. realloc(ptr, size)
  73. char *ptr;
  74. unsigned size;
  75. {
  76.     char *nptr;
  77.  
  78.     if ((nptr = calloc(size,1)) == NULL)
  79.         return 0;
  80.     movmem(ptr, nptr, size);
  81.     return nptr;
  82. }
  83.  
  84. /*
  85.  * free
  86.  * This function is essentially the same as the function in
  87.  * the BDS C Standard Library.
  88.  * Last Edit 7/1/83
  89.  */
  90.  
  91. free(ap)
  92. struct _header *ap;
  93. {
  94.     struct _header *p, *q;
  95.     p = ap - 1;
  96.     for (q = _allocp; !(p > q && p < q->_ptr); q = q->_ptr)
  97.         if (q >= q->_ptr && (p > q || p < q->_ptr))
  98.             break;
  99.     if (p + p->_size == q->_ptr) {
  100.         p->_size += q->_ptr->_size;
  101.         p->_ptr = q->_ptr->_ptr;
  102.     }
  103.     else p->_ptr = q->_ptr;
  104.     if (q + q->_size == p) {
  105.         q->_size += p->_size;
  106.         q->_ptr = p->_ptr;
  107.     }
  108.     else q->_ptr = p;
  109.     _allocp = q;
  110. }
  111.