@@ -92,11 +92,11 @@ @selector(_parseInAttributeNameWithBuffer:i:last:), @selector(_parseExpectDelimiterWithBuffer:i:last:), @selector(_parseInAttributeValueWithBuffer:i:last:), @selector(_parseExpectCloseWithBuffer:i:last:), @selector(_parseExpectSpaceOrCloseWithBuffer:i:last:), - @selector(_parseInCDATAOrCommentWithBuffer:i:last:), + @selector(_parseInExclamationMarkWithBuffer:i:last:), @selector(_parseInCDATAOpening1WithBuffer:i:last:), @selector(_parseInCDATAOpening2WithBuffer:i:last:), @selector(_parseInCDATAOpening3WithBuffer:i:last:), @selector(_parseInCDATAOpening4WithBuffer:i:last:), @selector(_parseInCDATAOpening5WithBuffer:i:last:), @@ -105,11 +105,12 @@ @selector(_parseInCDATA2WithBuffer:i:last:), @selector(_parseInCDATA3WithBuffer:i:last:), @selector(_parseInCommentOpeningWithBuffer:i:last:), @selector(_parseInComment1WithBuffer:i:last:), @selector(_parseInComment2WithBuffer:i:last:), - @selector(_parseInComment3WithBuffer:i:last:) + @selector(_parseInComment3WithBuffer:i:last:), + @selector(_parseInDoctypeWithBuffer:i:last:), }; memcpy(selectors, sels, sizeof(sels)); for (i = 0; i < OF_XMLPARSER_NUM_STATES; i++) { if (![self instancesRespondToSelector: selectors[i]]) @@ -334,11 +335,11 @@ *last = *i + 1; state = OF_XMLPARSER_IN_CLOSE_TAG_NAME; break; case '!': *last = *i + 1; - state = OF_XMLPARSER_IN_CDATA_OR_COMMENT; + state = OF_XMLPARSER_IN_EXCLAMATIONMARK; break; default: state = OF_XMLPARSER_IN_TAG_NAME; (*i)--; break; @@ -713,20 +714,23 @@ state = OF_XMLPARSER_OUTSIDE_TAG; } else if (buf[*i] != ' ' && buf[*i] != '\n' && buf[*i] != '\r') @throw [OFMalformedXMLException newWithClass: isa]; } -/* CDATA or comment */ -- (void)_parseInCDATAOrCommentWithBuffer: (const char*)buf - i: (size_t*)i - last: (size_t*)last +/* In */ +- (void)_parseInDoctypeWithBuffer: (const char*)buf + i: (size_t*)i + last: (size_t*)last +{ + if ((level < 6 && buf[*i] != "OCTYPE"[level]) || + (level == 6 && buf[*i] != ' ' && buf[*i] != '\t' && + buf[*i] != '\n' && buf[*i] != '\r')) + @throw [OFMalformedXMLException newWithClass: isa]; + + if (level < 7 || buf[*i] == '<') + level++; + + if (buf[*i] == '>') { + if (level == 7) + state = OF_XMLPARSER_OUTSIDE_TAG; + else + level--; + } + + *last = *i + 1; +} - (OFString*)string: (OFString*)string containsUnknownEntityNamed: (OFString*)entity { #ifdef OF_HAVE_BLOCKS