// Copyright (C) 1994-1997 Microsoft Corporation. All rights reserved. #include "header.h" // our lame workshop relies on the old exported memory functions // so we have to keep exporting these but we will now implement these // using the CRT heap // #ifdef HHA #undef lcSize int STDCALL lcSize(void* pv) { return _msize(pv); } void* STDCALL rcalloc(int cb) { void* pv = lcMalloc( cb ); memset( pv, 0, cb ); return pv; } void STDCALL rfree(void* pv) { lcFree( pv ); } void STDCALL rclearfree(void** pv) { lcFree( *pv ); *pv = NULL; } void STDCALL rheapcheck() { } void* STDCALL rmalloc(int cb) { return lcMalloc( cb ); } void* STDCALL rrealloc(void* pv, int cb) { return lcReAlloc( pv, cb ); } #define lcSize(pv) _msize(pv) #endif #ifdef _DEBUG #undef THIS_FILE static const char THIS_FILE[] = __FILE__; #endif PSTR lcStrDup(PCSTR psz) { if (!psz) psz = ""; PSTR pszDup = (PSTR) lcMalloc(strlen(psz) + 1); return strcpy(pszDup, psz); } PWSTR lcStrDupW(PCWSTR psz) { if (!psz) psz = L""; int cb = (lstrlenW(psz)*sizeof(WCHAR)) + sizeof(WCHAR); PWSTR pszDup = (PWSTR) lcMalloc(cb); if (pszDup) CopyMemory(pszDup, psz, cb); return pszDup; } CMem::CMem(void) { pb = NULL; #ifndef HHCTRL psz = (PSTR) pb; #endif } CMem::CMem(int size) { _ASSERT(size > 0); pb = (PBYTE) lcMalloc(size); #ifndef HHCTRL psz = (PSTR) pb; #endif _ASSERT(pb); }; #ifndef HHCTRL int CMem::size(void) { return lcSize(pb); } void CMem::resize(int cb) { ReAlloc(cb); } #endif #ifdef HHCTRL #if _DEBUG /////////////////////////////////////////////////////////// // // The new heap status report... // // Following variables defined in CTable.cpp, _DEBUG only extern int g_cbTableAllocated; extern int g_cbTableReserved; extern int g_cTables; void OnReportMemoryUsage(void) { // Get the current memory state. _CrtMemState NewMemState ; _CrtMemCheckpoint(&NewMemState) ; char buf[4096] ; wsprintf(buf, "\tBlocks\tBytes\r\n\t------\t-----\r\n" "Free: \t%12ld\t%12ld\r\n" "Normal:\t%12ld\t%12ld\r\n" "CRT: \t%12ld\t%12ld\r\n" "Ignore:\t%12ld\t%12ld\r\n" "Client: \t%12ld\t%12ld\r\n\r\n" "Largest Used: %ld\r\n" "Total Allocations: %ld\r\n\r\nTables (%u): %d bytes\r\n" "Reserved: %d megs", NewMemState.lCounts[0], NewMemState.lSizes[0], NewMemState.lCounts[1], NewMemState.lSizes[1], NewMemState.lCounts[2], NewMemState.lSizes[2], NewMemState.lCounts[3], NewMemState.lSizes[3], NewMemState.lCounts[4], NewMemState.lSizes[4], NewMemState.lHighWaterCount, NewMemState.lTotalCount, g_cTables, g_cbTableAllocated, g_cbTableReserved / (1024*1024)) ; MsgBox(buf); // Dump it to the debug output. _CrtMemDumpStatistics(&NewMemState); } /////////////////////////////////////////////////////////// // // This class is used to initialize the CRT debug code. // class DebugAutoInitializer { public: //--- Place code to initialize the CRT debug code here. DebugAutoInitializer() { // Turn own automatic leak checking. int f = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG) ; f |= _CRTDBG_LEAK_CHECK_DF ; _CrtSetDbgFlag(f) ; //--- LineNumber to break on... (found in hhdebug.ini file) long BreakNumber = GetPrivateProfileInt( "CRT", "_CrtSetBreakAlloc", 0, "hhdebug.ini" ); if (BreakNumber) { _CrtSetBreakAlloc(BreakNumber) ; } } }; DebugAutoInitializer s_DebugAutoInitializer; #endif // _DEBUG #endif // HHCTRL