Files
Sun1602/Tools/SUNAutoScriptMaker/SolarFileReader.h
T
2022-10-26 12:25:11 +08:00

165 lines
4.8 KiB
C++

#ifndef __SOLAR_FILE_READER_H__
#define __SOLAR_FILE_READER_H__
//=============================================================================================================================
/// 각종 스크립트 파일(txt)읽기 위한 parser : SolarFileReader class
/**
@author Kim Min Wook < taiyo@webzen.co.kr >
@since 2005. 1. 31
@remarks
- 기존의 scriptRead의 기능 개선판
@note
- open mode : SEPERATOR_WHITESPACE
구분자는 white space만 이다.
- open mode : SEPERATOR_QUOTATIONMARKFORSTR
구분자는 white space이고 문자열은 '"'따옴표로 표시한다.
- 새로운 함수 제작 : 유저 편의를 위해서 : 2005.3.29
char * GetNextString();
float GetNextNumber();
@todo
- 엄격한 문법 오류 체크, 좀더 정확한 타입체크가 필요 ex) 0.0.4(X), 0.f04(X)
- white space 모드에서 => [ 1003 0음냥 34 5 7 ] => 스크립트가 옆과 같을 때 '0음냥'을 숫자로 보는 버그!
@history
- 2005.2.24 : EOF의 버그 수정
- 2005.4.12 : number의 datatype float -> double
- string, number 구분없이 로직에서 알아서 구분해서 사용하는 모드 추가
- 2005.5.11 : case '+': 항목 추가
- 2005.8.22 : Reset()함수 추가, 다시 첫 위치부터 읽기 위해
- 2005.9.23 : CPackFile을 이용해 File을 불러오기 위해 OpenFileFromPack() 함수 추가
- 2005.9.26 : 오직 개행문자만 분리자로 인식하는 SEPERATOR_ONLY_NEWLINE 타입과 _getNextTokenType_newline() 함수 추가
- 2005.9.27 : 빈공간을 분리자로 사용하고 모든 토큰을 문자열로만 인식하는 SEPERATOR_WHITESPACE_ONLY_STRING 타입과 _getNextTokenType_whitespace_onlystring() 함수 추가
@usage
- 방법1
SolarFileReader sr;
sr.OpenFile( pszCalcCharFileName, SEPERATOR_QUOTATIONMARKFORSTR );
while( TOKEN_END != sr.GetNextTokenType() )
{
int iGetNumber = sr.GetTokenNumber();
sr.GetNextTokenType( TOKEN_STRING );
strncpy( pszCharName, sr.GetTokenString(), MAX_CHARNAME_LENGTH );
}
sr.CloseFile();
- 방법2
SolarFileReader sr;
sr.OpenFile( pszCalcCharFileName, SEPERATOR_QUOTATIONMARKFORSTR );
while( !sr.IsEOF() )
{
int iGetNumber = sr.GetNextNumber();
strncpy( pszCharName, sr.GetNextString(), MAX_CHARNAME_LENGTH );
}
sr.CloseFile();
*/
//=============================================================================================================================
#pragma once
enum eTOKEN_TYPE
{
TOKEN_ANYTYPE = -1,
TOKEN_ERROR = 0,
TOKEN_END,
TOKEN_NUMBER,
TOKEN_STRING,
TOKEN_EXTRA,
TOKEN_SLASH = '/',
TOKEN_ASTERISK = '*',
// white-space
TOKEN_SPACE = ' ',
TOKEN_NEWLINE = '\n',
TOKEN_CARRIAGERETURN = '\r',
TOKEN_TAB = '\t',
};
enum eSEPERATOR_MODE
{
SEPERATOR_ERROR = 0x00,
SEPERATOR_WHITESPACE = 0x01,
SEPERATOR_QUOTATIONMARKFORSTR = 0x02,
SEPERATOR_ONLY_NEWLINE = 0x03, // 숫자, 문자, 공백에 관계없이 무조건 new line 만을 분리자로 인식
SEPERATOR_WHITESPACE_ONLY_STRING = 0x04 // 공백으로 분리되는 모든 토큰은 무조건 문자임
};
namespace util
{
class SolarFileReader
{
enum
{
MAX_TOKEN_BUFFER_SIZE = 1024,
};
public:
SolarFileReader();
~SolarFileReader();
BOOL OpenFile( char * pszFileName, eSEPERATOR_MODE mode = SEPERATOR_WHITESPACE );
BOOL OpenFileFromPack( char * pszPackFileName, char * pszFileName, eSEPERATOR_MODE mode = SEPERATOR_WHITESPACE );
BOOL OpenBuffer( BYTE * pMemoryBuffer, DWORD dwBufferSize, eSEPERATOR_MODE mode = SEPERATOR_WHITESPACE );
VOID CloseBuffer();
VOID CloseFile();
eTOKEN_TYPE GetNextTokenType( eTOKEN_TYPE desireTokenType = TOKEN_ANYTYPE );
char * GetTokenString() { return m_pszTokenString; }
double GetTokenNumber() { return m_dTokenNumber; }
BOOL IsEOF();
char * GetNextString( eTOKEN_TYPE desireTokenType = TOKEN_STRING );
double GetNextNumber( eTOKEN_TYPE desireTokenType = TOKEN_NUMBER );
VOID Reset();
private:
VOID _clear();
char _getchar( DWORD * pPos = NULL );
char _getcurchar( DWORD * pPos = NULL );
VOID _rewind( int i , DWORD * pPos = NULL );
int _isspace( char c );
int _isnewline( char c );
BOOL _isnumber( char c );
eTOKEN_TYPE _getNextTokenType_whitespace( eTOKEN_TYPE desireTokenType );
eTOKEN_TYPE _getNextTokenType_quotationForStr( eTOKEN_TYPE desireTokenType );
eTOKEN_TYPE _getNextTokenType_newline( eTOKEN_TYPE desireTokenType );
eTOKEN_TYPE _getNextTokenType_whitespace_onlystring( eTOKEN_TYPE desireTokenType );
double m_dTokenNumber;
char m_pszTokenString[MAX_TOKEN_BUFFER_SIZE];
DWORD m_dwBufferPos;
DWORD m_dwBufferSize;
char * m_pszBuffer;
eSEPERATOR_MODE m_Mode;
};
} /// namespace util
//=======================================================================================================
class BaseParser
{
public :
BaseParser();
virtual ~BaseParser();
void SetPackFileName( char * pszPackFileName );
protected :
BOOL OpenFile( util::SolarFileReader & sr, char * pszFileName, eSEPERATOR_MODE mode );
private :
char m_pszPackFileName[MAX_PATH];
};
#endif // __SOLAR_FILE_READER_H__