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.
 
 
 
 
 
 

290 lines
6.8 KiB

//-----------------------------------------------------------------------------
// MreLog.cpp
//
// Copyright (C) 1993, Microsoft Corporation
//
// Purpose:
// implement the logging feature of the MREngine.
//
// Functions/Methods present:
//
// Revision History:
//
// [] 1995-Jan-24 Dans Created
//
//-----------------------------------------------------------------------------
#include "pdbimpl.h"
#include "mrimpl.h"
#include <stdlib.h>
#include <share.h>
//
// static MreLog data
//
const _TCHAR MreLog::c_szLogName[] = _TEXT("/mr/log");
const _TCHAR MreLog::c_szCompilandFmt[] = _TEXT("-<>-<>-<>-<>-<>-<>-<>-\nCompiland '%s', Target '%s'\n");
const _TCHAR MreLog::c_szCompilandOptionsFmt[] = _TEXT("Options: '%s'\n");
const _TCHAR MreLog::c_szEndCompileFmt[] = _TEXT("Endcompile: Compiland '%s', Target '%s', success = %d\n");
const _TCHAR MreLog::c_szFilePushFmt[] = _TEXT("Push:'%s'\n");
const _TCHAR MreLog::c_szFilePopFmt[] = _TEXT("Pop:'%s'\n");
const _TCHAR MreLog::c_szClassFmt[] = _TEXT("Class: '%s'%sline=%u, ti=0x%04hx\n");
const _TCHAR MreLog::c_szClassChgFmt[] = _TEXT("Change: '%s'%s, chg=%s, tiPrev=0x%04x, tiCur=0x%04x\n");
const _TCHAR MreLog::c_szClassBoringFmt[] = _TEXT("Boring Class:'%s'\n");
const _TCHAR MreLog::c_szEnvVar[] = _TEXT("MRE_LOGGING");
const _TCHAR MreLog::c_szStream[] = _TEXT("stream");
const _TCHAR * MreLog::c_mpdeponsz[] = {
_TEXT(", "),
_TEXT(", (virtual) "),
_TEXT(", (shape) "),
_TEXT(", (shape|virtual) "),
};
const _TCHAR * MreLog::c_mpchgtypesz[] = {
_TEXT("'added'"),
_TEXT("'deleted'"),
_TEXT("'modified'")
};
BOOL
MreLog::FInit ( PMREngine pmre, BOOL fWriteMode ) {
_TCHAR szBuf[ 256 ];
precondition ( pmre );
pmre->QueryPdbApi ( m_ppdb, m_pnamemap );
assert ( m_ppdb );
assert ( m_pnamemap );
BOOL fClear = fFalse;
BOOL fRet = fFalse;
_TCHAR * szEnv = _tgetenv ( c_szEnvVar );
if ( szEnv ) {
// parse it for logging to a stream or filename
_stscanf ( szEnv, _TEXT("%[^;];%d"), szBuf, &fClear );
// never clear if we are not in write mode.
fClear = fWriteMode && fClear;
if ( _tcsicmp ( c_szStream, szBuf ) == 0 ) {
fRet = m_ppdb->OpenStream ( c_szLogName, &m_pstream );
if ( fClear ) {
m_pstream->Truncate ( 0 );
}
}
else {
m_pfile = _tfsopen ( szBuf, fClear ? _TEXT("wt") : _TEXT("at"), SH_DENYWR );
fRet = !!m_pfile;
}
}
m_fLogging = m_pstream || m_pfile;
return fRet;
}
void
MreLog::TranslateToText ( BOOL fClear, FILE * pfile ) {
}
void
MreLog::TranslateToText ( BOOL fClear, _TCHAR ** pptch ) {
}
// log a compile start
void
MreLog::LogCompiland ( NI niSrc, NI niTrg ) {
if ( FLogging() ) {
if ( m_pstream ) {
LogRecCompiland lrc(niSrc, niTrg);
m_pstream->Append ( &lrc, sizeof(lrc) );
}
else if ( m_pfile ) {
// convert to plain text
SZC szSrc = NULL;
SZC szTrg = NULL;
assert ( m_pnamemap );
m_pnamemap->getName ( niSrc, &szSrc );
m_pnamemap->getName ( niTrg, &szTrg );
_ftprintf ( m_pfile, c_szCompilandFmt, szSrc, szTrg );
}
}
}
// log a compiland options
void
MreLog::LogCompilandOptions ( NI niOpt ) {
if ( FLogging() ) {
if ( m_pstream ) {
LogRecCompilandOptions lrc(niOpt);
m_pstream->Append ( &lrc, sizeof(lrc) );
}
else if ( m_pfile ) {
// convert to plain text
SZC szOpt = NULL;
assert ( m_pnamemap );
m_pnamemap->getName ( niOpt, &szOpt );
_ftprintf ( m_pfile, c_szCompilandOptionsFmt, szOpt );
}
}
}
// log a compile end
void
MreLog::LogEndCompile ( NI niSrc, NI niTrg, BOOL fSuccess ) {
if ( FLogging() ) {
if ( m_pstream ) {
LogRecEndCompile lrec(niSrc, niTrg, fSuccess);
m_pstream->Append ( &lrec, sizeof(lrec) );
}
else if ( m_pfile ) {
// convert to plain text
SZC szSrc = NULL;
SZC szTrg = NULL;
assert ( m_pnamemap );
m_pnamemap->getName ( niSrc, &szSrc );
m_pnamemap->getName ( niTrg, &szTrg );
_ftprintf ( m_pfile, c_szEndCompileFmt, szSrc, szTrg, fSuccess );
}
}
}
// log a file push
void
MreLog::LogPush ( NI niFile ) {
if ( FLogging() ) {
if ( m_pstream ) {
LogRecPush lrp(niFile);
m_pstream->Append ( &lrp, sizeof(lrp) );
}
else if ( m_pfile ) {
// convert to plain text
SZC szDep = NULL;
assert ( m_pnamemap );
m_pnamemap->getName ( niFile, &szDep );
_ftprintf ( m_pfile, c_szFilePushFmt, szDep );
}
}
}
// log a file pop
void
MreLog::LogPop ( NI niFile ) {
if ( FLogging() ) {
if ( m_pstream ) {
LogRecPop lrp(niFile);
m_pstream->Append ( &lrp, sizeof(lrp) );
}
else if ( m_pfile ) {
// convert to plain text
SZC szDep = NULL;
assert ( m_pnamemap );
m_pnamemap->getName ( niFile, &szDep );
_ftprintf ( m_pfile, c_szFilePopFmt, szDep );
}
}
}
// log a boring class
void
MreLog::LogBoringClass ( NI niClass ) {
if ( FLogging() ) {
if ( m_pstream ) {
LogRecClassBoring lrcb(niClass);
m_pstream->Append ( &lrcb, sizeof(lrcb) );
}
else if ( m_pfile ) {
// convert to plain text
SZC szClass = NULL;
assert ( m_pnamemap );
m_pnamemap->getName ( niClass, &szClass );
_ftprintf ( m_pfile, c_szClassBoringFmt, szClass );
}
}
}
// log a class dependency
void
MreLog::LogClassDep (
NI niClass,
TI tiClass,
DWORD dwLine,
SZC szMember,
DEPON depon ) {
if ( FLogging() ) {
if ( m_pstream ) {
NI niMember;
assert ( m_pnamemap );
m_pnamemap->getNi ( szMember, &niMember );
LogRecClass lrc(niClass, tiClass, niMember, dwLine, depon);
m_pstream->Append ( &lrc, sizeof(lrc) );
}
else if ( m_pfile ) {
SZC szClass = NULL;
assert ( m_pnamemap );
m_pnamemap->getName ( niClass, &szClass );
_TCHAR szBuf[ 512 ] = { 0 };
_tcscpy ( szBuf, szClass );
if ( szMember ) {
_tcscat ( szBuf, _TEXT("' name: '") );
_tcscat ( szBuf, szMember );
_stprintf (
szBuf + _tcslen ( szBuf ),
_TEXT(" (hash:0x%03x)"),
ModHashSz ( szMember, cbitsName )
);
}
_ftprintf (
m_pfile,
c_szClassFmt,
szBuf,
c_mpdeponsz[ depon ],
dwLine,
tiClass
);
}
}
}
// log a change in a class
void
MreLog::LogClassChange (
ChgType chgtype,
NI niClass,
TI tiPrev,
TI tiCur,
NI niMember,
DEPON depon ) {
if ( FLogging() ) {
if ( m_pstream ) {
LogRecClassChange lrc(chgtype, niClass, tiPrev, tiCur, niMember, depon);
m_pstream->Append ( &lrc, sizeof(lrc) );
}
else if ( m_pfile ) {
SZC szClass = NULL;
SZC szMember = NULL;
assert ( m_pnamemap );
m_pnamemap->getName ( niClass, &szClass );
m_pnamemap->getName ( niMember, &szMember );
_TCHAR szBuf[ 1024 ] = { 0 };
_tcscpy ( szBuf, szClass );
if ( szMember ) {
_tcscat ( szBuf, _TEXT("::") );
_tcscat ( szBuf, szMember );
_stprintf (
szBuf + _tcslen ( szBuf ),
_TEXT(" (hash:0x%03x)"),
ModHashSz ( szMember, cbitsName )
);
}
_ftprintf (
m_pfile,
c_szClassChgFmt,
szBuf,
c_mpdeponsz[ depon ],
c_mpchgtypesz [ chgtype ],
tiPrev,
tiCur
);
}
}
}