4 * Memory routines with out-of-memory checking.
6 * Copyright 1996 Derek B. Noonburg
16 typedef struct _GMemHdr {
19 struct _GMemHdr *next;
22 #define gMemHdrSize ((sizeof(GMemHdr) + 7) & ~7)
23 #define gMemTrlSize (sizeof(long))
26 #define gMemDeadVal 0xdeadbeefdeadbeef
28 #define gMemDeadVal 0xdeadbeef
30 /* round data size so trailer will be aligned */
31 #define gMemDataSize(size) \
32 ((((size) + gMemTrlSize - 1) / gMemTrlSize) * gMemTrlSize)
36 static GMemHdr *gMemList = NULL;
37 static int gMemIndex = 0;
38 static int gMemAlloc = 0;
41 void *gmalloc(int size) {
51 size1 = gMemDataSize(size);
52 if (!(mem = (char *)malloc(size1 + gMemHdrSize + gMemTrlSize))) {
53 fprintf(stderr, "Out of memory\n");
57 data = (void *)(mem + gMemHdrSize);
58 trl = (long *)(mem + gMemHdrSize + size1);
60 hdr->index = gMemIndex++;
64 for (p = (long *)data; p <= trl; ++p)
72 if (!(p = malloc(size))) {
73 fprintf(stderr, "Out of memory\n");
80 void *grealloc(void *p, int size) {
92 hdr = (GMemHdr *)((char *)p - gMemHdrSize);
95 memcpy(q, p, size < oldSize ? size : oldSize);
110 q = realloc(p, size);
114 fprintf(stderr, "Out of memory\n");
121 void gfree(void *p) {
125 GMemHdr *prevHdr, *q;
129 hdr = (GMemHdr *)((char *)p - gMemHdrSize);
130 for (prevHdr = NULL, q = gMemList; q; prevHdr = q, q = q->next) {
136 prevHdr->next = hdr->next;
138 gMemList = hdr->next;
140 size = gMemDataSize(hdr->size);
141 trl = (long *)((char *)hdr + gMemHdrSize + size);
142 if (*trl != gMemDeadVal) {
143 fprintf(stderr, "Overwrite past end of block %d at address %p\n",
146 for (clr = (long *)hdr; clr <= trl; ++clr)
150 fprintf(stderr, "Attempted to free bad address %p\n", p);
160 void gMemReport(FILE *f) {
163 fprintf(f, "%d memory allocations in all\n", gMemIndex);
165 fprintf(f, "%d memory blocks left allocated:\n", gMemAlloc);
166 fprintf(f, " index size\n");
167 fprintf(f, "-------- --------\n");
168 for (p = gMemList; p; p = p->next)
169 fprintf(f, "%8d %8d\n", p->index, p->size);
171 fprintf(f, "No memory blocks left allocated\n");
176 char *copyString(char *s) {
179 s1 = (char *)gmalloc(strlen(s) + 1);