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.
208 lines
5.0 KiB
208 lines
5.0 KiB
#include <assert.h>
|
|
#include <iostream.h>
|
|
#include "CoComp.Hxx"
|
|
|
|
bool CompareBuffer( char* pBuff1, char* pBuff2, unsigned long nLen);
|
|
void WriteLine(HANDLE file, char* pBuff, int nLen);
|
|
extern unsigned long g_ulAppRetVal;
|
|
|
|
CCompareCoClass::CCompareCoClass(char* pCurBuf, char* pRefBuf, HANDLE fileDiff, char* pszClassName )
|
|
{
|
|
_pCurBuf = pCurBuf;
|
|
_pRefBuf = pRefBuf;
|
|
_fileDiff = fileDiff;
|
|
_pszClassName = pszClassName;
|
|
|
|
_pCurList = new CAutoArray<LINEINFO>;
|
|
_pRefList = new CAutoArray<LINEINFO>;
|
|
|
|
CreateLineIndex(_pCurList, _pCurBuf);
|
|
CreateLineIndex(_pRefList, _pRefBuf);
|
|
|
|
_bFirstTime = true;
|
|
}
|
|
|
|
CCompareCoClass::~CCompareCoClass()
|
|
{
|
|
delete _pCurList;
|
|
delete _pRefList;
|
|
}
|
|
|
|
void CCompareCoClass::FindAdditionsAndChanges()
|
|
{
|
|
long lIdx;
|
|
long lTmp;
|
|
LINEINFO lineCur;
|
|
LINEINFO lineRef;
|
|
|
|
char* szBuff = new char[128];
|
|
|
|
//check for additions and alterations
|
|
for ( lIdx = 0; lIdx< (int)_pCurList->Size(); lIdx++ )
|
|
{
|
|
_pCurList->GetAt( lIdx, &lineCur );
|
|
|
|
for ( lTmp=0; lTmp<_pRefList->Size(); lTmp++ )
|
|
{
|
|
_pRefList->GetAt( lTmp, &lineRef );
|
|
|
|
//compare the names of two methods to find if they are comparable
|
|
//in respect to other aspects of their declarations.
|
|
if (( !lineRef.fUsed ) &&
|
|
( CompareBuffer(&_pCurBuf[lineCur.ulNameStart],
|
|
&_pRefBuf[lineRef.ulNameStart],
|
|
max(lineCur.ulNameEnd-lineCur.ulNameStart,
|
|
lineRef.ulNameEnd-lineRef.ulNameStart)+ 1)))
|
|
{
|
|
//we have found a match. Mark it so that we don't compare anymore
|
|
lineRef.fUsed = true;
|
|
_pRefList->Set( lTmp, lineRef );
|
|
break;
|
|
}
|
|
|
|
lineRef.fUsed = false;
|
|
}
|
|
|
|
//did we find a match.
|
|
if ( lTmp == _pRefList->Size() )
|
|
{
|
|
char* pszName = new char[lineCur.ulNameEnd-lineCur.ulNameStart+1];
|
|
for (lTmp=lineCur.ulNameStart; lTmp<(long)lineCur.ulNameEnd; lTmp++)
|
|
{
|
|
pszName[lTmp-lineCur.ulNameStart] = _pCurBuf[lTmp];
|
|
}
|
|
pszName[lTmp-lineCur.ulNameStart] = 0;
|
|
|
|
//if it is the first time, put the banner in.
|
|
if ( _bFirstTime )
|
|
{
|
|
lstrcpy( szBuff, "\ncoclass ");
|
|
lstrcat( szBuff, _pszClassName);
|
|
lstrcat( szBuff, "\n-----------------------------\n" );
|
|
lstrcat( szBuff, "Additions and changes:" );
|
|
WriteLine( _fileDiff, szBuff, -1 );
|
|
_bFirstTime = false;
|
|
}
|
|
|
|
//this either has changed, or it's a new line.
|
|
lstrcpy( szBuff, _pszClassName);
|
|
lstrcat( szBuff, " : " );
|
|
lstrcat( szBuff, pszName );
|
|
lstrcat( szBuff, " added");
|
|
|
|
WriteLine( _fileDiff, szBuff, -1);
|
|
|
|
// ferhane: Although this is a change, it does not break COM rules.
|
|
// We need to return a success code but report anyway.
|
|
// g_ulAppRetVal |= CHANGE_ADDTOCOCLASS;
|
|
|
|
delete pszName;
|
|
}
|
|
}
|
|
|
|
delete [] szBuff;
|
|
}
|
|
|
|
void CCompareCoClass::FindRemovals()
|
|
{
|
|
long lIdx;
|
|
long lTmp;
|
|
LINEINFO lineRef;
|
|
char* szBuff = new char[128];
|
|
bool bFirstRemoval= true;
|
|
|
|
for ( lIdx=0; lIdx< (int)_pRefList->Size(); lIdx++ )
|
|
{
|
|
//get the record
|
|
_pRefList->GetAt( lIdx, &lineRef);
|
|
|
|
//is the record marked ?
|
|
if (!lineRef.fUsed)
|
|
{
|
|
//get the real name of the interface
|
|
char* pszName = new char[lineRef.ulNameEnd-lineRef.ulNameStart+1];
|
|
|
|
for (lTmp=lineRef.ulNameStart; lTmp<(long)lineRef.ulNameEnd; lTmp++)
|
|
{
|
|
pszName[lTmp-lineRef.ulNameStart] = _pRefBuf[lTmp];
|
|
}
|
|
pszName[lTmp-lineRef.ulNameStart] = 0; //terminate the string
|
|
|
|
//if it is the first time, put the banner in.
|
|
if ( _bFirstTime )
|
|
{
|
|
lstrcpy( szBuff, "coclass ");
|
|
lstrcat( szBuff, _pszClassName);
|
|
lstrcat( szBuff, "\n-----------------------------" );
|
|
WriteLine( _fileDiff, szBuff, -1 );
|
|
_bFirstTime = false;
|
|
}
|
|
|
|
if ( bFirstRemoval )
|
|
{
|
|
WriteLine( _fileDiff, "Removals:", -1);
|
|
bFirstRemoval = false;
|
|
}
|
|
|
|
lstrcpy( szBuff, _pszClassName );
|
|
lstrcat( szBuff, " : ");
|
|
lstrcat( szBuff, pszName );
|
|
lstrcat( szBuff, " has been removed." );
|
|
WriteLine( _fileDiff, szBuff, -1);
|
|
|
|
g_ulAppRetVal |= CHANGE_REMOVEFROMCOCLASS;
|
|
|
|
delete [] pszName;
|
|
|
|
WriteLine( _fileDiff, " ", -1 );
|
|
}
|
|
}
|
|
|
|
delete [] szBuff;
|
|
}
|
|
|
|
//
|
|
//
|
|
//
|
|
void CCompareCoClass::CreateLineIndex( CAutoArray<LINEINFO>* pList, char* pBuf)
|
|
{
|
|
LINEINFO lineinfo = {0};
|
|
|
|
unsigned long ulIdx = 0;
|
|
unsigned long ulLastSpace = 0;
|
|
char chSearch = '{'; //look for the start of the declaration
|
|
|
|
while ( pBuf[ulIdx] != 0 )
|
|
{
|
|
if ( pBuf[ulIdx] == chSearch )
|
|
{
|
|
switch (chSearch)
|
|
{
|
|
case '{':
|
|
ulIdx+=2; //skip over the CR/LF
|
|
|
|
//these values are not used and there is no need to use
|
|
//CPU time to set them.
|
|
// lineinfo.ulAttrStart = 0;
|
|
// lineinfo.ulAttrEnd = 0;
|
|
// lineinfo.ulParamStart=0;
|
|
// lineinfo.ulParamEnd=0;
|
|
|
|
lineinfo.ulNameStart = ulIdx+1;
|
|
chSearch = ';';
|
|
break;
|
|
|
|
case ';':
|
|
//finish logging this line
|
|
lineinfo.ulNameEnd = ulIdx;
|
|
pList->Append(lineinfo);
|
|
|
|
//prepare for the next line
|
|
ulIdx+=2;
|
|
lineinfo.ulNameStart = ulIdx+1;
|
|
break;
|
|
}
|
|
}
|
|
ulIdx++;
|
|
}
|
|
}
|