memchk.c
资源名称:c.rar [点击查看]
上传用户:shmaik
上传日期:2014-06-01
资源大小:45093k
文件大小:3k
源码类别:

VC书籍

开发平台:

C/C++

  1. static char rcsid[] = "$Id: H:/drh/idioms/book/RCS/mem.doc,v 1.12 1997/10/27 23:08:05 drh Exp $";
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include "assert.h"
  5. #include "except.h"
  6. #include "mem.h"
  7. union align {
  8. #ifdef MAXALIGN
  9. char pad[MAXALIGN];
  10. #else
  11. int i;
  12. long l;
  13. long *lp;
  14. void *p;
  15. void (*fp)(void);
  16. float f;
  17. double d;
  18. long double ld;
  19. #endif
  20. };
  21. #define hash(p, t) (((unsigned long)(p)>>3) & 
  22. (sizeof (t)/sizeof ((t)[0])-1))
  23. #define NDESCRIPTORS 512
  24. #define NALLOC ((4096 + sizeof (union align) - 1)/ 
  25. (sizeof (union align)))*(sizeof (union align))
  26. const Except_T Mem_Failed = { "Allocation Failed" };
  27. static struct descriptor {
  28. struct descriptor *free;
  29. struct descriptor *link;
  30. const void *ptr;
  31. long size;
  32. const char *file;
  33. int line;
  34. } *htab[2048];
  35. static struct descriptor freelist = { &freelist };
  36. static struct descriptor *find(const void *ptr) {
  37. struct descriptor *bp = htab[hash(ptr, htab)];
  38. while (bp && bp->ptr != ptr)
  39. bp = bp->link;
  40. return bp;
  41. }
  42. void Mem_free(void *ptr, const char *file, int line) {
  43. if (ptr) {
  44. struct descriptor *bp;
  45. if (((unsigned long)ptr)%(sizeof (union align)) != 0
  46. || (bp = find(ptr)) == NULL || bp->free)
  47. Except_raise(&Assert_Failed, file, line);
  48. bp->free = freelist.free;
  49. freelist.free = bp;
  50. }
  51. }
  52. void *Mem_resize(void *ptr, long nbytes,
  53. const char *file, int line) {
  54. struct descriptor *bp;
  55. void *newptr;
  56. assert(ptr);
  57. assert(nbytes > 0);
  58. if (((unsigned long)ptr)%(sizeof (union align)) != 0
  59. || (bp = find(ptr)) == NULL || bp->free)
  60. Except_raise(&Assert_Failed, file, line);
  61. newptr = Mem_alloc(nbytes, file, line);
  62. memcpy(newptr, ptr,
  63. nbytes < bp->size ? nbytes : bp->size);
  64. Mem_free(ptr, file, line);
  65. return newptr;
  66. }
  67. void *Mem_calloc(long count, long nbytes,
  68. const char *file, int line) {
  69. void *ptr;
  70. assert(count > 0);
  71. assert(nbytes > 0);
  72. ptr = Mem_alloc(count*nbytes, file, line);
  73. memset(ptr, '', count*nbytes);
  74. return ptr;
  75. }
  76. static struct descriptor *dalloc(void *ptr, long size,
  77. const char *file, int line) {
  78. static struct descriptor *avail;
  79. static int nleft;
  80. if (nleft <= 0) {
  81. avail = malloc(NDESCRIPTORS*sizeof (*avail));
  82. if (avail == NULL)
  83. return NULL;
  84. nleft = NDESCRIPTORS;
  85. }
  86. avail->ptr  = ptr;
  87. avail->size = size;
  88. avail->file = file;
  89. avail->line = line;
  90. avail->free = avail->link = NULL;
  91. nleft--;
  92. return avail++;
  93. }
  94. void *Mem_alloc(long nbytes, const char *file, int line){
  95. struct descriptor *bp;
  96. void *ptr;
  97. assert(nbytes > 0);
  98. nbytes = ((nbytes + sizeof (union align) - 1)/
  99. (sizeof (union align)))*(sizeof (union align));
  100. for (bp = freelist.free; bp; bp = bp->free) {
  101. if (bp->size > nbytes) {
  102. bp->size -= nbytes;
  103. ptr = (char *)bp->ptr + bp->size;
  104. if ((bp = dalloc(ptr, nbytes, file, line)) != NULL) {
  105. unsigned h = hash(ptr, htab);
  106. bp->link = htab[h];
  107. htab[h] = bp;
  108. return ptr;
  109. } else
  110. {
  111. if (file == NULL)
  112. RAISE(Mem_Failed);
  113. else
  114. Except_raise(&Mem_Failed, file, line);
  115. }
  116. }
  117. if (bp == &freelist) {
  118. struct descriptor *newptr;
  119. if ((ptr = malloc(nbytes + NALLOC)) == NULL
  120. ||  (newptr = dalloc(ptr, nbytes + NALLOC,
  121. __FILE__, __LINE__)) == NULL)
  122. {
  123. if (file == NULL)
  124. RAISE(Mem_Failed);
  125. else
  126. Except_raise(&Mem_Failed, file, line);
  127. }
  128. newptr->free = freelist.free;
  129. freelist.free = newptr;
  130. }
  131. }
  132. assert(0);
  133. return NULL;
  134. }