*
* Memory routines with out-of-memory checking.
*
- * Copyright 1996 Derek B. Noonburg
+ * Copyright 1996-2003 Glyph & Cog, LLC
*/
+#include <aconf.h>
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#define gMemTrlSize (sizeof(long))
#if gmemTrlSize==8
-#define gMemDeadVal 0xdeadbeefdeadbeef
+#define gMemDeadVal 0xdeadbeefdeadbeefUL
#else
-#define gMemDeadVal 0xdeadbeef
+#define gMemDeadVal 0xdeadbeefUL
#endif
/* round data size so trailer will be aligned */
static int gMemIndex = 0;
static int gMemAlloc = 0;
+static int gMemInUse = 0;
#endif /* DEBUG_MEM */
GMemHdr *hdr;
void *data;
int lst;
- long *trl, *p;
+ unsigned long *trl, *p;
if (size == 0)
return NULL;
}
hdr = (GMemHdr *)mem;
data = (void *)(mem + gMemHdrSize);
- trl = (long *)(mem + gMemHdrSize + size1);
+ trl = (unsigned long *)(mem + gMemHdrSize + size1);
hdr->size = size;
hdr->index = gMemIndex++;
lst = ((int)hdr >> gMemListShift) & gMemListMask;
hdr->next = gMemList[lst];
gMemList[lst] = hdr;
++gMemAlloc;
- for (p = (long *)data; p <= trl; ++p)
+ gMemInUse += size;
+ for (p = (unsigned long *)data; p <= trl; ++p)
*p = gMemDeadVal;
return data;
#else
#endif
}
+void *gmallocn(int nObjs, int objSize) {
+ int n;
+
+ n = nObjs * objSize;
+ if (objSize == 0 || n / objSize != nObjs) {
+ fprintf(stderr, "Bogus memory allocation size\n");
+ exit(1);
+ }
+ return gmalloc(n);
+}
+
+void *greallocn(void *p, int nObjs, int objSize) {
+ int n;
+
+ n = nObjs * objSize;
+ if (objSize == 0 || n / objSize != nObjs) {
+ fprintf(stderr, "Bogus memory allocation size\n");
+ exit(1);
+ }
+ return grealloc(p, n);
+}
+
void gfree(void *p) {
#ifdef DEBUG_MEM
int size;
GMemHdr *hdr;
GMemHdr *prevHdr, *q;
int lst;
- long *trl, *clr;
+ unsigned long *trl, *clr;
if (p) {
hdr = (GMemHdr *)((char *)p - gMemHdrSize);
else
gMemList[lst] = hdr->next;
--gMemAlloc;
+ gMemInUse -= hdr->size;
size = gMemDataSize(hdr->size);
- trl = (long *)((char *)hdr + gMemHdrSize + size);
+ trl = (unsigned long *)((char *)hdr + gMemHdrSize + size);
if (*trl != gMemDeadVal) {
fprintf(stderr, "Overwrite past end of block %d at address %p\n",
hdr->index, p);
}
- for (clr = (long *)hdr; clr <= trl; ++clr)
+ for (clr = (unsigned long *)hdr; clr <= trl; ++clr)
*clr = gMemDeadVal;
free(hdr);
} else {