3 #define MAX_TAG_LEN 2048
12 static WordStatus GetKeyWordEx(char ** input, char * keyWord, int maxSize, bool treatEqual)
14 char * string = *input;
17 bool quoted = false, start = true, wasQuoted = false;
19 for(; (ch = *string); string++)
21 if(!quoted && wasQuoted)
24 if((ch == ' ' || ch == '\t') && !quoted)
30 if(!quoted && ((ch == ',' || (treatEqual && ch == '=')) || ch == '>') )
32 else if(ch == '\"' /*|| ch == '\''*/)
38 else if(ch != '\r' && ch != '\n')
46 for(;*string == '>' || *string == ',' || *string == ' ' || *string == '=' || *string == '\t' || *string == '\r' || *string == '\n'; string++);
49 return (c > 0) ? (wasQuoted ? Quoted : Normal) : None;
52 static WordStatus GetKeyWord(char ** input, char * keyWord, int maxSize)
54 return GetKeyWordEx(input, keyWord, maxSize, true);
57 #define CHARBUFSIZE 65536
61 virtual void ProcessKeyword(const char * keyWord);
62 virtual void ProcessCharacterData(const char * data);
72 if(string && string[0])
74 GetKeyWord(&string, keyWord, sizeof(keyWord));
80 bool Parse(const char * inputString, int count)
82 bool insideTag = false;
83 char tag[MAX_TAG_LEN];
85 bool commented = false;
88 char characterData[CHARBUFSIZE];
90 int oldDepth = xmlDepth;
95 // Preparse to check for completeness
96 for(stringPos = 0; stringPos < count; stringPos++)
98 byte ch = inputString[stringPos];
102 if((ch == '-' && tagLen < 2) || (ch == '>' && tagLen == 2))
106 if(!strcmp(tag, "-->"))
116 if(ch == '/' && lastCh == '<')
128 else if(lastCh != '?' && lastCh != '/' && tag[0] != '!')
146 else if(ch != '/' || lastCh != '<')
153 if(!strcmp(tag, "!--"))
172 if(xmlDepth > 1 || insideTag || commented)
188 for(stringPos = 0; stringPos < count; stringPos++)
190 char ch = inputString[stringPos];
194 if((ch == '-' && tagLen < 2) || (ch == '>' && tagLen == 2))
198 if(!strcmp(tag, "-->"))
208 if(ch == '/' && lastCh == '<')
219 else if(lastCh != '?' && lastCh != '/' && tag[0] != '!')
235 if(GetKeyWord(&string, keyWord, sizeof(keyWord)))
237 ProcessKeyword(keyWord);
247 else if(ch != '/' || lastCh != '<')
254 if(!strcmp(tag, "!--"))
264 if(ch == '<' || charLen == CHARBUFSIZE - 1)
266 ProcessCharacterData(characterData);
277 characterData[charLen++] = ch;
278 characterData[charLen] = 0;