windows-nt/Source/XPSP1/NT/base/mvdm/wow16/write/debug.c
2020-09-26 16:20:57 +08:00

377 lines
8.1 KiB
C
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/************************************************************/
/* Windows Write, Copyright 1985-1992 Microsoft Corporation */
/************************************************************/
/* DEBUG.C -- Diagnostic routines for WRITE */
#define NOCLIPBOARD
#define NOGDICAPMASKS
#define NOVIRTUALKEYCODES
#define NOWINSTYLES
#define NOSYSMETRICS
#define NOMENUS
#define NOKEYSTATE
#define NOSYSCOMMANDS
#define NOATOM
#define NODRAWTEXT
#define NOMETAFILE
#define NOOPENFILE
#define NOWH
#define NOWINOFFSETS
#define NOOPENFILE
#define NORECT
#define NOSOUND
#define NOCOMM
#include <windows.h>
#include "mw.h"
#define NOUAC
#include "cmddefs.h"
#include "wwdefs.h"
#include "filedefs.h"
#include "prmdefs.h"
#include "editdefs.h"
#include "docdefs.h"
extern struct WWD rgwwd[];
extern beep();
extern toggleProf();
#ifdef DEBUG
BOOL fDebugOut = TRUE;
fnTest()
{
beep();
TestFormat();
beep();
beep();
dbgWait(); /* for use by symdeb to check variables */
}
TestFormat()
{
//toggleProf();
}
dbgWait()
{
}
/* --- Integrity check for all piece tables in all docs --- */
CheckPctb()
{
extern int fnMac;
extern int fPctbCheck;
extern struct DOD (**hpdocdod) [];
extern struct FCB (**hpfnfcb) [];
extern int docMac;
int doc;
struct PCTB **hpctb;
struct PCTB *ppctb;
struct DOD *pdod;
struct PCD *ppcd;
int ipcd;
if (!fPctbCheck)
return;
for ( doc = 0, pdod = &(**hpdocdod) [0] ; doc < docMac; doc++, pdod++ )
if ((hpctb = pdod->hpctb) != 0)
{ /* Doc entry is nonempty -- check it */
ppctb = *hpctb;
/* # pieces used does not exceed # allocated */
Assert( ppctb->ipcdMac <= ppctb->ipcdMax );
Assert( ppctb->ipcdMac >= 1 );
#ifndef OURHEAP
/* handle contains enough space for pieces */
Assert( LocalSize( (HANDLE)hpctb ) >= sizeof (struct PCTB) +
(sizeof (struct PCD) * (ppctb->ipcdMax - cpcdInit)));
#endif
/* Now check the contents of the pieces */
{
/* cpMin of first piece is always 0 for nonnull piece table */
Assert( ppctb->rgpcd [0].cpMin == cp0 || ppctb->rgpcd [0].fn == fnNil);
for ( ipcd = 0, ppcd = &(ppctb->rgpcd [0]); ipcd < ppctb->ipcdMac;
ipcd++, ppcd++ )
{
int fn = ppcd->fn;
typeFC fc = ppcd->fc;
unsigned sprm;
struct FCB *pfcb;
if (fn == fnNil)
{ /* end piece */
/* first piece with fnNil is in fact the end piece */
/* Assert( ipcd == ppctb->ipcdMac - 1 ); */
/* end piece is intact */
Assert( bPRMNIL(ppcd->prm) );
break;
}
if (ipcd > 0)
/* Pieces are in ascending cp order */
Assert(ppcd->cpMin > (ppcd-1)->cpMin);
/* fn is valid */
Assert( (fn >= 0 && fn < fnMac) || fn == fnInsert );
pfcb = &(**hpfnfcb) [fn];
/* fn does not point to an unallocated fcb entry */
Assert( pfcb->rfn != rfnFree );
/* fc is reasonable for the fn */
Assert( fc >= 0 );
Assert( fc + (ppcd+1)->cpMin - ppcd->cpMin <= pfcb->fcMac );
/* prm is a valid value */
Assert( bPRMNIL(ppcd->prm) ||
(((struct PRM *) &ppcd->prm)->fComplex) ||
((sprm = ((struct PRM *) &ppcd->prm)->sprm) > 0 &&
sprm < sprmMax) );
}
}
}
}
/* COMM Output routines */
#define cchSzCommMax 100
static CHAR szCRLF[] = "\r\n";
BOOL vfCommDebug = fTrue; /* True for AUX, False for LPT */
#if WINVER < 0x300
/* This method isn't quite working under Win 3.0 ..pault */
void CommSz( CHAR * ); /* Main string output, defined in doslib.asm */
#else
void CommSz( psz )
register CHAR *psz;
{
CHAR szT[512];
char *pszT;
if (fDebugOut)
{
/* The following loops essentially copies psz to szT
but with the addition that chars > 127 are changed
to a representation readable on a dumb terminal, i.e.
ASCII 164 shows up as '{164}' ..pault */
for (pszT = szT; ; psz++)
{
if (*psz < 128)
*(pszT++) = *psz;
else
{
*(pszT++) = '{';
ncvtu((int) *psz, &pszT);
*(pszT++) = '}';
}
if (*psz == '\0') /* finally copied null terminator */
break;
}
OutputDebugString( (LPSTR) szT );
}
}
#endif
CommSzNum( sz, num )
CHAR *sz;
int num;
{
CHAR szBuf[ cchSzCommMax ];
CHAR *pch = szBuf;
Assert( CchSz( sz ) <= cchSzCommMax );
pch = &szBuf[ CchCopySz( sz, szBuf ) ];
ncvtu( num, &pch );
CchCopySz( szCRLF, pch );
CommSz( szBuf );
}
/* This is extremely useful when displaying coordinates
when the values are not in contiguous locations */
CommSzNumNum( sz, num, num2 )
CHAR *sz;
int num, num2;
{
CHAR szBuf[ cchSzCommMax ];
CHAR *pch = szBuf;
Assert( CchSz( sz ) <= cchSzCommMax );
pch = &szBuf[ CchCopySz( sz, szBuf ) ];
ncvtu( num, &pch );
*(pch++) = ' ';
ncvtu( num2, &pch );
CchCopySz( szCRLF, pch );
CommSz( szBuf );
}
CommSzRgNum( sz, rgw, cw)
CHAR *sz;
int *rgw;
int cw;
{
CHAR szBuf[ cchSzCommMax ];
CHAR *pch = szBuf;
Assert( CchSz( sz ) <= cchSzCommMax );
pch = &szBuf[ CchCopySz( sz, szBuf ) ];
for ( ; cw > 0; cw--)
{
ncvtu( *(rgw++), &pch );
*(pch++) = ' ';
}
CchCopySz( szCRLF, pch );
CommSz( szBuf );
}
CommSzSz( sz1, sz2 )
CHAR *sz1, *sz2;
{
CHAR szBuf[ cchSzCommMax ];
int cch;
Assert( CchSz( sz1 ) + CchSz( sz2 ) - 1 <= cchSzCommMax );
cch = CchCopySz( sz1, szBuf );
cch += CchCopySz( sz2, &szBuf[ cch ] );
CchCopySz( szCRLF, &szBuf[ cch ] );
CommSz( szBuf );
}
/* ASSERT */
Do_Assert(pch, line, f)
PCH pch;
int line;
BOOL f;
{
extern HWND vhWndMsgBoxParent;
extern FARPROC lpDialogAlert;
static CHAR szAssert[] = "Assertion failure in ";
static CHAR szLine[] = " at line ";
if (f)
return;
else
{
#ifdef OURHEAP
extern int cHpFreeze;
int cHpFreezeT = cHpFreeze;
#endif
CHAR szAlertMsg[50];
PCH pchtmp;
int cch;
int idi;
HWND hWndParent = (vhWndMsgBoxParent == NULL) ?
wwdCurrentDoc.wwptr : vhWndMsgBoxParent;
bltbc((PCH)szAlertMsg, 0, 50);
bltbyte((PCH)szAssert, (PCH)szAlertMsg, 21);
pchtmp = (PCH)&szAlertMsg[21];
bltbyte((PCH)pch, pchtmp, (cch = CchSz(pch) - 1));
pchtmp += cch;
bltbyte((PCH)szLine, pchtmp, 9);
pchtmp += 9;
ncvtu(line, (PCH)&pchtmp) - 1;
#ifdef OURHEAP
cHpFreeze = 0; /* So we don't panic in MdocLoseFocus */
#endif
do
{
idi = MessageBox( hWndParent, (LPSTR) szAlertMsg,
(LPSTR)"Assert",
MB_ABORTRETRYIGNORE | MB_SYSTEMMODAL);
switch (idi) {
default:
case IDABORT:
case IDCANCEL:
FatalExit( line );
break;
case IDIGNORE:
#ifdef OURHEAP
cHpFreeze = cHpFreezeT;
#endif
return;
case IDRETRY:
break;
}
} while (idi == IDRETRY);
} /* end else */
} /* end of _Assert */
ShowDocPcd(szID, doc)
CHAR *szID;
int doc;
{
struct PCTB **hpctb;
struct PCD *ppcdCur, *ppcdMac;
extern struct DOD (**hpdocdod)[];
hpctb = (**hpdocdod)[doc].hpctb;
ppcdCur = &(**hpctb).rgpcd[0];
ppcdMac = &(**hpctb).rgpcd[(**hpctb).ipcdMac];
for (; ppcdCur < ppcdMac; ppcdCur++)
{
ShowPpcd(szID, ppcdCur);
}
}
ShowPpcd(szID, ppcd)
CHAR *szID;
struct PCD *ppcd;
{
/* Dump a given piece descriptor on COM1: along with a
given an ID string. */
CommSz(szID);
CommSz("\r\n");
CommSzNum("ppcd: ", (int) ppcd);
CommSzNum("cpMin: ", (int) (ppcd->cpMin));
CommSzSz("fNoParaLast: ", (ppcd->fNoParaLast) ? "TRUE" : "FALSE");
CommSzNum("fn: ", (int) (ppcd->fn));
CommSzNum("fc: ", (int) (ppcd->fc));
CommSzNum("prm: ", (int) *((int *) &(ppcd->prm)));
}
#endif /* DEBUG */