ecere/gfx/imgDistMap: authorship notice update
[sdk] / extras / XMLParser.ec
index 9cd67e2..1822c6b 100644 (file)
@@ -1,4 +1,4 @@
-import "ecere"
+public import "ecere"
 
 #define MAX_TAG_LEN  2048
 
@@ -21,7 +21,7 @@ static WordStatus GetKeyWordEx(char ** input, char * keyWord, int maxSize, bool
       if(!quoted && wasQuoted)
          break;
 
-      if((ch == ' ' || ch == '\t') && !quoted) 
+      if((ch == ' ' || ch == '\t') && !quoted)
       {
          if(!start) break;
       }
@@ -37,7 +37,7 @@ static WordStatus GetKeyWordEx(char ** input, char * keyWord, int maxSize, bool
          }
          else if(ch != '\r' && ch != '\n')
          {
-            if(c < maxSize) 
+            if(c < maxSize)
                keyWord[c++] = ch;
             start = false;
          }
@@ -58,14 +58,23 @@ static WordStatus GetKeyWord(char ** input, char * keyWord, int maxSize)
 
 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()
    {
@@ -77,34 +86,39 @@ class XMLParser
       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)
          {
@@ -114,28 +128,52 @@ class XMLParser
             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;
@@ -153,12 +191,13 @@ class XMLParser
       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))
@@ -186,7 +225,7 @@ class XMLParser
             {
                if(closingTag)
                   xmlDepth--;
-               else if(lastCh != '?' && lastCh != '/')
+               else if(lastCh != '?' && lastCh != '/' && tag[0] != '!')
                   xmlDepth++;
                else
                {
@@ -231,10 +270,12 @@ class XMLParser
          }
          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 == '<')
             {