Index: src/OFXMLParser.m ================================================================== --- src/OFXMLParser.m +++ src/OFXMLParser.m @@ -180,11 +180,12 @@ } break; /* Inside a tag, no name yet */ case OF_XMLPARSER_IN_TAG_NAME: - if (buf[i] == ' ' || buf[i] == '>' || buf[i] == '/') { + if (buf[i] == ' ' || buf[i] == '\n' || buf[i] == '\r' || + buf[i] == '>' || buf[i] == '/') { const char *cache_c, *tmp; size_t cache_len; len = i - last; if (len > 0) @@ -243,11 +244,12 @@ } break; /* Inside a close tag, no name yet */ case OF_XMLPARSER_IN_CLOSE_TAG_NAME: - if (buf[i] == ' ' || buf[i] == '>') { + if (buf[i] == ' ' || buf[i] == '\n' || buf[i] == '\r' || + buf[i] == '>') { const char *cache_c, *tmp; size_t cache_len; len = i - last; if (len > 0) @@ -290,11 +292,12 @@ [prefix release]; [ns release]; name = prefix = ns = nil; last = i + 1; - state = (buf[i] == ' ' + state = (buf[i] == ' ' || buf[i] == '\n' || + buf[i] == '\r' ? OF_XMLPARSER_EXPECT_SPACE_OR_CLOSE : OF_XMLPARSER_OUTSIDE_TAG); } break; @@ -334,11 +337,12 @@ last = i + 1; state = (buf[i] == '/' ? OF_XMLPARSER_EXPECT_CLOSE : OF_XMLPARSER_OUTSIDE_TAG); - } else if (buf[i] != ' ') { + } else if (buf[i] != ' ' && buf[i] != '\n' && + buf[i] != '\r') { last = i; state = OF_XMLPARSER_IN_ATTR_NAME; i--; } break; @@ -435,11 +439,12 @@ /* Expecting closing '>' or space */ case OF_XMLPARSER_EXPECT_SPACE_OR_CLOSE: if (buf[i] == '>') { last = i + 1; state = OF_XMLPARSER_OUTSIDE_TAG; - } else if (buf[i] != ' ') + } else if (buf[i] != ' ' && buf[i] != '\n' && + buf[i] != '\r') @throw [OFMalformedXMLException newWithClass: isa]; break; /* Comment */ Index: tests/OFXMLParserTests.m ================================================================== --- tests/OFXMLParserTests.m +++ tests/OFXMLParserTests.m @@ -111,11 +111,11 @@ /* FIXME: Namespace */ TEST(msg, et == TAG_END && [name isEqual: @"bar"] && [prefix isEqual: @"foo"] && ns == nil) break; case 11: - TEST(msg, et == COMMENT && [comment isEqual: @"foo bär-baz"]) + TEST(msg, et == COMMENT && [comment isEqual: @"foobär baz"]) break; default: TEST(msg, NO) break; } @@ -185,13 +185,13 @@ - (void)XMLParserTests { OFAutoreleasePool *pool = [[OFAutoreleasePool alloc] init]; OFXMLParser *parser; - const char *str = "bar\r\n" - "foo<barbar quxbar\r\n" - ""; + const char *str = "bar\r\nfoo<barbar quxbar\r\n"; size_t j, len; TEST(@"+[xmlParser]", (parser = [OFXMLParser xmlParser])) TEST(@"-[setDelegate:]", R([parser setDelegate: self]))