-import "ecere"
+public import "ecere"
#define MAX_TAG_LEN 2048
if(!quoted && wasQuoted)
break;
- if((ch == ' ' || ch == '\t') && !quoted)
+ if((ch == ' ' || ch == '\t') && !quoted)
{
if(!start) break;
}
}
else if(ch != '\r' && ch != '\n')
{
- if(c < maxSize)
+ if(c < maxSize)
keyWord[c++] = ch;
start = false;
}
class XMLParser
{
- virtual void ProcessKeyword(char * keyWord);
- virtual void ProcessCharacterData(char * data);
+ virtual void ProcessKeyword(const char * keyWord);
+ virtual void ProcessCharacterData(const char * data);
char keyWord[1024];
char * string;
int xmlDepth;
bool closingTag;
bool openingTag;
+ char * characterData;
+ uint charBufSize;
+
+ charBufSize = CHARBUFSIZE;
+
+ ~XMLParser()
+ {
+ delete characterData;
+ }
bool GetWord()
{
return false;
}
- bool Parse(char * inputString, int count)
+ bool Parse(const char * inputString, int count)
{
bool insideTag = false;
char tag[MAX_TAG_LEN];
- int tagLen;
+ int tagLen = 0;
bool commented = false;
byte lastCh = ' ';
int stringPos;
- byte characterData[CHARBUFSIZE];
+ char * characterData = this.characterData;
int charLen = 0;
int oldDepth = xmlDepth;
-
+ tag[0] = 0;
+
closingTag = false;
-
+
// Preparse to check for completeness
for(stringPos = 0; stringPos < count; stringPos++)
{
byte ch = inputString[stringPos];
-
+
if(commented)
{
if((ch == '-' && tagLen < 2) || (ch == '>' && tagLen == 2))
{
+ tag[tagLen++] = ch;
+ tag[tagLen] = '\0';
if(!strcmp(tag, "-->"))
{
commented = false;
}
}
+ else
+ tagLen = 0;
}
else if(insideTag)
{
if(ch == '<')
{
insideTag++;
+ openingTag = true;
}
else if(ch == '>')
{
if(closingTag)
xmlDepth--;
- else if(lastCh != '?' && lastCh != '/')
+ else if(lastCh != '?' && lastCh != '/' && tag[0] != '!')
xmlDepth++;
+ else
+ {
+ closingTag = true;
+ openingTag = true;
+ }
+
insideTag--;
+ if(!insideTag)
+ tag[tagLen] = '\0';
+ else
+ {
+ tag[tagLen++] = ch;
+ tag[tagLen] = '\0';
+ }
closingTag = false;
}
-
+ else if(ch != '/' || lastCh != '<')
+ {
+ tag[tagLen++] = ch;
+ tag[tagLen] = '\0';
+ }
+ else
+ openingTag = false;
if(!strcmp(tag, "!--"))
{
commented = true;
insideTag = false;
+ tagLen = 0;
+ tag[tagLen] = '\0';
}
}
else
{
if(ch == '<')
{
+ openingTag = true;
insideTag = true;
+ tagLen = 0;
}
}
lastCh = ch;
insideTag = false;
closingTag = false;
openingTag = false;
+ tag[0] = 0;
// Parse entire file
for(stringPos = 0; stringPos < count; stringPos++)
{
- byte ch = inputString[stringPos];
-
+ char ch = inputString[stringPos];
+
if(commented)
{
if((ch == '-' && tagLen < 2) || (ch == '>' && tagLen == 2))
{
if(closingTag)
xmlDepth--;
- else if(lastCh != '?' && lastCh != '/')
+ else if(lastCh != '?' && lastCh != '/' && tag[0] != '!')
xmlDepth++;
else
{
}
else
{
- if(ch == '<' || charLen == CHARBUFSIZE - 1)
+ if(!characterData)
+ this.characterData = characterData = new byte[charBufSize];
+ if(ch == '<' || charLen == charBufSize - 1)
{
ProcessCharacterData(characterData);
- charLen = 0;
+ charLen = 0;
}
if(ch == '<')
{