home *** CD-ROM | disk | FTP | other *** search
- /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
- * |_o_o|\\ Copyright (c) 1989 The Software Distillery. *
- * |. o.| || All Rights Reserved *
- * | . | || Written by Doug Walker *
- * | o | || The Software Distillery *
- * | . |// 235 Trillingham Lane *
- * ====== Cary, NC 27513 *
- * BBS:(919)-471-6436 *
- \* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
- #include "mempriv.h"
-
- extern struct MWGlobal mwg;
-
- void *MWAllocMem(size, flags, file, line)
- long size, flags;
- char *file;
- long line;
- {
- struct MWAlc *hd;
- char *tmpchar;
- int memtype;
-
- if(!(mwg.flags & MWF_ACTIVE)) return(NULL);
- if(!(mwg.flags & MWF_NOCHECK)) MWCheck();
-
- memtype = (flags & MEMF_CHIP ? MWT_CHIP : MWT_FAST);
- if(mwg.sum[memtype] + size > mwg.lim[memtype])
- {
- /* Over the limit, fail it */
- if(mwg.dbfh)
- {
- MSG(mwg.dbfh, "MemWatch: ");
- if(memtype == MWT_CHIP)
- MSG(mwg.dbfh, "CHIP ");
- else
- MSG(mwg.dbfh, "FAST ");
- MSG(mwg.dbfh, "memory allocation exceeds MWLimit amount\n");
- }
- return(NULL);
- }
-
- while(!(tmpchar = (char *)AllocMem(sizeof(struct MWAlc)+size, flags)))
- {
- if(mwg.freed) MWPurge();
- else return(NULL);
- }
-
- hd = (struct MWAlc *)tmpchar;
- hd->size = size;
- hd->flags = flags;
- hd->myflags = 0L;
- hd->file = file;
- hd->line = line;
- memcpy((char *)&hd->header, MWHEADER, 4);
- tmpchar += (sizeof(struct MWAlc)+size-4);
- memcpy(tmpchar, MWTRAILER, 4);
- if(!(flags & MEMF_CLEAR) && !(mwg.flags & MWF_NOATRASH))
- memset(hd->memory, MWATRASH, size); /* Trash the memory */
-
- hd->next = mwg.first;
- mwg.first = hd;
-
- if((mwg.sum[memtype] += size) > mwg.max[memtype])
- mwg.max[memtype] = mwg.sum[memtype];
- ++(mwg.num[memtype]);
-
- return((char *)hd->memory);
- }
-
- void MWFreeMem(mem, size, internal)
- void *mem;
- long size;
- int internal;
- {
- struct MWAlc *mwa, *prev;
- int memtype;
- int error = 0;
-
- if(!(mwg.flags & MWF_ACTIVE)) return;
- if(!(mwg.flags & MWF_NOCHECK)) MWCheck();
-
- for(prev = NULL, mwa = mwg.first;
- mwa && mwa->memory != mem;
- prev = mwa, mwa = mwa->next);
-
- if(!mwa)
- {
- if(mwg.dbfh)
- MWPrint(NULL, 1, (LONG)mem, size);
- error = 1;
- }
- else if(!internal && mwa->size != size)
- {
- if(mwg.dbfh)
- {
- MWPrint(NULL, 2, size, 0);
- MWPrint(mwa, 0, 0, 0);
- }
- error = 1;
- }
-
- if(error)
- {
- MWHold();
- return;
- }
-
- memtype = (mwa->flags & MEMF_CHIP ? MWT_CHIP : MWT_FAST);
- mwg.sum[memtype] -= mwa->size;
- --mwg.num[memtype];
-
- if(prev) prev->next = mwa->next;
- else mwg.first = mwa->next;
-
- if(!(mwg.flags & MWF_NOFTRASH))
- memset(mwa->memory, MWFTRASH, mwa->size); /* Trash it */
-
- if(mwg.flags & MWF_NOFKEEP)
- FreeMem((char *)mwa, size + sizeof(struct MWAlc));
- else
- {
- mwa->next = mwg.freed;
- mwg.freed = mwa;
- }
- }