Source code of Windows XP (NT5)
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.
|
|
//
// MODULE: APGTSTSCREAD.CPP
//
// PURPOSE: TSC file reading classes
//
// COMPANY: Saltmine Creative, Inc. (206)-284-7511 [email protected]
//
// 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; }
|