Windows NT 4.0 source code leak
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.
 
 
 
 
 
 

452 lines
10 KiB

#include "sol.h"
#include <io.h>
#include <string.h>
#include "assert.h"
VSZASSERT
#ifdef DEBUG
MDBG rgmdbg[imdbgMax];
INT lvl = 0;
INT imdbgCur = 0;
VOID InitDebug()
{
INT imdbg;
MDBG *pmdbg;
for(imdbg = 0; imdbg < imdbgMax; imdbg++)
{
pmdbg = &rgmdbg[imdbg];
pmdbg->pgmcol = NULL;
pmdbg->lvl = 0;
pmdbg->msg = 0xcccc;
pmdbg->wp1 = 0xcccc;
pmdbg->wp2 = 0xcccc;
pmdbg->wResult = 0xcccc;
}
imdbgCur = 0;
lvl = 0;
}
WORD ILogMsg(VOID *pgmcol, INT msg, INT wp1, INT wp2, BOOL fGm)
{
MDBG *pmdbg;
INT imdbgRet;
Assert(FInRange(imdbgCur, 0, imdbgMax-1));
pmdbg = &rgmdbg[imdbgCur];
Assert(fGm == 0 || fGm == 1);
pmdbg->pgmcol = pgmcol;
pmdbg->msg = msg + (fGm << 15);
pmdbg->wp1 = wp1;
pmdbg->wp2 = wp2;
pmdbg->wResult = 0xcccc;
pmdbg->lvl = lvl;
lvl++;
imdbgRet = imdbgCur++;
imdbgCur %= imdbgMax;
Assert(FInRange(imdbgCur, 0, imdbgMax-1));
return imdbgRet;
}
VOID LogMsgResult(INT imdbg, INT wResult)
{
lvl--;
Assert(FInRange(imdbg, 0, imdbgMax-1));
rgmdbg[imdbg].wResult = wResult;
}
VOID WriteCrlf(INT fh)
{
_write(fh, "\x0d\n", 2);
}
VOID WriteSz(INT fh, CHAR *sz)
{
_write(fh, sz, strlen(sz));
WriteCrlf(fh);
}
VOID WriteIField(INT fh, CHAR *szField, INT ifld)
{
CHAR szBuf[128];
INT cch;
_write(fh, szField, strlen(szField));
_write(fh, " = ", 3);
cch = CchDecodeInt(szBuf, ifld);
_write(fh, szBuf, cch);
WriteCrlf(fh);
}
VOID DumpCol(INT fh, COL *pcol)
{
INT icrd;
MOVE *pmove;
WriteCrlf(fh);
WriteIField(fh, ">>> *pcol", (INT) pcol);
WriteIField(fh, "pcolcls->tcls", pcol->pcolcls->tcls);
WriteIField(fh, "icrdMac", pcol->icrdMac);
WriteIField(fh, "pmove", (INT) pcol->pmove);
if(pcol->pmove != NULL)
{
pmove = pcol->pmove;
WriteIField(fh, "pmove->icrdSel", pmove->icrdSel);
WriteIField(fh, "pmove->ccrdSel", pmove->ccrdSel);
WriteIField(fh, "pmove->delHit.x", pmove->delHit.dx);
WriteIField(fh, "pmove->delHit.y", pmove->delHit.dy);
WriteIField(fh, "pmove->fHdc", pmove->fHdc);
WriteIField(fh, "pmove->dyCol", pmove->dyCol);
WriteIField(fh, "pmove->hdcScreen", (INT)pmove->hdcScreen);
WriteIField(fh, "pmove->hdcCol", (INT)pmove->hdcCol);
WriteIField(fh, "pmove->hbmColOld", (INT)pmove->hbmColOld);
WriteIField(fh, "pmove->hdcScreenSave", (INT)pmove->hdcScreenSave);
WriteIField(fh, "pmove->hbmScreenSaveOld", (INT)pmove->hbmScreenSaveOld);
WriteIField(fh, "pmove->hdcT", (INT)pmove->hdcT);
WriteIField(fh, "pmove->hbmT", (INT)pmove->hbmT);
}
for(icrd = 0; icrd < pcol->icrdMac; icrd++)
{
WriteIField(fh, "\t-card ", icrd);
WriteIField(fh, "\t cd", pcol->rgcrd[icrd].cd);
WriteIField(fh, "\t fUp", pcol->rgcrd[icrd].fUp);
WriteIField(fh, "\t pt.x", pcol->rgcrd[icrd].pt.x);
WriteIField(fh, "\t pt.y", pcol->rgcrd[icrd].pt.y);
}
}
VOID DumpGm(INT fh, GM *pgm)
{
INT icol;
WriteIField(fh, "pgm", (INT) pgm);
WriteIField(fh, "udr.fAvail", pgm->udr.fAvail);
WriteIField(fh, "udr.sco", pgm->udr.sco);
WriteIField(fh, "udr.icol1", pgm->udr.icol1);
WriteIField(fh, "udr.icol2", pgm->udr.icol2);
WriteIField(fh, "udr.rgpcol[1]", (INT) pgm->udr.rgpcol[1]);
WriteIField(fh, "udr.rgpcol[2]", (INT) pgm->udr.rgpcol[2]);
WriteIField(fh, "fDealt", pgm->fDealt);
WriteIField(fh, "fWon", pgm->fWon);
WriteIField(fh, "fInput", pgm->fInput);
WriteIField(fh, "sco", pgm->sco);
WriteIField(fh, "iqsecScore", pgm->iqsecScore);
WriteIField(fh, "dqsecScore", pgm->dqsecScore);
WriteIField(fh, "ccrdDeal", pgm->ccrdDeal);
WriteIField(fh, "irep", pgm->irep);
WriteIField(fh, "ptMousePrev->x", pgm->ptMousePrev.x);
WriteIField(fh, "ptMousePrev->y", pgm->ptMousePrev.y);
WriteIField(fh, "fButtonDown", pgm->fButtonDown);
WriteIField(fh, "icolKbd", pgm->icolKbd);
WriteIField(fh, "icrdKbd", pgm->icrdKbd);
WriteIField(fh, "icolSel", pgm->icolSel);
WriteIField(fh, "icolHilight", pgm->icolHilight);
WriteIField(fh, "icolMac", pgm->icolMac);
WriteIField(fh, "icolMax", pgm->icolMax);
for(icol = 0; icol < pgm->icolMac; icol++)
DumpCol(fh, pgm->rgpcol[icol]);
}
CHAR *PchDecodeWp(CHAR *pch, INT wp)
{
INT icol;
if(pgmCur == NULL)
return pch;
if(wp == (INT) pgmCur)
return PszCopy("(pgmCur)", pch);
for(icol = 0; icol < pgmCur->icolMac; icol++)
{
if(wp == (INT) pgmCur->rgpcol[icol])
{
pch = PszCopy("(col ", pch);
pch += CchDecodeInt(pch, icol);
*pch++ = ')';
break;
}
}
return pch;
}
VOID DumpRgmdbg(CHAR *szFile, INT li)
{
OFSTRUCT of;
INT fh;
INT imdbg;
INT lvl;
MDBG *pmdbg;
CHAR szBuf[128];
CHAR *pch;
if((fh = (OpenFile("sol.dbg", &of, OF_CREATE|OF_WRITE))) == -1)
return;
WriteSz(fh, "Assertion Failure");
WriteIField(fh, szFile, li);
WriteSz(fh, szVer);
WriteIField(fh, "Game #", igmCur);
WriteCrlf(fh);
/* write game and col structs */
if(pgmCur != NULL)
DumpGm(fh, pgmCur);
imdbg = imdbgCur;
do
{
Assert(FInRange(imdbgCur, 0, imdbgMax-1));
pmdbg = &rgmdbg[imdbg];
Assert(pmdbg->lvl < 60);
for(lvl = 0; lvl < pmdbg->lvl; lvl++)
_write(fh, "\t", 1);
pch = PchDecodeWp(szBuf, (INT) pmdbg->pgmcol);
pmdbg->msg &= 0x7fff;
*pch++ = ' ';
pch += CchDecodeInt(pch, pmdbg->msg);
*pch++ = ',';
*pch++ = ' ';
pch += CchDecodeInt(pch, pmdbg->wp1);
pch = PchDecodeWp(pch, pmdbg->wp1);
*pch++ = ',';
*pch++ = ' ';
pch += CchDecodeInt(pch, pmdbg->wp2);
pch = PchDecodeWp(pch, pmdbg->wp2);
*pch++ = ' ';
*pch++ = '-';
*pch++ = '>';
*pch++ = ' ';
pch += CchDecodeInt(pch, pmdbg->wResult);
_write(fh, szBuf, pch-szBuf);
WriteCrlf(fh);
imdbg--;
if(imdbg < 0)
imdbg = imdbgMax-1;
Assert(FInRange(imdbg, 0, imdbgMax-1));
} while(imdbg != imdbgCur);
_close(fh);
}
/* Puts msg on bottom of screen. Useful because I don't have a debug console now */
VOID DisplayMsg(CHAR *sz, INT msgc, INT wp1, INT wp2)
{
INT y;
INT x;
HDC hdc;
INT cch;
CHAR szInt[20];
TEXTMETRIC tm;
if(fScreenShots)
return;
x = 0;
hdc = GetDC(hwndApp);
GetTextMetrics(hdc, (LPTEXTMETRIC)&tm);
y = 0;/* dyScreen - tm.tmHeight; */
TextOut(hdc, x, y, " ", 24);
TextOut(hdc, x, y, sz, cch = lstrlen(sz));
x += (cch+1) * tm.tmMaxCharWidth;
cch = CchDecodeInt(szInt, msgc);
TextOut(hdc, x, y, szInt, cch);
x += (cch+1) * tm.tmAveCharWidth;
cch = CchDecodeInt(szInt, wp1);
TextOut(hdc, x, y, szInt, cch);
x += (cch+1) * tm.tmAveCharWidth;
cch = CchDecodeInt(szInt, wp2);
TextOut(hdc, x, y, szInt, cch);
x += (cch+1) * tm.tmAveCharWidth;
ReleaseDC(hwndApp, hdc);
}
VOID PrintCardMacs(GM *pgm)
{
INT icol;
CHAR sz[20];
INT cch;
HDC hdc;
hdc = GetDC(hwndApp);
for(icol = 0; icol < pgm->icolMac; icol++)
{
cch = CchDecodeInt(sz, pgm->rgpcol[icol]->icrdMac);
TextOut(hdc, 30 * icol, 10, sz, cch);
}
ReleaseDC(hwndApp, hdc);
}
BOOL APIENTRY GameNo(HWND hdlg, INT iMessage, WPARAM wParam, LONG lParam)
{
BOOL fTranslated;
INT igmNext;
if (iMessage == WM_COMMAND)
{
if( GET_WM_COMMAND_ID( wParam, lParam ) == IDOK )
{
igmNext = GetDlgItemInt(hdlg, ideGameNoEdit, &fTranslated, fFalse);
if(fTranslated && igmNext >= 0)
igmCur = igmNext;
else
{
Error("Invalid game number");
return fFalse;
}
}
if(wParam == IDOK || wParam == IDCANCEL)
EndDialog(hdlg, wParam == IDOK);
return fTrue;
}
else if (iMessage == WM_INITDIALOG)
{
SetDlgItemInt(hdlg, ideGameNoEdit, igmCur, fFalse);
return fTrue;
}
else
return fFalse;
}
BOOL FSetGameNo()
{
BOOL fResult;
FARPROC lpprocGameNo;
lpprocGameNo = MakeProcInstance( (FARPROC)GameNo, hinstApp);
if(fResult = DialogBox(hinstApp,
MAKEINTRESOURCE(iddGameNo),
hwndApp,
(WNDPROC)lpprocGameNo))
srand(igmCur);
FreeProcInstance(lpprocGameNo);
return fResult;
}
BOOL FValidCol(COL *pcol)
{
INT icol;
if(pcol == NULL)
return fFalse;
for(icol = 0; icol < pgmCur->icolMax; icol++)
{
if(pcol == pgmCur->rgpcol[icol])
{
if(pcol->pcolcls == NULL)
return fFalse;
if(pcol->icrdMac > pcol->icrdMax)
return fFalse;
return fTrue;
}
}
return fFalse;
}
CHAR *vszFile;
INT vli;
CHAR vszLi[32];
BOOL APIENTRY AssertDlgProc(HANDLE hdlg, INT wm, INT wParam, LONG lParam)
{
switch(wm)
{
case WM_INITDIALOG:
SetWindowText(GetDlgItem(hdlg, FILE), vszFile);
CchDecodeInt(vszLi, vli);
SetWindowText(GetDlgItem(hdlg, LINE), vszLi);
CchDecodeInt(vszLi, igmCur);
SetWindowText(GetDlgItem(hdlg, GAMENO), vszLi);
/* SetWindowText(GetDlgItem(hdlg, SOLVERSION), szVer); */
break;
case WM_COMMAND:
switch( GET_WM_COMMAND_ID( wParam, lParam ))
{
default:
return fFalse;
case IDOK:
EndDialog(hdlg, 0);
break;
case EXIT:
EndDialog(hdlg, 1);
break;
}
break;
default:
return fFalse;
}
return fTrue;
}
VOID AssertFailed(CHAR *szFile, INT li)
{
INT f;
FARPROC lpprocAssert;
vszFile = szFile;
vli = li;
lpprocAssert = MakeProcInstance((FARPROC) AssertDlgProc, hinstApp);
f = DialogBox(hinstApp,
MAKEINTRESOURCE(ASSERTFAILED),
hwndApp,
(WNDPROC)lpprocAssert);
FreeProcInstance(lpprocAssert);
DumpRgmdbg(szFile, li);
}
#endif