@@ -78,22 +78,23 @@ attr->ns = [attr_ns retain]; } @implementation OFXMLParser #if defined(OF_HAVE_PROPERTIES) && defined(OF_HAVE_BLOCKS) -@synthesize elementStartHandler, elementEndHandler, charactersHandler; -@synthesize CDATAHandler, commentHandler, unknownEntityHandler; +@synthesize processingInstructionsHandler, elementStartHandler; +@synthesize elementEndHandler, charactersHandler, CDATAHandler, commentHandler; +@synthesize unknownEntityHandler; #endif + (void)initialize { size_t i; const SEL sels[] = { @selector(_parseOutsideTagWithBuffer:i:last:), @selector(_parseTagOpenedWithBuffer:i:last:), - @selector(_parseInPrologWithBuffer:i:last:), + @selector(_parseInProcessingInstructionsWithBuffer:i:last:), @selector(_parseInTagNameWithBuffer:i:last:), @selector(_parseInCloseTagNameWithBuffer:i:last:), @selector(_parseInTagWithBuffer:i:last:), @selector(_parseInAttributeNameWithBuffer:i:last:), @selector(_parseExpectDelimiterWithBuffer:i:last:), @@ -283,11 +284,12 @@ last: (size_t*)last { switch (buf[*i]) { case '?': *last = *i + 1; - state = OF_XMLPARSER_IN_PROLOG; + state = OF_XMLPARSER_IN_PROCESSING_INSTRUCTIONS; + level = 0; break; case '/': *last = *i + 1; state = OF_XMLPARSER_IN_CLOSE_TAG_NAME; break; @@ -301,18 +303,40 @@ break; } } /* Inside prolog */ -- (void)_parseInPrologWithBuffer: (const char*)buf - i: (size_t*)i - last: (size_t*)last +- (void)_parseInProcessingInstructionsWithBuffer: (const char*)buf + i: (size_t*)i + last: (size_t*)last { - *last = *i + 1; - if (buf[*i] == '?') - state = OF_XMLPARSER_EXPECT_CLOSE; + level = 1; + else if (level == 1 && buf[*i] == '>') { + OFAutoreleasePool *pool = [[OFAutoreleasePool alloc] init]; + OFMutableString *pi; + size_t len; + + [cache appendCStringWithoutUTF8Checking: buf + *last + length: *i - *last]; + pi = [[cache mutableCopy] autorelease]; + len = [pi length]; + + [pi removeCharactersFromIndex: len - 1 + toIndex: len]; + + [delegate parser: self + foundProcessingInstructions: pi]; + + [pool release]; + + [cache setToCString: ""]; + + *last = *i + 1; + state = OF_XMLPARSER_OUTSIDE_TAG; + } else + level = 0; } /* Inside a tag, no name yet */ - (void)_parseInTagNameWithBuffer: (const char*)buf i: (size_t*)i @@ -857,10 +881,15 @@ foundUnknownEntityNamed: entity]; } @end @implementation OFObject (OFXMLParserDelegate) +- (void)parser: (OFXMLParser*)parser + foundProcessingInstructions: (OFString*)pi +{ +} + - (void)parser: (OFXMLParser*)parser didStartElement: (OFString*)name withPrefix: (OFString*)prefix namespace: (OFString*)ns attributes: (OFArray*)attrs