Serious-Engine/Sources/DecodeReport/DecodeReport.cpp
Ryan C. Gordon 24cb244d43 First attempt to hand-merge Ryan's Linux and Mac OS X port.
This was a _ton_ of changes, made 15 years ago, so there are probably some
problems to work out still.

Among others: Engine/Base/Stream.* was mostly abandoned and will need to be
re-ported.

Still, this is a pretty good start, and probably holds a world record for
lines of changes or something.  :)
2016-03-28 23:46:13 -04:00

138 lines
3.3 KiB
C++

/* Copyright (c) 2002-2012 Croteam Ltd. All rights reserved. */
// DecodeReport.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
void SubMain( int argc, char *argv[]);
int main( int argc, char *argv[])
{
CTSTREAM_BEGIN {
SubMain(argc, argv);
} CTSTREAM_END;
return 0;
}
void FindInMapFile(const CTFileName &fnSymbols, const CTString &strImage, ULONG ulSeg, ULONG ulOff, CTString &strFunction, SLONG &slDelta)
{
CTFileName fnmImage = strImage;
CTFileName fnmMap = fnSymbols+fnmImage.FileName()+".map";
strFunction = CTString("<not found in '")+fnmMap+"'>";
try {
CTFileStream strmMap;
strmMap.Open_t(fnmMap, CTStream::OM_READ);
// find beginning of functions in map file
for(;;) {
if (strmMap.AtEOF()) {
return;
}
// read the line
CTString strLine;
strmMap.GetLine_t(strLine);
if (strncmp(strLine, " Address", 9)==0) {
break;
}
}
CTString strEmpty;
strmMap.GetLine_t(strEmpty);
while (!strmMap.AtEOF()) {
// read the line
CTString strLine;
strmMap.GetLine_t(strLine);
char strFunctionLine[1024];
strFunctionLine[0]=0;
ULONG ulSegLine=-1;
ULONG ulOfsLine=-1;
strLine.ScanF("%x:%x %s", &ulSegLine, &ulOfsLine, strFunctionLine);
if (ulSegLine!=ulSeg) {
continue;
}
if (ulOfsLine>ulOff) {
return;
}
strFunction = strFunctionLine;
slDelta = ulOff-ulOfsLine;
}
} catch (char *strError) {
(void)strError;
return;
}
}
void SubMain( int argc, char *argv[])
{
printf("\nDecodeReport - '.RPT' file decoder V1.0\n");
printf( " (C)1999 CROTEAM Ltd\n\n");
if( argc!=3+1)
{
printf( "USAGE:\nDecodeReport <infilename> <outfilename> <symbolsdir>\n");
exit( EXIT_FAILURE);
}
// initialize engine
SE_InitEngine(argv[0], "");
_fnmApplicationPath = CTString("");
CTFileName fnSrc = CTString(argv[1]);
CTFileName fnDst = CTString(argv[2]);
CTFileName fnSymbols = CTString(argv[3]);
try
{
if (fnSrc==fnDst) {
throw "Use different files!";
}
CTFileStream strmSrc;
strmSrc.Open_t(fnSrc, CTStream::OM_READ);
CTFileStream strmDst;
strmDst.Create_t(fnDst);
// while there is some line in src
while(!strmSrc.AtEOF()) {
// read the line
CTString strLine;
strmSrc.GetLine_t(strLine);
// try to find address marker in it
char *strAdr = strstr(strLine, "$adr:");
// if there is no marker
if (strAdr==NULL) {
// just copy the line
strmDst.PutLine_t(strLine);
// if there is marker
} else {
// parse the line
char strImage[1024];
strImage[0]=0;
ULONG ulSegment=-1;
ULONG ulOffset=-1;
sscanf(strAdr, "$adr: %s %x:%x", strImage, &ulSegment, &ulOffset);
// find the function
CTString strFunction;
SLONG slDelta;
FindInMapFile(fnSymbols, CTString(strImage), ulSegment, ulOffset, strFunction, slDelta);
// out put the result
CTString strResult;
strResult.PrintF("%s (%s+0X%X)", strLine, strFunction, slDelta);
strmDst.PutLine_t(strResult);
}
}
}
catch(char *strError)
{
printf("\nError: %s\n", strError);
exit(EXIT_FAILURE);
}
}