//+--------------------------------------------------------------------------- // // Copyright (C) Microsoft Corporation, 1997. // // debug.c // // Debug build support routines. // // History: // Mon Jun 02 17:07:23 1997 -by- Drew Bliss [drewb] // Created // //---------------------------------------------------------------------------- #include "precomp.h" #pragma hdrstop #include #include #if DBG static void printNormalFloat( float fval ) { int logi, logval_i, logval_f; float logval, logf; int negative=0; if( fval < (float) 0.0 ) negative = 1; fval = __GL_ABSF(fval); logval = (float) (log( fval ) / log( 10 )); logi = (int) logval; logf = logval - logi; if( (logval <= (float) 0) && (logf != (float) 0.0) ) { logi -= 1; logf += (float) 1.0; } logval = (float) pow(10,logf); if( negative ) DbgPrint( "-" ); #if 0 DbgPrint( "%fE%d", logval, logi ); #else logval_i = (int) logval; logval_f = (int) ((logval - (float) logval_i) * (float) 10000.0 + (float) 0.5); DbgPrint( "%d.%dE%d", logval_i, logval_f, logi ); #endif } void printFloat( char *comment, void *mval, int printHex ) { // IEEE single format: sign bits : 1 // exponent : 7 // fraction : 24 // Representation: low word : Fraction low // high word : 0-6: Fraction high // 7-14: Exponent // 15: Sign char *ploww, *phighw; short loww, highw; long lval = 0, fraction; int sign, exponent; float fval; ploww = (char *) mval; phighw = (char *) ((char *) mval) + 2; memcpy( &loww, ploww, 2 ); memcpy( &highw, phighw, 2 ); memcpy( &lval, mval, 4 ); sign = (highw & 0x8000) >> 15; fraction = lval & 0x007fffff; exponent = (highw & 0x7f80) >> 7; DbgPrint( "%s", comment ); if( printHex ) DbgPrint( "0x%x, ", lval ); if( exponent == 255 ) { if( fraction == 0 ) { if( sign ) DbgPrint( "-" ); DbgPrint( "infinity" ); } else DbgPrint( "NaN" ); } else if( exponent == 0 ) { if( fraction == 0 ) DbgPrint( "0.0" ); else { memcpy( &fval, mval, 4 ); printNormalFloat( fval ); } } else { memcpy( &fval, mval, 4 ); printNormalFloat( fval ); } } /*****************************************************************************\ * DbgPrintFloat * * Prints floating point numbers from within server, in exponent notation with * 4 significant digits (e.g 1.7392E-23). Also prints string preceeding number. * Checks for deviant cases, such as NaN's or infinity. * \*****************************************************************************/ void DbgPrintFloat( char *comment, float fval ) { printFloat( comment, &fval, 0 ); } /*****************************************************************************\ * DbgPrintFloatP * * Same as DbgPrintFloat, but takes a pointer to the float to print. Also * prints out the hex representation of the float. * Used in cases where the float may not be a valid float. * \*****************************************************************************/ void DbgPrintFloatP( char *comment, void *mval ) { printFloat( comment, mval, 1 ); } #if defined(VERBOSE_DDSLOCK) // // Define DDGLOCK if you know the location of the DDraw global lock // (DDRAW!CheapMutexCrossProcess) and want to see its counts. // typedef struct _DDRAW_GLOBAL_LOCK { LONG LockCount; LONG RecursionCount; DWORD Tid; DWORD Pid; } DDRAW_GLOBAL_LOCK; // #define DDGLOCK ((DDRAW_GLOBAL_LOCK *)0x76959048) /******************************Public*Routine******************************\ * * DDSLOCK * * Tracks DirectDraw surface locks * * History: * Wed May 28 13:42:23 1997 -by- Drew Bliss [drewb] * Created * \**************************************************************************/ HRESULT dbgDdsLock(LPDIRECTDRAWSURFACE pdds, DDSURFACEDESC *pddsd, DWORD flags, char *file, int line) { HRESULT hr; #ifdef DDGLOCK volatile DDRAW_GLOBAL_LOCK *glock = DDGLOCK; #endif DbgPrint("%2X:Lock %08lX %4d:%s\n", GetCurrentThreadId(), pdds, line, file); #ifdef DDGLOCK DbgPrint(" %2d %2d %2X\n", glock->LockCount, glock->RecursionCount, glock->Tid); #endif hr = pdds->lpVtbl->Lock(pdds, NULL, pddsd, flags, NULL); #ifdef DDGLOCK DbgPrint(" %2d %2d %2X\n", glock->LockCount, glock->RecursionCount, glock->Tid); #endif return hr; } /******************************Public*Routine******************************\ * * DDSUNLOCK * * Tracks DirectDrawSurface unlocks * * History: * Wed May 28 13:42:39 1997 -by- Drew Bliss [drewb] * Created * \**************************************************************************/ HRESULT dbgDdsUnlock(LPDIRECTDRAWSURFACE pdds, void *ptr, char *file, int line) { HRESULT hr; #ifdef DDGLOCK volatile DDRAW_GLOBAL_LOCK *glock = DDGLOCK; LONG preLock; #endif DbgPrint("%2X:Unlk %08lX %4d:%s\n", GetCurrentThreadId(), pdds, line, file); #ifdef DDGLOCK DbgPrint(" %2d %2d %2X\n", glock->LockCount, glock->RecursionCount, glock->Tid); preLock = glock->LockCount; #endif hr = pdds->lpVtbl->Unlock(pdds, ptr); #ifdef DDGLOCK DbgPrint(" %2d %2d %2X\n", glock->LockCount, glock->RecursionCount, glock->Tid); if (preLock <= glock->LockCount) { DebugBreak(); } #endif return hr; } #endif // VERBOSE_DDSLOCK #endif // DBG #ifdef _WIN95_ // Provide a DbgPrint implementation on Win95 since the system's doesn't // do anything. ULONG DbgPrint(PCH Format, ...) { char achMsg[256]; va_list vlArgs; va_start(vlArgs, Format); _vsnprintf(achMsg, sizeof(achMsg), Format, vlArgs); va_end(vlArgs); OutputDebugString(achMsg); return TRUE; } #endif // _WIN95_