You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
154 lines
3.3 KiB
154 lines
3.3 KiB
/************************************************************/
|
|
/* Windows Write, Copyright 1985-1992 Microsoft Corporation */
|
|
/************************************************************/
|
|
|
|
#define NOGDICAPMASKS
|
|
#define NOVIRTUALKEYCODES
|
|
#define NOWINMESSAGES
|
|
#define NOWINSTYLES
|
|
#define NOSYSMETRICS
|
|
#define NOMENUS
|
|
#define NOICON
|
|
#define NOKEYSTATE
|
|
#define NOSYSCOMMANDS
|
|
#define NOSHOWWINDOW
|
|
#define NOCTLMGR
|
|
#define NOCLIPBOARD
|
|
#define NOMSG
|
|
#define NOGDI
|
|
#define NOMB
|
|
#define NOSOUND
|
|
#define NOCOMM
|
|
#define NOPEN
|
|
#define NOBRUSH
|
|
#define NOFONT
|
|
#define NOWNDCLASS
|
|
#include <windows.h>
|
|
|
|
#include "mw.h"
|
|
/*
|
|
HeapManage.c - several routines to manage the heap, including changing
|
|
the finger table, compacting the heap in general, and checking the
|
|
heap for consistency.
|
|
It also contains the routines which were once in heapNew.
|
|
*/
|
|
#include "code.h"
|
|
#include "heapDefs.h"
|
|
#include "heapData.h"
|
|
#define NOSTRUNDO
|
|
#define NOSTRMERGE
|
|
#include "str.h"
|
|
#include "macro.h"
|
|
#define NOUAC
|
|
#include "cmddefs.h"
|
|
#include "filedefs.h"
|
|
#include "docdefs.h"
|
|
|
|
|
|
extern CHAR (*rgbp)[cbSector];
|
|
extern CHAR *rgibpHash;
|
|
extern struct BPS *mpibpbps;
|
|
extern int ibpMax;
|
|
extern int iibpHashMax;
|
|
extern int cwInitStorage;
|
|
extern typeTS tsMruBps;
|
|
|
|
|
|
FTryGrow(unsigned);
|
|
|
|
|
|
PFGR HAllocate(cwRequest)
|
|
unsigned cwRequest;
|
|
{
|
|
unsigned cb = cwRequest * sizeof(int);
|
|
HANDLE hTemp;
|
|
|
|
Assert(*(pLocalHeap+1) == 0);
|
|
|
|
if (cwRequest >= 0x8000)
|
|
{
|
|
#ifdef DEBUG
|
|
Assert(0);
|
|
ErrorWithMsg(IDPMTRottenFile, " heapMan#1");
|
|
#else
|
|
Error(IDPMTRottenFile);
|
|
#endif
|
|
return((PFGR)hOverflow);
|
|
}
|
|
|
|
hTemp = LocalAlloc(LHND, cb);
|
|
if (hTemp != NULL)
|
|
return((PFGR)hTemp);
|
|
else if (FTryGrow(cb))
|
|
{
|
|
return((PFGR)LocalAlloc(LHND, cb));
|
|
}
|
|
else
|
|
{
|
|
#ifdef DEBUG
|
|
ErrorWithMsg(IDPMTNoMemory, " heapMan#1");
|
|
#else
|
|
Error(IDPMTNoMemory);
|
|
#endif
|
|
return((PFGR)hOverflow);
|
|
}
|
|
}
|
|
|
|
FChngSizeH(pfgrChng, cwRequest, fShrink)
|
|
PFGR pfgrChng;
|
|
int cwRequest, fShrink;
|
|
{
|
|
unsigned cb = cwRequest * sizeof(int);
|
|
#ifdef DEBUG
|
|
PFGR pfgrNew;
|
|
#endif
|
|
|
|
Assert(*(pLocalHeap+1) == 0); /* Check for frozen heap */
|
|
Assert(cwRequest >= 0);
|
|
|
|
if ((
|
|
#ifdef DEBUG
|
|
pfgrNew =
|
|
#endif
|
|
(PFGR)LocalReAlloc( (HANDLE)pfgrChng, cb, LHND)) != NULL)
|
|
{
|
|
Assert( pfgrNew == pfgrChng ); /* Windows guarantees this for
|
|
movable objects */
|
|
return( TRUE );
|
|
}
|
|
else if (FTryGrow(cb))
|
|
{
|
|
#ifdef DEBUG
|
|
pfgrNew =
|
|
#endif
|
|
(PFGR)LocalReAlloc( (HANDLE)pfgrChng, cb, LHND);
|
|
Assert( pfgrNew != (PFGR)NULL );
|
|
Assert( pfgrNew == pfgrChng );
|
|
return( TRUE );
|
|
}
|
|
else
|
|
{
|
|
#ifdef DEBUG
|
|
ErrorWithMsg( IDPMTNoMemory, " heapMan#2" );
|
|
#else
|
|
Error( IDPMTNoMemory );
|
|
#endif
|
|
return( FALSE );
|
|
}
|
|
}
|
|
|
|
|
|
|
|
CHAR (**HszCreate(sz))[]
|
|
CHAR sz[];
|
|
{ /* Creates a heap block containing sz */
|
|
CHAR (**hsz)[];
|
|
int cch = CchSz(sz);
|
|
hsz = (CHAR (**)[]) HAllocate(CwFromCch(cch));
|
|
if (FNoHeap(hsz))
|
|
return (CHAR (**)[])hOverflow;
|
|
bltbyte(sz, **hsz, cch);
|
|
return hsz;
|
|
}
|
|
|
|
|