161 lines
5.2 KiB
C++
161 lines
5.2 KiB
C++
|
|
//¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
|
|
// FILE : Parser.cpp
|
|
// AUTHOR : Catalin Cocos
|
|
//__________________________________________________________________________________________________
|
|
|
|
|
|
#include "stdinc.h"
|
|
#include "parser.h"
|
|
|
|
|
|
//¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
|
|
// DESC. : constructor
|
|
// AUTHOR : Catalin Cocos
|
|
//__________________________________________________________________________________________________
|
|
|
|
CTextParser::CTextParser()
|
|
{
|
|
m_arFile = m_pWord = NULL; // no file
|
|
m_uLine = 0; // no file
|
|
ResetDefaults(); // parser default settings
|
|
}
|
|
|
|
//¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
|
|
// DESC. : desstructor
|
|
// AUTHOR : Catalin Cocos
|
|
//__________________________________________________________________________________________________
|
|
|
|
CTextParser::~CTextParser()
|
|
{
|
|
ReleaseFile();
|
|
}
|
|
|
|
|
|
//¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
|
|
// DESC. : parser customization
|
|
// AUTHOR : Catalin Cocos
|
|
//__________________________________________________________________________________________________
|
|
|
|
void CTextParser::SetType( char* szChars, int Value)
|
|
{
|
|
for(int i = strlen(szChars) -1; i>=0; i-- )
|
|
m_arCode[(unsigned char)szChars[i]] = Value;
|
|
}
|
|
|
|
//¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
|
|
// DESC. : parser default settings
|
|
// AUTHOR : Catalin Cocos
|
|
//__________________________________________________________________________________________________
|
|
|
|
void CTextParser::ResetDefaults()
|
|
{
|
|
for(int i = 0; i<33; i++) m_arCode[i] = CTP_SEPARATOR; // separators
|
|
memset( m_arCode + (unsigned char)'!', 0, (256-(unsigned char)'!')* sizeof(DWORD)); // text
|
|
for( i = 127; i<130; i++) m_arCode[i] = CTP_SEPARATOR; // separators
|
|
for( i = 141; i<145; i++) m_arCode[i] = CTP_SEPARATOR; // separators
|
|
m_arCode[157] = CTP_SEPARATOR; // separator
|
|
m_arCode[158] = CTP_SEPARATOR; // separator
|
|
m_arCode[(unsigned char)'\n'] = CTP_NEWLINE; // the line feed cahracter is the default line separator
|
|
}
|
|
|
|
//¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
|
|
// DESC. : file accessing - returns FALSE on failure
|
|
// AUTHOR : Catalin Cocos
|
|
//__________________________________________________________________________________________________
|
|
|
|
BOOL CTextParser::AccessFile( char* szFile )
|
|
{
|
|
HANDLE hFile = CreateFile( szFile, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
|
|
if(hFile == INVALID_HANDLE_VALUE) return FALSE;
|
|
ReleaseFile();
|
|
long length = (long) GetFileSize( hFile, NULL);
|
|
m_pCountStart = m_pCrt = m_pWord = m_arFile = new unsigned char[length + 1];
|
|
m_arFile[length] = 0;
|
|
m_pFileEnd = m_arFile + length + 1;
|
|
DWORD nrC;
|
|
ReadFile( hFile, m_arFile, length + 1, &nrC, NULL);
|
|
CloseHandle( hFile );
|
|
m_nCountCode = m_nCode = CTP_NEWLINE;
|
|
return TRUE;
|
|
}
|
|
|
|
//¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
|
|
// DESC. : file release
|
|
// AUTHOR : Catalin Cocos
|
|
//__________________________________________________________________________________________________
|
|
|
|
void CTextParser::ReleaseFile()
|
|
{
|
|
if(m_arFile) delete[] m_arFile;
|
|
m_arFile = m_pWord = NULL;
|
|
m_uLine = 1;
|
|
}
|
|
|
|
//¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
|
|
// DESC. : next word
|
|
// AUTHOR : Catalin Cocos
|
|
//__________________________________________________________________________________________________
|
|
DWORD CTextParser::Advance( DWORD *res)
|
|
{
|
|
if(!m_arFile) return CTP_EOF;
|
|
m_pCountStart = m_pCrt;
|
|
DWORD rst, in;
|
|
DWORD& result = res?*res:rst;
|
|
m_nCountCode = result = in = m_nCode;
|
|
while(in)
|
|
{
|
|
switch(in)
|
|
{
|
|
case CTP_EOF:{ m_nCode = CTP_EOF; return result|=CTP_EOF; }
|
|
case CTP_LINE_COMMENT:
|
|
do in = GetUC();
|
|
while(in != CTP_NEWLINE && in != CTP_EOF);
|
|
break;
|
|
case CTP_WORD_WRAPPER:
|
|
m_pWord = m_pCrt;
|
|
while( !(GetUC() & ( CTP_WORD_WRAPPER | CTP_EOF)));
|
|
m_nCode = CTP_SEPARATOR;
|
|
*(m_pCrt-1) = 0;
|
|
return (result &= ~CTP_WORD_WRAPPER);
|
|
case CTP_COMMENT:
|
|
do in = GetUC();
|
|
while(in != CTP_COMMENT && in != CTP_EOF);
|
|
default: in = GetUC();
|
|
}
|
|
result |= in;
|
|
if( in == CTP_NEWLINE) m_uLine ++;
|
|
}
|
|
m_pWord = m_pCrt-1;
|
|
while( !GetUC() );
|
|
m_nCode = m_arCode[*(m_pCrt-1)];
|
|
*(m_pCrt-1) = 0;
|
|
return result;
|
|
}
|
|
|
|
//¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
|
|
// DESC. : next word
|
|
// AUTHOR : Catalin Cocos
|
|
//__________________________________________________________________________________________________
|
|
int CTextParser::GetCodeCount( DWORD Code)
|
|
{
|
|
if(!m_arFile) return CTP_EOF;
|
|
int count = 0;
|
|
if(Code == m_nCountCode) count ++;
|
|
DWORD crtCode;
|
|
|
|
for(unsigned char* pCrt = m_pCountStart; pCrt<m_pWord; pCrt++)
|
|
switch(crtCode = m_arCode[*pCrt])
|
|
{
|
|
case CTP_LINE_COMMENT:
|
|
for( pCrt++; pCrt<m_pWord && m_arCode[*pCrt] != CTP_NEWLINE; pCrt++);
|
|
break;
|
|
case CTP_COMMENT:
|
|
for( pCrt++; pCrt<m_pWord && m_arCode[*pCrt] != CTP_COMMENT; pCrt++);
|
|
break;
|
|
default:
|
|
if(crtCode == Code) count ++;
|
|
}
|
|
return count;
|
|
}
|