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 charBufSize = CHARBUFSIZE;
81 if(string && string[0])
83 GetKeyWord(&string, keyWord, sizeof(keyWord));
89 bool Parse(const char * inputString, int count)
91 bool insideTag = false;
92 char tag[MAX_TAG_LEN];
94 bool commented = false;
97 char * characterData = this.characterData;
99 int oldDepth = xmlDepth;
104 // Preparse to check for completeness
105 for(stringPos = 0; stringPos < count; stringPos++)
107 byte ch = inputString[stringPos];
111 if((ch == '-' && tagLen < 2) || (ch == '>' && tagLen == 2))
115 if(!strcmp(tag, "-->"))
125 if(ch == '/' && lastCh == '<')
137 else if(lastCh != '?' && lastCh != '/' && tag[0] != '!')
155 else if(ch != '/' || lastCh != '<')
162 if(!strcmp(tag, "!--"))
181 if(xmlDepth > 1 || insideTag || commented)
197 for(stringPos = 0; stringPos < count; stringPos++)
199 char ch = inputString[stringPos];
203 if((ch == '-' && tagLen < 2) || (ch == '>' && tagLen == 2))
207 if(!strcmp(tag, "-->"))
217 if(ch == '/' && lastCh == '<')
228 else if(lastCh != '?' && lastCh != '/' && tag[0] != '!')
244 if(GetKeyWord(&string, keyWord, sizeof(keyWord)))
246 ProcessKeyword(keyWord);
256 else if(ch != '/' || lastCh != '<')
263 if(!strcmp(tag, "!--"))
274 this.characterData = characterData = new byte[charBufSize];
275 if(ch == '<' || charLen == charBufSize - 1)
277 ProcessCharacterData(characterData);
288 characterData[charLen++] = ch;
289 characterData[charLen] = 0;