2 #include "ScriptParser.h"
\r
4 CScriptParser::CScriptParser(void):
\r
6 m_pScriptSection(NULL),
\r
7 m_pLastScriptSection(NULL),
\r
12 CScriptParser::~CScriptParser(void) {
\r
16 void CScriptParser::ClearBuffer(void) {
\r
25 m_pScriptSection = NULL;
\r
26 m_pLastScriptSection = NULL;
\r
27 memset(m_breakChars, 0, sizeof(m_breakChars));
\r
30 const char* CScriptParser::MakeToken(const char* pToken) {
\r
40 int len = static_cast<int>(strlen(pToken));
\r
42 m_pToken = new char[len + 1];
\r
43 m_pToken[len] = '\0';
\r
44 strcpy(m_pToken, pToken);
\r
49 #define MAX_TOKEN_STRING 1024
\r
50 // Should NEVER return NULL
\r
51 const char* CScriptParser::GetToken(bool bAllowLinebreaks) {
\r
53 char token[MAX_TOKEN_STRING];
\r
54 bool bNewLines = false;
\r
56 m_pLastScriptSection = m_pScriptSection;
\r
61 if(!m_pScript || !m_pScriptSection) {
\r
62 return MakeToken(token);
\r
66 SkipWhitespace( &bNewLines );
\r
67 if ( !*m_pScriptSection ) {
\r
68 return MakeToken(token);
\r
70 if ( bNewLines && !bAllowLinebreaks ) {
\r
71 return MakeToken(token);
\r
74 c = *m_pScriptSection;
\r
76 if ( c == '/' && m_pScriptSection[1] == '/' ) { // C style comments
\r
77 m_pScriptSection += 2;
\r
78 while (*m_pScriptSection && *m_pScriptSection != '\n') {
\r
81 } else if ( c=='/' && m_pScriptSection[1] == '*' ) { // C++ style comments
\r
82 m_pScriptSection += 2;
\r
83 while ( *m_pScriptSection && ( *m_pScriptSection != '*' || m_pScriptSection[1] != '/' ) ) {
\r
86 if ( *m_pScriptSection ) {
\r
87 m_pScriptSection += 2;
\r
97 c = *m_pScriptSection++;
\r
98 if (c=='\"' || !c) {
\r
100 return MakeToken(token);
\r
102 if (len < MAX_TOKEN_STRING) {
\r
110 if(len > 0 && IsBreakChar(*m_pScriptSection)) {
\r
114 if (len < MAX_TOKEN_STRING) {
\r
118 m_pScriptSection++;
\r
120 if(IsBreakChar(c)) {
\r
124 c = *m_pScriptSection;
\r
127 if (len == MAX_TOKEN_STRING) {
\r
132 return MakeToken(token);
\r
135 void CScriptParser::SkipWhitespace(bool* pbNewLines) {
\r
138 if(!m_pScript || !m_pScriptSection) {
\r
142 while( (c = *m_pScriptSection) <= ' ') {
\r
147 *pbNewLines = true;
\r
149 m_pScriptSection++;
\r
153 void CScriptParser::SkipBracedSection(void) {
\r
159 token = GetToken( true );
\r
160 if( token[1] == 0 ) {
\r
161 if( *token == '{' ) {
\r
163 } else if( *token == '}' ) {
\r
167 } while( depth && *m_pScriptSection );
\r
170 void CScriptParser::SkipRestOfLine(void) {
\r
174 p = m_pScriptSection;
\r
175 while ( (c = *p++) != 0 ) {
\r
180 m_pScriptSection = p;
\r
183 void CScriptParser::UndoGetToken(void) {
\r
184 if(!m_pLastScriptSection) {
\r
187 m_pScriptSection = m_pLastScriptSection;
\r
188 m_pLastScriptSection = NULL;
\r
191 void CScriptParser::ResetParseSession(void) {
\r
196 m_pScriptSection = m_pScript;
\r
197 m_pLastScriptSection = NULL;
\r
200 char* CScriptParser::GetBufferCopy(void) {
\r
205 int len = static_cast<int>(strlen(m_pScript));
\r
206 char* pBuffer = new char[len + 1];
\r
207 strcpy(pBuffer, m_pScript);
\r
211 int CScriptParser::GetTokenOffset(void) {
\r
212 if(!m_pScript || !m_pScriptSection) {
\r
216 return static_cast<int>(m_pScriptSection - m_pScript);
\r
219 void CScriptParser::LoadScript(const char* pScript) {
\r
222 int len = static_cast<int>(strlen(pScript));
\r
227 m_pScript = new char[len + 1];
\r
228 m_pScript[len] = '\0';
\r
230 strcpy(m_pScript, pScript);
\r
231 m_pScriptSection = m_pScript;
\r
234 void CScriptParser::AddBreakChar(char c) {
\r
235 for(int i = 0; i < SP_MAX_BREAKCHARS; i++) {
\r
236 if(!m_breakChars[i]) {
\r
237 m_breakChars[i] = c;
\r
242 // TODO: Error: max break chars hit
\r
245 bool CScriptParser::IsBreakChar(char c) {
\r
246 for(int i = 0; i < SP_MAX_BREAKCHARS; i++) {
\r
247 if(!m_breakChars[i]) {
\r
250 if(m_breakChars[i] == c) {
\r
257 void CScriptParser::SetScript(char* pScript) {
\r
260 int len = static_cast<int>(strlen(pScript));
\r
265 m_pScript = pScript;
\r
266 m_pScriptSection = m_pScript;
\r