#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 @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() ÇÔ¼ö Ãß°¡ - 2006.7.19 : white space ¸ðµå¿¡¼­ => [ 1003 0À½³É 34 5 7 ] => ½ºÅ©¸³Æ®°¡ ¿·°ú °°À» ¶§ '0À½³É'À» ¼ýÀÚ·Î º¸´Â ¹ö±×! fixed ¾ö°ÝÇÑ ¹®¹ý ¿À·ù üũ, Á»´õ Á¤È®ÇÑ Å¸ÀÔüũ°¡ ÇÊ¿ä ex) 0.0.4(X), 0.f04(X), 0.4f(x) @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, // °ø¹éÀ¸·Î ºÐ¸®µÇ´Â ¸ðµç ÅäÅ«Àº ¹«Á¶°Ç ¹®ÀÚÀÓ // ÁÖ¼®¿¡ ´ëÇÑ Reader SEPERATOR_WHITESPACE_FOR_COMMENTS = 0x05, //< ÁÖ¼®ºÎºÐÀ» whitespace ¹æ½ÄÀ¸·Î ÀÐÀ½ }; namespace util { class SolarFileReader { enum { MAX_TOKEN_BUFFER_SIZE = 10240, }; public: SolarFileReader(); ~SolarFileReader(); BOOL OpenFile( const char * pszFileName, eSEPERATOR_MODE mode = SEPERATOR_WHITESPACE ); BOOL OpenFileFromPack(char * pszPackFileName, const char * pszFileName, eSEPERATOR_MODE mode); 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(); VOID SetFileName( const TCHAR* pszFileName ); const char * GetFileName() { return m_szFileName; } const char * GetBuffer() { return m_pszBuffer; } VOID SetBuffer( char *pBuffer ) { m_pszBuffer = pBuffer; } VOID SetMode( eSEPERATOR_MODE mode ){ m_Mode = mode; } eSEPERATOR_MODE GetMode(){ return m_Mode; } DWORD GetBufferSize() { return m_dwBufferSize; } VOID SetBufferSize( DWORD dwSize) { m_dwBufferSize = dwSize; } VOID SetBufferPos( DWORD dwPos ) { m_dwBufferPos = dwPos; } private: VOID _clear(); VOID _clearToken(); char _getchar( DWORD * pPos = NULL ); char _getcurchar( DWORD * pPos = NULL ); char _getcurchar( DWORD pos ); VOID _rewind( int i , DWORD * pPos = NULL ); int _isspace( char c ); int _isnewline( char c ); BOOL _isnumber( char c ); char _skipComment( DWORD * INOUT pPos = NULL ); char _skipNotComment( DWORD * INOUT pPos = NULL ); 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 ); eTOKEN_TYPE _getNextTokenType_whitespace_forComments( eTOKEN_TYPE desireTokenType ); char* _getTokenTypeName(eTOKEN_TYPE TokenType); double m_dTokenNumber; char m_pszTokenString[MAX_TOKEN_BUFFER_SIZE]; DWORD m_dwBufferPos; DWORD m_dwBufferSize; char * m_pszBuffer; eSEPERATOR_MODE m_Mode; char m_szFileName[MAX_PATH]; BOOL m_bNewLine; char m_szTokenType[64]; }; } /// namespace util #endif // __SOLAR_FILE_READER_H__