solarfilereader.cpp

来自「奇迹世界公用文件源代码,研究网络游戏的朋友可以研究下」· C++ 代码 · 共 557 行

CPP
557
字号
#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 + =
减小字号Ctrl + -
显示快捷键?