home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / CLIPPER / MISC / EMXLIB8F.ZIP / EMX / LIB / MALLOC / HEAPCHK.C < prev    next >
Encoding:
C/C++ Source or Header  |  1993-01-02  |  1.7 KB  |  78 lines

  1. /* heapchk.c (emx+gcc) -- Copyright (c) 1990-1993 by Eberhard Mattes */
  2.  
  3. #include <sys/emx.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6.  
  7. #if !defined (__MT__)
  8. static int dummy;
  9. #endif
  10.  
  11. #define HEAP_NO_FILL 0xf7dc6a4e /* illegal fill value */
  12.  
  13. static int _heapset2 (unsigned fill);
  14.  
  15.  
  16. int _heapchk (void)
  17. {
  18.   return (_heapset (HEAP_NO_FILL));
  19. }
  20.  
  21.  
  22. int _heapset (unsigned fill)
  23. {
  24.   int r;
  25.  
  26.   HEAP_LOCK;
  27.   r = _heapset2 (fill);
  28.   HEAP_UNLOCK;
  29.   return (r);
  30. }
  31.  
  32.  
  33. static int _heapset2 (unsigned fill)
  34. {
  35.   size_t *p, *last;
  36.   size_t len, next;
  37.   int met_rover;
  38.  
  39.   met_rover = 0;
  40.   if (rover == NULL && bottom == NULL && top == NULL)
  41.     return (_HEAPEMPTY);
  42.   if (rover == NULL || bottom == NULL || top == NULL)
  43.     return (_HEAPBADBEGIN);
  44.   if ((size_t)bottom >= (size_t)top)
  45.     return (_HEAPBADBEGIN);
  46.   if (((size_t)bottom & 3) != 0 || ((size_t)top & 3) != 0)
  47.     return (_HEAPBADBEGIN);
  48. #if !defined (__MT__)
  49.   if ((size_t)bottom <= (size_t)&dummy)
  50.     return (_HEAPBADBEGIN);
  51. #endif
  52.   last = sbrk (0);
  53.   if ((size_t)top >= (size_t)last)
  54.     return (_HEAPBADEND);
  55.   if (*top != END_OF_HEAP)
  56.     return (_HEAPBADEND);
  57.   p = bottom;
  58.   while (p != top)
  59.     {
  60.       if (*p == END_OF_HEAP)
  61.         return (_HEAPBADNODE);
  62.       len = *p;
  63.       if (len > 0x7fffffff)
  64.         return (_HEAPBADNODE);
  65.       next = (size_t)p + sizeof (size_t) + (len & ~3);
  66.       if (next <= (size_t)p || next > (size_t)top || (len & 2))
  67.         return (_HEAPBADNODE);
  68.       if (fill != HEAP_NO_FILL && (len & 1))
  69.         memset ((char *)p + sizeof (size_t), (int)fill, len & ~3);
  70.       if (p == rover)
  71.         ++met_rover;
  72.       p = (size_t *)next;
  73.     }
  74.   if (met_rover != 1)
  75.     return (_HEAPBADROVER);
  76.   return (_HEAPOK);
  77. }
  78.