?? solarfilereader.cpp
字號:
#include "UtilityCommon.h"
#include <wzFilePacker.h>
#include <windows.h>
#include <assert.h>
#include ".\solarfilereader.h"
namespace util
{
SolarFileReader::SolarFileReader()
: m_pszBuffer ( NULL ),
m_dTokenNumber ( 0.0 ),
m_dwBufferSize ( 0 ),
m_dwBufferPos ( 0 ),
m_Mode ( SEPERATOR_ERROR )
{
}
SolarFileReader::~SolarFileReader()
{
assert( m_pszBuffer == NULL );
}
VOID SolarFileReader::_clear()
{
m_dTokenNumber = 0.0;
m_pszTokenString[0] = NULL;
}
VOID SolarFileReader::CloseFile()
{
CloseBuffer();
}
VOID SolarFileReader::CloseBuffer()
{
if ( m_pszBuffer )
{
delete [] m_pszBuffer;
m_pszBuffer = NULL;
}
m_dwBufferSize = 0;
m_dwBufferPos = 0;
}
VOID SolarFileReader::Reset()
{
m_dwBufferPos = 0;
_clear();
}
BOOL SolarFileReader::OpenBuffer( BYTE * pBuffer, DWORD dwBufferSize, eSEPERATOR_MODE mode )
{
assert( NULL == m_pszBuffer );
m_dwBufferSize = dwBufferSize;
m_pszBuffer = new char [dwBufferSize];
memcpy( m_pszBuffer, pBuffer, dwBufferSize );
// 干滾 檬扁拳
m_Mode = mode;
m_dwBufferPos = 0;
return TRUE;
}
BOOL SolarFileReader::OpenFile( char * pszFileName, eSEPERATOR_MODE mode )
{
assert( NULL == m_pszBuffer );
m_Mode = mode;
HANDLE hFile = ::CreateFile( pszFileName, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if ( INVALID_HANDLE_VALUE == hFile )
{
return FALSE;
}
m_dwBufferSize = GetFileSize( hFile, NULL );
if ( m_dwBufferSize < 0 )
return FALSE;
m_pszBuffer = new char [m_dwBufferSize];
m_dwBufferPos = 0;
DWORD dwNumber = 0;
BOOL rt = ::ReadFile( hFile, m_pszBuffer, m_dwBufferSize, &dwNumber, NULL );
if( !rt ) return FALSE;
::CloseHandle( hFile );
return TRUE;
}
BOOL SolarFileReader::OpenFileFromPack( char * pszPackFileName, char * pszFileName, eSEPERATOR_MODE mode )
{
assert( NULL == m_pszBuffer );
m_Mode = mode;
CPackFile obPackFile;
if( !obPackFile.Open( pszPackFileName ) )
return FALSE;
HANDLE hFile = obPackFile.OpenFile( pszFileName, PACKFILE_OPEN_READONLY );
if ( FALSE == hFile )
return FALSE;
if( !obPackFile.GetFileSize( hFile, &m_dwBufferSize ) )
return FALSE;
if ( m_dwBufferSize <= 0 )
return FALSE;
m_pszBuffer = new char [m_dwBufferSize];
m_dwBufferPos = 0;
if( !obPackFile.ReadFile( hFile, m_pszBuffer, m_dwBufferSize ) )
return FALSE;
obPackFile.CloseFile( hFile );
obPackFile.Close();
return TRUE;
}
char SolarFileReader::_getchar( DWORD * pPos )
{
if( pPos == NULL )
pPos = &m_dwBufferPos;
if( *pPos < m_dwBufferSize )
return m_pszBuffer[(*pPos)++];
else
{
++(*pPos);
return TOKEN_END;
}
}
char SolarFileReader::_getcurchar( DWORD * pPos )
{
if( pPos == NULL )
pPos = &m_dwBufferPos;
return (char)( *pPos < m_dwBufferSize ? m_pszBuffer[*pPos] : TOKEN_END );
}
VOID SolarFileReader::_rewind( int i, DWORD * pPos )
{
if( pPos == NULL )
pPos = &m_dwBufferPos;
assert( *pPos - i >= 0 );
*pPos -= i;
}
int SolarFileReader::_isspace( char c )
{
if( c == TOKEN_SPACE || c == TOKEN_NEWLINE || c == TOKEN_CARRIAGERETURN || c == TOKEN_TAB )
return 1;
return 0;
}
int SolarFileReader::_isnewline( char c )
{
if( c == TOKEN_NEWLINE || c == TOKEN_CARRIAGERETURN )
return 1;
return 0;
}
eTOKEN_TYPE SolarFileReader::_getNextTokenType_whitespace( eTOKEN_TYPE desireTokenType )
{
// 林籍 貿府 : 扒呈頓扁
eTOKEN_TYPE getTokenType = TOKEN_ERROR;
char c = 0, nc = 0;
BOOL bInfiniteLoop = TRUE;
while( bInfiniteLoop )
{
c = _getchar();
nc = _getcurchar();
if( TOKEN_SLASH == c && TOKEN_SLASH == nc )
{
while( ( c = _getchar() ) != TOKEN_END && c != TOKEN_NEWLINE );
}
else if( TOKEN_SLASH == c && TOKEN_ASTERISK == nc )
{
c = _getchar();// * 公矯困秦
while ( ( c = _getchar() ) != TOKEN_END && c != TOKEN_ASTERISK && _getcurchar() != TOKEN_SLASH );
c = _getchar();// * 公矯困秦
c = _getchar();// / 公矯困秦
}
// 頗老 輛豐 眉農
if( c == TOKEN_END )
return TOKEN_END;
if( 0 == _isspace( c ) )
break;
}
char * pbp = &m_pszTokenString[0];
switch( c )
{
case TOKEN_END: break;
// 箭磊
case '0': case '1': case '2': case '3': case '4':
case '5': case '6': case '7': case '8': case '9':
case '.': case '-': case '+':
{
*(pbp++) = c;
while( ( c = _getchar() ) != TOKEN_END && ( isdigit( c ) != 0 || c == '.' || c == 'f') )
{
*(pbp++) = c;
}
*pbp = NULL;
_rewind(1);
m_dTokenNumber = atof( m_pszTokenString );
getTokenType = TOKEN_NUMBER;
}
break;
default: //< 鞏磊凱
{
*(pbp++) = c;
while( ( c = _getchar() ) != TOKEN_END && _isspace( c ) == 0 )
{
*(pbp++) = c;
}
*pbp = NULL;
_rewind(1);
getTokenType = TOKEN_STRING;
}
}
#ifdef _DEBUG
if( desireTokenType != TOKEN_ANYTYPE && getTokenType != desireTokenType )
{
assert( !"盔竅綽 配奴 鷗澇苞 促輔聰促. : 單撈磐 坷幅老 啊瓷己撈 女聰促" );
}
#endif
return getTokenType;
}
eTOKEN_TYPE SolarFileReader::_getNextTokenType_quotationForStr( eTOKEN_TYPE desireTokenType )
{
// 林籍 貿府 : 扒呈頓扁
eTOKEN_TYPE getTokenType = TOKEN_ERROR;
char c = 0, nc = 0;
BOOL bInfiniteLoop = TRUE;
while( bInfiniteLoop )
{
c = _getchar();
nc = _getcurchar();
if( TOKEN_SLASH == c && TOKEN_SLASH == nc )
{
while( ( c = _getchar() ) != TOKEN_END && c != TOKEN_NEWLINE );
}
else if( TOKEN_SLASH == c && TOKEN_ASTERISK == nc )
{
c = _getchar();// * 公矯困秦
while ( ( c = _getchar() ) != TOKEN_END && c != TOKEN_ASTERISK && _getcurchar() != TOKEN_SLASH );
c = _getchar();// * 公矯困秦
c = _getchar();// / 公矯困秦
}
// 頗老 輛豐 眉農
if( c == TOKEN_END )
return TOKEN_END;
if( 0 == _isspace( c ) )
break;
}
char * pbp = &m_pszTokenString[0];
switch( c )
{
case TOKEN_END: break;
// 箭磊
case '0': case '1': case '2': case '3': case '4':
case '5': case '6': case '7': case '8': case '9':
case '.': case '-': case '+':
{
*(pbp++) = c;
while( ( c = _getchar() ) != TOKEN_END && ( isdigit( c ) != 0 || c == '.' || c == 'f') )
{
*(pbp++) = c;
}
*pbp = NULL;
_rewind(1);
m_dTokenNumber = atof( m_pszTokenString );
getTokenType = TOKEN_NUMBER;
}
break;
case '"': //< 鞏磊凱
{
while( ( c = _getchar() ) != TOKEN_END && ( c != '"' ) )
{
if( c == '\\') c = _getchar();
*(pbp++) = c;
}
*pbp = NULL;
getTokenType = TOKEN_STRING;
}
break;
default: //< 屈僥俊 嘎瘤 臼綽 鞏磊甸
{
*(pbp++) = c;
*pbp = NULL;
getTokenType = TOKEN_EXTRA;
}
}
#ifdef _DEBUG
if( desireTokenType != TOKEN_ANYTYPE && getTokenType != desireTokenType )
{
assert( !"盔竅綽 配奴 鷗澇苞 促輔聰促. : 單撈磐 坷幅老 啊瓷己撈 女聰促" );
}
#endif
return getTokenType;
}
eTOKEN_TYPE SolarFileReader::_getNextTokenType_newline( eTOKEN_TYPE desireTokenType )
{
// 林籍 貿府 : 扒呈頓扁
eTOKEN_TYPE getTokenType = TOKEN_ERROR;
char c = 0, nc = 0;
BOOL bInfiniteLoop = TRUE;
while( bInfiniteLoop )
{
c = _getchar();
nc = _getcurchar();
if( TOKEN_SLASH == c && TOKEN_SLASH == nc )
{
while( ( c = _getchar() ) != TOKEN_END && c != TOKEN_NEWLINE );
}
else if( TOKEN_SLASH == c && TOKEN_ASTERISK == nc )
{
c = _getchar();// * 公矯困秦
while ( ( c = _getchar() ) != TOKEN_END && c != TOKEN_ASTERISK && _getcurchar() != TOKEN_SLASH );
c = _getchar();// * 公矯困秦
c = _getchar();// / 公矯困秦
}
// 頗老 輛豐 眉農
if( c == TOKEN_END )
return TOKEN_END;
if( 0 == _isspace( c ) )
break;
}
char * pbp = &m_pszTokenString[0];
switch( c )
{
case TOKEN_END: break;
default: // 箭磊, 鞏磊, 傍歸俊 包拌絕撈 公煉扒 new line 父闌 盒府磊肺 牢僥
{
*(pbp++) = c;
while( ( c = _getchar() ) != TOKEN_END && _isnewline( c ) == 0 )
{
*(pbp++) = c;
}
*pbp = NULL;
_rewind(1);
getTokenType = TOKEN_STRING;
}
}
#ifdef _DEBUG
if( desireTokenType != TOKEN_ANYTYPE && getTokenType != desireTokenType )
{
assert( !"盔竅綽 配奴 鷗澇苞 促輔聰促. : 單撈磐 坷幅老 啊瓷己撈 女聰促" );
}
#endif
return getTokenType;
}
eTOKEN_TYPE SolarFileReader::_getNextTokenType_whitespace_onlystring( eTOKEN_TYPE desireTokenType )
{
// 林籍 貿府 : 扒呈頓扁
eTOKEN_TYPE getTokenType = TOKEN_ERROR;
char c = 0, nc = 0;
BOOL bInfiniteLoop = TRUE;
while( bInfiniteLoop )
{
c = _getchar();
nc = _getcurchar();
if( TOKEN_SLASH == c && TOKEN_SLASH == nc )
{
while( ( c = _getchar() ) != TOKEN_END && c != TOKEN_NEWLINE );
}
else if( TOKEN_SLASH == c && TOKEN_ASTERISK == nc )
{
c = _getchar();// * 公矯困秦
while ( ( c = _getchar() ) != TOKEN_END && c != TOKEN_ASTERISK && _getcurchar() != TOKEN_SLASH );
c = _getchar();// * 公矯困秦
c = _getchar();// / 公矯困秦
}
// 頗老 輛豐 眉農
if( c == TOKEN_END )
return TOKEN_END;
if( 0 == _isspace( c ) )
break;
}
char * pbp = &m_pszTokenString[0];
switch( c )
{
case TOKEN_END: break;
default: // 坷肺瘤 鞏磊凱肺父 牢僥
{
*(pbp++) = c;
while( ( c = _getchar() ) != TOKEN_END && _isspace( c ) == 0 )
{
*(pbp++) = c;
}
*pbp = NULL;
_rewind(1);
getTokenType = TOKEN_STRING;
}
}
#ifdef _DEBUG
if( desireTokenType != TOKEN_ANYTYPE && getTokenType != desireTokenType )
{
assert( !"盔竅綽 配奴 鷗澇苞 促輔聰促. : 單撈磐 坷幅老 啊瓷己撈 女聰促" );
}
#endif
return getTokenType;
}
eTOKEN_TYPE SolarFileReader::GetNextTokenType( eTOKEN_TYPE desireTokenType )
{
_clear();
switch( m_Mode )
{
case SEPERATOR_WHITESPACE:
return _getNextTokenType_whitespace( desireTokenType );
case SEPERATOR_QUOTATIONMARKFORSTR:
return _getNextTokenType_quotationForStr( desireTokenType );
case SEPERATOR_ONLY_NEWLINE:
return _getNextTokenType_newline( desireTokenType );
case SEPERATOR_WHITESPACE_ONLY_STRING :
return _getNextTokenType_whitespace_onlystring( desireTokenType );
}
return TOKEN_ERROR;
}
BOOL SolarFileReader::IsEOF()
{
DWORD m_CurPos = m_dwBufferPos;
char c = 0, nc = 0;
BOOL bInfiniteLoop = TRUE;
while( bInfiniteLoop )
{
c = _getchar( &m_CurPos );
nc = _getcurchar( &m_CurPos );
if( TOKEN_SLASH == c && TOKEN_SLASH == nc )
{
while( ( c = _getchar( &m_CurPos ) ) != TOKEN_END && c != TOKEN_NEWLINE );
}
else if( TOKEN_SLASH == c && TOKEN_ASTERISK == nc )
{
c = _getchar( &m_CurPos );// * 公矯困秦
while ( ( c = _getchar( &m_CurPos ) ) != TOKEN_END && c != TOKEN_ASTERISK && _getcurchar( &m_CurPos ) != TOKEN_SLASH );
c = _getchar( &m_CurPos );// * 公矯困秦
c = _getchar( &m_CurPos );// / 公矯困秦
}
// 頗老 輛豐 眉農
if( c == TOKEN_END )
return TRUE;
if( 0 == _isspace( c ) )
break;
}
return FALSE;
}
char * SolarFileReader::GetNextString( eTOKEN_TYPE desireTokenType )
{
GetNextTokenType( desireTokenType );
return GetTokenString();
}
double SolarFileReader::GetNextNumber( eTOKEN_TYPE desireTokenType )
{
GetNextTokenType( desireTokenType );
return GetTokenNumber();
}
}
//=====================================================================================================
BaseParser::BaseParser()
{
ZeroMemory( m_pszPackFileName, MAX_PATH );
}
BaseParser::~BaseParser()
{
}
void BaseParser::SetPackFileName( char * pszPackFileName )
{
if( pszPackFileName )
strcpy( m_pszPackFileName, pszPackFileName );
else
ZeroMemory( m_pszPackFileName, MAX_PATH );
}
BOOL BaseParser::OpenFile( util::SolarFileReader & sr, char * pszFileName, eSEPERATOR_MODE mode )
{
BOOL bResult = FALSE;
// pack
if( m_pszPackFileName[0] )
{
bResult = sr.OpenFileFromPack( m_pszPackFileName, pszFileName, mode );
}
// unpack
else
{
bResult = sr.OpenFile( pszFileName, mode );
}
if( !bResult )
{
ASSERT( !"File Open Error" );
}
return bResult;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -