2 #include "ScriptParser.h"
4 CScriptParser::CScriptParser( void ) :
6 m_pScriptSection( NULL ),
7 m_pLastScriptSection( NULL ),
12 CScriptParser::~CScriptParser( void ) {
16 void CScriptParser::ClearBuffer( void ) {
25 m_pScriptSection = NULL;
26 m_pLastScriptSection = NULL;
27 memset( m_breakChars, 0, sizeof( m_breakChars ) );
30 const char* CScriptParser::MakeToken( const char* pToken ) {
40 int len = static_cast<int>( strlen( pToken ) );
42 m_pToken = new char[len + 1];
44 strcpy( m_pToken, pToken );
49 #define MAX_TOKEN_STRING 1024
50 // Should NEVER return NULL
51 const char* CScriptParser::GetToken( bool bAllowLinebreaks ) {
53 char token[MAX_TOKEN_STRING];
54 bool bNewLines = false;
56 m_pLastScriptSection = m_pScriptSection;
61 if ( !m_pScript || !m_pScriptSection ) {
62 return MakeToken( token );
66 SkipWhitespace( &bNewLines );
67 if ( !*m_pScriptSection ) {
68 return MakeToken( token );
70 if ( bNewLines && !bAllowLinebreaks ) {
71 return MakeToken( token );
74 c = *m_pScriptSection;
76 if ( c == '/' && m_pScriptSection[1] == '/' ) { // C style comments
77 m_pScriptSection += 2;
78 while ( *m_pScriptSection && *m_pScriptSection != '\n' ) {
82 else if ( c == '/' && m_pScriptSection[1] == '*' ) { // C++ style comments
83 m_pScriptSection += 2;
84 while ( *m_pScriptSection && ( *m_pScriptSection != '*' || m_pScriptSection[1] != '/' ) ) {
87 if ( *m_pScriptSection ) {
88 m_pScriptSection += 2;
99 c = *m_pScriptSection++;
100 if ( c == '\"' || !c ) {
102 return MakeToken( token );
104 if ( len < MAX_TOKEN_STRING ) {
112 if ( len > 0 && IsBreakChar( *m_pScriptSection ) ) {
116 if ( len < MAX_TOKEN_STRING ) {
122 if ( IsBreakChar( c ) ) {
126 c = *m_pScriptSection;
129 if ( len == MAX_TOKEN_STRING ) {
134 return MakeToken( token );
137 void CScriptParser::SkipWhitespace( bool* pbNewLines ) {
140 if ( !m_pScript || !m_pScriptSection ) {
144 while ( ( c = *m_pScriptSection ) <= ' ' ) {
155 void CScriptParser::SkipBracedSection( void ) {
161 token = GetToken( true );
162 if ( token[1] == 0 ) {
163 if ( *token == '{' ) {
166 else if ( *token == '}' ) {
170 } while ( depth && *m_pScriptSection );
173 void CScriptParser::SkipRestOfLine( void ) {
177 p = m_pScriptSection;
178 while ( ( c = *p++ ) != 0 ) {
183 m_pScriptSection = p;
186 void CScriptParser::UndoGetToken( void ) {
187 if ( !m_pLastScriptSection ) {
190 m_pScriptSection = m_pLastScriptSection;
191 m_pLastScriptSection = NULL;
194 void CScriptParser::ResetParseSession( void ) {
199 m_pScriptSection = m_pScript;
200 m_pLastScriptSection = NULL;
203 char* CScriptParser::GetBufferCopy( void ) {
208 int len = static_cast<int>( strlen( m_pScript ) );
209 char* pBuffer = new char[len + 1];
210 strcpy( pBuffer, m_pScript );
214 int CScriptParser::GetTokenOffset( void ) {
215 if ( !m_pScript || !m_pScriptSection ) {
219 return static_cast<int>( m_pScriptSection - m_pScript );
222 void CScriptParser::LoadScript( const char* pScript ) {
225 int len = static_cast<int>( strlen( pScript ) );
230 m_pScript = new char[len + 1];
231 m_pScript[len] = '\0';
233 strcpy( m_pScript, pScript );
234 m_pScriptSection = m_pScript;
237 void CScriptParser::AddBreakChar( char c ) {
238 for ( int i = 0; i < SP_MAX_BREAKCHARS; i++ ) {
239 if ( !m_breakChars[i] ) {
245 // TODO: Error: max break chars hit
248 bool CScriptParser::IsBreakChar( char c ) {
249 for ( int i = 0; i < SP_MAX_BREAKCHARS; i++ ) {
250 if ( !m_breakChars[i] ) {
253 if ( m_breakChars[i] == c ) {
260 void CScriptParser::SetScript( char* pScript ) {
263 int len = static_cast<int>( strlen( pScript ) );
269 m_pScriptSection = m_pScript;