Files
Sun1602/Tools/SunUpdateManager/UpdateCommon/ScriptParser.cpp
T
2022-10-26 12:25:11 +08:00

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;
}