📄 refer.cpp
字号:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Refer.h"
//---------------------------------------------------------------------------
__fastcall TReferenceStream::TReferenceStream( const System::AnsiString FileName, Word Mode )
: TFileStream( FileName, Mode )
{
m_asFileName = FileName;
m_bModified = false;
// if( FileExists( FileName ) )
// {
// Seek to the very beginning of the stream.
// Seek( 0, soFromBeginning );
// ReadAll();
// }
// else
// {
// m_pCurrReferRec = NULL;
// m_rdReferDatabase.nMagic = MAGIC_DATABASE;
// m_rdReferDatabase.nCount = ( unsigned __int32 )0;
// m_rdReferDatabase.nId = ( unsigned __int32 )0;
// m_rdReferDatabase.nIndex = ( unsigned __int32 )0;
// m_rdReferDatabase.nOffset = ( unsigned __int32 )36;
// for( int i=0; i<4; i++ )
// m_rdReferDatabase.nReserved[i] = ( unsigned __int32 )0;
// m_rdReferDatabase.pReferLink = NULL;
// m_prlCurrReferLink = NULL;
// m_prlFirstReferLink = NULL;
// m_prlLastReferLink = NULL;
// }
}
//---------------------------------------------------------------------------
int __fastcall TReferenceStream::Seek( int Offset, Word Origin )
{
return THandleStream::Seek( Offset, Origin );
}
//---------------------------------------------------------------------------
int __fastcall TReferenceStream::Read( void *Buffer, int Count )
{
return THandleStream::Read( Buffer, Count );
}
//---------------------------------------------------------------------------
int __fastcall TReferenceStream::ReadReferDatabaseHeader( TReferDatabaseHeader *prdHeader )
{
int nNum = 0;
// Get database header information
try
{
nNum += THandleStream::Read( &prdHeader->nMagic, 4 );
nNum += THandleStream::Read( &prdHeader->nCount, 4 );
nNum += THandleStream::Read( &prdHeader->nId, 4 );
nNum += THandleStream::Read( &prdHeader->nIndex, 4 );
nNum += THandleStream::Read( &prdHeader->nOffset, 4 );
for( int i=0; i<4; i++ )
nNum += THandleStream::Read( &prdHeader->nReserved[i], 4 );
}
catch( ... )
{
Application->MessageBox(
const_cast< char * >( MI_READHEADFAILED ),
const_cast< char * >( MT_FATALERROR ),
MB_OK + MB_ICONERROR );
Application->Terminate();
}
return nNum;
}
//---------------------------------------------------------------------------
int __fastcall TReferenceStream::ReadReferRecord( TReferRecord *pRef )
{
// virtual int __fastcall Seek(int Offset, Word Origin) = 0;
// Word Type: soFromBeginning, soFromCurrent, soFromEnd.
// Position indicates the current position of the stream pointer.
THandleStream::Seek( 0, soFromCurrent ); // From the current position of the stream.
// return THandleStream::Read( pRef, 186 );
int nLen = 0;
try
{
nLen += THandleStream::Read( &pRef->nMagic, 4 );
nLen += THandleStream::Read( &pRef->nId, 4 );
nLen += THandleStream::Read( &pRef->eReferType, 1 );
nLen += THandleStream::Read( &pRef->sReserved, 3 );
nLen += THandleStream::Read( &pRef->nLength, 4 );
nLen += THandleStream::Read( &pRef->nOffset, 4 );
nLen += THandleStream::Read( &pRef->nCrossReferIndex, 1 );
nLen += THandleStream::Read( &pRef->nAuthors, 1 );
nLen += THandleStream::Read( &pRef->nTitle, 2 );
nLen += THandleStream::Read( &pRef->nJournal, 2 );
nLen += THandleStream::Read( &pRef->vnVolumeAndNumber, 2 );
nLen += THandleStream::Read( &pRef->nProceedings, 2 );
nLen += THandleStream::Read( &pRef->nConferencePlace, 2 );
nLen += THandleStream::Read( &pRef->nConferenceDate, 2 );
nLen += THandleStream::Read( &pRef->nBook, 2 );
nLen += THandleStream::Read( &pRef->nEditors, 1 );
nLen += THandleStream::Read( &pRef->nTechnicalReport, 2 );
nLen += THandleStream::Read( &pRef->nNote, 2 );
nLen += THandleStream::Read( &pRef->ymPublicationDate, 4 );
nLen += THandleStream::Read( &pRef->sePages, 4 );
nLen += THandleStream::Read( &pRef->nKeywordsNumber, 1 );
nLen += THandleStream::Read( &pRef->nKeywords, 2 );
nLen += THandleStream::Read( &pRef->nAbstract, 4 );
nLen += THandleStream::Read( &pRef->nReserved, 16 );
// Read pRef->CrossReferIndex if exists.
// If no type-conversion, (int), the result is correct too.
// But C++Builder, like any C++ Compiler, never do strict type-checking,
// so we recommend use explicit type conversion.
// AnsiString class, pRef->asCrossReferIndex, can not be initialized by such:
// nLen += THandleStream::Read( &pRef->asCrossReferIndex, ( int )pRef->nCrossReferIndex );
// And can not be used as &<AnsiString>.
//
// Sometimes, a string, typed as <char *>, is terminated by "\0".
// while Reading from a disk file, application does NOT read the terminating chararcter!
// So we must use member function, SubString(int, int), to truncate the string.
// If we don't, for example, let the pAuthors string are
// "Rau R B, and Fisher J A" + "\0",
// while the pTitle string are
// "The VLIW architecture" + "\0".
// The last terminating character, "\0", is not generated
// by the member function, THandleStream::Read( void *, int ), that is,
// Once we release the space of pAuthors, the memory map is
// "The VLIW architecture A" + "\0".
// That will be the result read.
if( pRef->nCrossReferIndex > 0 )
{
char *pIndex = new char;
nLen += THandleStream::Read( pIndex, ( int )pRef->nCrossReferIndex );
pRef->asCrossReferIndex = AnsiString( pIndex ).SubString( 0, ( int )pRef->nCrossReferIndex );
if( pIndex != NULL ) { delete pIndex; pIndex = NULL; }
}
if( pRef->nAuthors > 0 )
{
char *pAuthors = new char;
nLen += THandleStream::Read( pAuthors, ( int )pRef->nAuthors );
pRef->asAuthors = AnsiString( pAuthors ).SubString( 0, ( int )pRef->nAuthors );
if( pAuthors != NULL ) { delete pAuthors; pAuthors = NULL; }
}
if( pRef->nTitle > 0 )
{
char *pTitle = new char;
nLen += THandleStream::Read( pTitle, ( int )pRef->nTitle );
pRef->asTitle = AnsiString( pTitle ).SubString( 0, ( int )pRef->nTitle );
if( pTitle != NULL ) { delete pTitle; pTitle = NULL; }
}
if( pRef->nJournal > 0 )
{
char *pJournal = new char;
nLen += THandleStream::Read( pJournal, ( int )pRef->nJournal );
pRef->asJournal = AnsiString( pJournal ).SubString( 0, ( int )pRef->nJournal );
if( pJournal != NULL ) { delete pJournal; pJournal = NULL; }
}
if( pRef->nProceedings > 0 )
{
char *pProceedings = new char;
nLen += THandleStream::Read( pProceedings, ( int )pRef->nProceedings );
pRef->asProceedings = AnsiString( pProceedings ).SubString( 0, ( int )pRef->nProceedings );
if( pProceedings != NULL ) { delete pProceedings; pProceedings = NULL; }
}
if( pRef->nConferencePlace > 0 )
{
char *pConferencePlace = new char;
nLen += THandleStream::Read( pConferencePlace, ( int )pRef->nConferencePlace );
pRef->asConferencePlace = AnsiString( pConferencePlace ).SubString( 0, ( int )pRef->nConferencePlace );
if( pConferencePlace != NULL ) { delete pConferencePlace; pConferencePlace = NULL; }
}
if( pRef->nConferenceDate > 0 )
{
char *pConferenceDate = new char;
nLen += THandleStream::Read( pConferenceDate, ( int )pRef->nConferenceDate );
pRef->asConferenceDate = AnsiString( pConferenceDate ).SubString( 0, ( int )pRef->nConferenceDate );
if( pConferenceDate != NULL ) { delete pConferenceDate; pConferenceDate = NULL; }
}
if( pRef->nBook > 0 )
{
char *pBook = new char;
nLen += THandleStream::Read( pBook, ( int )pRef->nBook );
pRef->asBook = AnsiString( pBook ).SubString( 0, ( int )pRef->nBook );
if( pBook != NULL ) { delete pBook; pBook = NULL; }
}
if( pRef->nEditors > 0 )
{
char *pEditors = new char;
nLen += THandleStream::Read( pEditors, ( int )pRef->nEditors );
pRef->asEditors = AnsiString( pEditors ).SubString( 0, ( int )pRef->nEditors );
if( pEditors != NULL ) { delete pEditors; pEditors = NULL; }
}
if( pRef->nTechnicalReport > 0 )
{
char *pTechnicalReport = new char;
nLen += THandleStream::Read( pTechnicalReport, ( int )pRef->nTechnicalReport );
pRef->asTechnicalReport = AnsiString( pTechnicalReport ).SubString( 0, ( int )pRef->nTechnicalReport );
if( pTechnicalReport != NULL ) { delete pTechnicalReport; pTechnicalReport = NULL; }
}
if( pRef->nNote > 0 )
{
char *pNote = new char;
nLen += THandleStream::Read( pNote, ( int )pRef->nNote );
pRef->asNote = AnsiString( pNote ).SubString( 0, ( int )pRef->nNote );
if( pNote != NULL ) { delete pNote; pNote = NULL; }
}
if( pRef->nKeywords > 0 )
{
char *pKeywords = new char;
nLen += THandleStream::Read( pKeywords, ( int )pRef->nKeywords );
pRef->asKeywords = AnsiString( pKeywords ).SubString( 0, ( int )pRef->nKeywords );
if( pKeywords != NULL ) { delete pKeywords; pKeywords = NULL; }
}
if( pRef->nAbstract > 0 )
{
char *pAbstract = new char;
nLen += THandleStream::Read( pAbstract, ( int )pRef->nAbstract );
pRef->asAbstract = AnsiString( pAbstract ).SubString( 0, ( int )pRef->nAbstract );
if( pAbstract != NULL ) { delete pAbstract; pAbstract = NULL; }
}
}
catch( ... )
{
Application->MessageBox(
const_cast< char * >( MI_READFAILED ),
const_cast< char * >( MT_FATALERROR ),
MB_OK + MB_ICONERROR );
Application->Terminate();
}
return nLen;
}
//---------------------------------------------------------------------------
/*
int __fastcall TReferenceStream::ReadAll()
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -