247 lines
6.1 KiB
C++
247 lines
6.1 KiB
C++
|
//
|
||
|
// MODULE: APGTSTSCREAD.CPP
|
||
|
//
|
||
|
// PURPOSE: TSC file reading classes
|
||
|
//
|
||
|
// COMPANY: Saltmine Creative, Inc. (206)-284-7511 support@saltmine.com
|
||
|
//
|
||
|
// AUTHOR: Randy Biley
|
||
|
//
|
||
|
// ORIGINAL DATE: 01-19-1999
|
||
|
//
|
||
|
// NOTES:
|
||
|
//
|
||
|
// Version Date By Comments
|
||
|
//--------------------------------------------------------------------
|
||
|
// V3.0 01-19-1999 RAB
|
||
|
//
|
||
|
|
||
|
#include "stdafx.h"
|
||
|
#include "apgtstscread.h"
|
||
|
#include "CharConv.h"
|
||
|
#include "event.h"
|
||
|
|
||
|
|
||
|
// Utilize an unnamed namespace to limit scope to this source file
|
||
|
namespace
|
||
|
{
|
||
|
const CString kstr_CacheSig= _T("TSCACH03");
|
||
|
const CString kstr_MapFrom= _T("MAPFROM ");
|
||
|
const CString kstr_NodeStateDelim= _T(":");
|
||
|
const CString kstr_NodePairDelim= _T(",");
|
||
|
const CString kstr_MapTo= _T("MAPTO ");
|
||
|
const CString kstr_CacheEnd= _T("END");
|
||
|
}
|
||
|
|
||
|
|
||
|
CAPGTSTSCReader::CAPGTSTSCReader( CPhysicalFileReader * pPhysicalFileReader, CCache *pCache )
|
||
|
: CTextFileReader( pPhysicalFileReader )
|
||
|
{
|
||
|
m_pCache= pCache;
|
||
|
}
|
||
|
|
||
|
CAPGTSTSCReader::~CAPGTSTSCReader()
|
||
|
{
|
||
|
}
|
||
|
|
||
|
|
||
|
void CAPGTSTSCReader::Parse()
|
||
|
{
|
||
|
long save_pos = 0;
|
||
|
|
||
|
LOCKOBJECT();
|
||
|
save_pos = GetPos();
|
||
|
SetPos(0);
|
||
|
|
||
|
try
|
||
|
{
|
||
|
vector<CString> arrLines;
|
||
|
|
||
|
|
||
|
// pump file content into array of lines.
|
||
|
CString strLine;
|
||
|
while (GetLine( strLine ))
|
||
|
arrLines.push_back( strLine );
|
||
|
|
||
|
|
||
|
// parse string-by-string.
|
||
|
bool bFirstLine= true;
|
||
|
for (vector<CString>::iterator iCurLine = arrLines.begin(); iCurLine < arrLines.end(); iCurLine++)
|
||
|
{
|
||
|
// Prepare the line for parsing.
|
||
|
CString strCur= *iCurLine;
|
||
|
strCur.TrimLeft();
|
||
|
strCur.TrimRight();
|
||
|
|
||
|
if (bFirstLine)
|
||
|
{
|
||
|
// Verify that this file has the correct signature.
|
||
|
if (-1 == strCur.Find( kstr_CacheSig ))
|
||
|
{
|
||
|
// Unknown type of file, exit the for loop.
|
||
|
// >>> Should there be error handling/reporting here??? RAB-19990119.
|
||
|
break;
|
||
|
}
|
||
|
bFirstLine= false;
|
||
|
}
|
||
|
else if (-1 != strCur.Find( kstr_CacheEnd ))
|
||
|
{
|
||
|
// Located the end of file marker, exit the for loop.
|
||
|
break;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
// Look for the first line of a MapFrom-MapTo pair.
|
||
|
int nPos= strCur.Find( kstr_MapFrom );
|
||
|
if (-1 != nPos)
|
||
|
{
|
||
|
CBasisForInference BasisForInference;
|
||
|
bool bHasBasisForInference= false;
|
||
|
|
||
|
// Move the position marker over the MapFrom key word.
|
||
|
nPos+= kstr_MapFrom.GetLength();
|
||
|
|
||
|
// Extract all of the node state pairs from the MapFrom line.
|
||
|
do
|
||
|
{
|
||
|
CString strNode;
|
||
|
CString strState;
|
||
|
int nNodePos;
|
||
|
|
||
|
// Jump over the leading line format or the node pair delimiter.
|
||
|
strCur= strCur.Mid( nPos );
|
||
|
strCur.TrimLeft();
|
||
|
|
||
|
// Look for the delimiter between a node-state pair.
|
||
|
nNodePos= strCur.Find( kstr_NodeStateDelim );
|
||
|
if (-1 != nNodePos)
|
||
|
{
|
||
|
// Extract the string containing the node value and
|
||
|
// then step over the node state delimiter.
|
||
|
strNode= strCur.Left( nNodePos );
|
||
|
strCur= strCur.Mid( nNodePos + kstr_NodeStateDelim.GetLength() );
|
||
|
|
||
|
// Extract the string containing the state value.
|
||
|
nPos= strCur.Find( kstr_NodePairDelim );
|
||
|
if (-1 == nPos)
|
||
|
{
|
||
|
// We have found the last state value, copy the remaining string.
|
||
|
strState= strCur;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
// Extract up to the node pair delimiter and move the
|
||
|
// position marker past that point.
|
||
|
strState= strCur.Left( nPos );
|
||
|
nPos+= kstr_NodePairDelim.GetLength();
|
||
|
}
|
||
|
|
||
|
if (strNode.GetLength() && strState.GetLength())
|
||
|
{
|
||
|
// It appears that we have a valid node-state pair so add
|
||
|
// them to the basis for inference.
|
||
|
NID nNid= atoi( strNode );
|
||
|
IST nIst= atoi( strState );
|
||
|
|
||
|
BasisForInference.push_back( CNodeStatePair( nNid, nIst ));
|
||
|
bHasBasisForInference= true;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
// >>> This condition should not occur,
|
||
|
// error handling/reporting??? RAB-19990119.
|
||
|
nPos= -1;
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
nPos= -1;
|
||
|
|
||
|
} while (-1 != nPos) ;
|
||
|
|
||
|
|
||
|
// Now search for recommendations if the basis for inference was okay.
|
||
|
CRecommendations Recommendations;
|
||
|
bool bHasRecommendations= false;
|
||
|
if (bHasBasisForInference)
|
||
|
{
|
||
|
// Move to the next line to prepare for searching for a matching
|
||
|
// MapTo line.
|
||
|
iCurLine++;
|
||
|
if (iCurLine < arrLines.end())
|
||
|
{
|
||
|
// Prep the temporary string.
|
||
|
strCur= *iCurLine;
|
||
|
strCur.TrimLeft();
|
||
|
strCur.TrimRight();
|
||
|
|
||
|
// Look for the matching MapTo element.
|
||
|
nPos= strCur.Find( kstr_MapTo );
|
||
|
if (-1 != nPos)
|
||
|
{
|
||
|
CString strRecommend;
|
||
|
|
||
|
// Extract all of the recommendations from the MapTo line.
|
||
|
nPos+= kstr_MapTo.GetLength();
|
||
|
do
|
||
|
{
|
||
|
// Jump over the leading line format or the node pair delimiter.
|
||
|
strCur= strCur.Mid( nPos );
|
||
|
strCur.TrimLeft();
|
||
|
|
||
|
// Extract the recommendations string value.
|
||
|
nPos= strCur.Find( kstr_NodePairDelim );
|
||
|
if (-1 == nPos)
|
||
|
strRecommend= strCur;
|
||
|
else
|
||
|
{
|
||
|
strRecommend= strCur.Left( nPos );
|
||
|
nPos+= kstr_NodePairDelim.GetLength();
|
||
|
}
|
||
|
|
||
|
if (strRecommend.GetLength())
|
||
|
{
|
||
|
Recommendations.push_back( atoi( strRecommend ) );
|
||
|
bHasRecommendations= true;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
// >>> This condition should not occur,
|
||
|
// error handling/reporting??? RAB-19990119.
|
||
|
nPos= -1;
|
||
|
}
|
||
|
|
||
|
} while (-1 != nPos) ;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// We have both items so add them to the cache.
|
||
|
if (bHasRecommendations && bHasBasisForInference)
|
||
|
m_pCache->AddCacheItem( BasisForInference, Recommendations );
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
catch (exception& x)
|
||
|
{
|
||
|
SetPos(save_pos);
|
||
|
UNLOCKOBJECT();
|
||
|
|
||
|
CString str;
|
||
|
// Note STL exception in event log and rethrow exception.
|
||
|
CBuildSrcFileLinenoStr SrcLoc( __FILE__, __LINE__ );
|
||
|
CEvent::ReportWFEvent( SrcLoc.GetSrcFileLineStr(),
|
||
|
SrcLoc.GetSrcFileLineStr(),
|
||
|
CCharConversion::ConvertACharToString(x.what(), str),
|
||
|
_T(""),
|
||
|
EV_GTS_STL_EXCEPTION );
|
||
|
throw;
|
||
|
}
|
||
|
|
||
|
SetPos(save_pos);
|
||
|
UNLOCKOBJECT();
|
||
|
|
||
|
return;
|
||
|
}
|
||
|
|