129 lines
2.4 KiB
C++
129 lines
2.4 KiB
C++
#include "stdafx.h"
|
|
#include ".\scriptparser.h"
|
|
|
|
CScriptParser::CScriptParser(void)
|
|
{
|
|
m_pFileUDT = NULL;
|
|
m_fTokenNumber = 0.0f;
|
|
memset( m_szTokenString, 0, TOKEN_STRING_SIZE );
|
|
m_CurrentToken = UDT_ERROR;
|
|
}
|
|
|
|
CScriptParser::~CScriptParser(void)
|
|
{
|
|
CloseFile();
|
|
}
|
|
|
|
bool CScriptParser::SetFile( const char* pszFileName )
|
|
{
|
|
if( (pszFileName == NULL) || (strcmp( pszFileName, "") == 0) )
|
|
return false;
|
|
|
|
if(( m_pFileUDT = fopen( pszFileName, "r" ) ) == NULL )
|
|
return false;
|
|
|
|
return true;
|
|
}
|
|
|
|
bool CScriptParser::CloseFile()
|
|
{
|
|
if( m_pFileUDT )
|
|
fclose( m_pFileUDT );
|
|
|
|
return true;
|
|
}
|
|
|
|
|
|
//현재 읽어 드린 파일의 한개의 약속된 기호가 나올때의 값 전달
|
|
UDTToken CScriptParser::GetToken()
|
|
{
|
|
if( !m_pFileUDT )
|
|
return UDT_ERROR;
|
|
|
|
char ch;
|
|
m_szTokenString[0] = '\0';
|
|
|
|
do
|
|
{
|
|
// 현재 파일의 끝이면 END 리턴
|
|
if( (ch = (char)fgetc(m_pFileUDT) ) == EOF )
|
|
return END;
|
|
|
|
// 만일 // 값이면 '\n'이 나올때 까지 돌아라.
|
|
if( ch == '/' && ( ch = (char)fgetc(m_pFileUDT) ) == '/' )
|
|
{
|
|
while( (ch = (char)fgetc(m_pFileUDT)) != '\n' );
|
|
}
|
|
} while( isspace(ch) );
|
|
|
|
char* p, TempString[TOKEN_STRING_SIZE];
|
|
|
|
switch(ch)
|
|
{
|
|
case '#':
|
|
p = m_szTokenString;
|
|
while ( ((ch = getc(m_pFileUDT)) != EOF) && ( ch !='#' ) )
|
|
*p++ = ch;
|
|
|
|
if( ch != '#' )
|
|
ungetc( ch, m_pFileUDT );
|
|
|
|
*p = 0;
|
|
return m_CurrentToken = COMMAND;
|
|
|
|
case ';':
|
|
return m_CurrentToken = SEMICOLON;
|
|
|
|
case ',':
|
|
return m_CurrentToken = COMMA;
|
|
|
|
case '{':
|
|
return m_CurrentToken = LP;
|
|
|
|
case '}':
|
|
return m_CurrentToken = RP;
|
|
|
|
case '0': case '1': case '2': case '3': case '4':
|
|
case '5': case '6': case '7': case '8': case '9':
|
|
case '.': case '-':
|
|
ungetc( ch, m_pFileUDT );
|
|
p = TempString;
|
|
while ( ( (ch = getc(m_pFileUDT) ) !=EOF) && (ch=='.' || isdigit(ch) || ch=='-') )
|
|
*p++ = ch;
|
|
*p = 0;
|
|
m_fTokenNumber = (float)atof(TempString);
|
|
return m_CurrentToken = NUMBER;
|
|
|
|
case '"':
|
|
p = m_szTokenString;
|
|
while( ((ch = getc(m_pFileUDT)) != EOF) && ( ch != '"' ) )
|
|
*p++ = ch;
|
|
if( ch != '"' )
|
|
ungetc(ch, m_pFileUDT);
|
|
*p = 0;
|
|
return m_CurrentToken = NAME;
|
|
|
|
default:
|
|
if (isalpha(ch))
|
|
{
|
|
p = m_szTokenString;
|
|
*p++ = ch;
|
|
while ( ( (ch = getc(m_pFileUDT) ) != EOF) && (ch=='.' || ch=='_' || isalnum(ch)) )
|
|
*p++ = ch;
|
|
ungetc( ch, m_pFileUDT );
|
|
*p = 0;
|
|
return m_CurrentToken = NAME;
|
|
}
|
|
return m_CurrentToken = UDT_ERROR;
|
|
}
|
|
}
|
|
|
|
char* CScriptParser::GetTokenString()
|
|
{
|
|
if( m_CurrentToken != NAME && m_CurrentToken != NUMBER )
|
|
return NULL;
|
|
|
|
return m_szTokenString;
|
|
}
|
|
|