Overview
Comment: | Fix partial parsing when only half of an UTF-8 char has been received. |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA3-256: |
b236334eaa647fe55a913b8ba8965bef |
User & Date: | js on 2010-06-06 22:38:31 |
Other Links: | manifest | tags |
Context
2010-06-06
| ||
23:31 | Fix a warning with Apple GCC 4.0.1. check-in: 889f63ab01 user: js tags: trunk | |
22:38 | Fix partial parsing when only half of an UTF-8 char has been received. check-in: b236334eaa user: js tags: trunk | |
22:08 | Correctly handle section 2.10 and 2.11 of XML 1.0. check-in: bbbb105f5f user: js tags: trunk | |
Changes
Modified src/OFXMLParser.m from [20f13b2456] to [11560d2f92].
︙ | ︙ | |||
174 175 176 177 178 179 180 | switch (state) { /* Not in a tag */ case OF_XMLPARSER_OUTSIDE_TAG: if (buf[i] == '<') { len = i - last; if (len > 0) | | > | | 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 | switch (state) { /* Not in a tag */ case OF_XMLPARSER_OUTSIDE_TAG: if (buf[i] == '<') { len = i - last; if (len > 0) [cache appendCStringWithoutUTF8Checking: buf + last length: len]; if ([cache cStringLength] > 0) { OFString *str; pool = [[OFAutoreleasePool alloc] init]; str = transform_string(cache, self); [delegate xmlParser: self |
︙ | ︙ | |||
217 218 219 220 221 222 223 | 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) | | > | | 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 | 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) [cache appendCStringWithoutUTF8Checking: buf + last length: len]; cache_c = [cache cString]; cache_len = [cache cStringLength]; if ((tmp = memchr(cache_c, ':', cache_len)) != NULL) { name = [[OFString alloc] initWithCString: tmp + 1 |
︙ | ︙ | |||
298 299 300 301 302 303 304 | buf[i] == '>') { const char *cache_c, *tmp; size_t cache_len; OFString *ns; len = i - last; if (len > 0) | | > | | 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 | buf[i] == '>') { const char *cache_c, *tmp; size_t cache_len; OFString *ns; len = i - last; if (len > 0) [cache appendCStringWithoutUTF8Checking: buf + last length: len]; cache_c = [cache cString]; cache_len = [cache cStringLength]; if ((tmp = memchr(cache_c, ':', cache_len)) != NULL) { name = [[OFString alloc] initWithCString: tmp + 1 |
︙ | ︙ | |||
413 414 415 416 417 418 419 | case OF_XMLPARSER_IN_ATTR_NAME: if (buf[i] == '=') { const char *cache_c, *tmp; size_t cache_len; len = i - last; if (len > 0) | | > | | 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 | case OF_XMLPARSER_IN_ATTR_NAME: if (buf[i] == '=') { const char *cache_c, *tmp; size_t cache_len; len = i - last; if (len > 0) [cache appendCStringWithoutUTF8Checking: buf + last length: len]; cache_c = [cache cString]; cache_len = [cache cStringLength]; if ((tmp = memchr(cache_c, ':', cache_len)) != NULL ) { attrName = [[OFString alloc] |
︙ | ︙ | |||
459 460 461 462 463 464 465 | case OF_XMLPARSER_IN_ATTR_VALUE: if (buf[i] == delim) { OFString *attr_ns; OFString *attr_val; len = i - last; if (len > 0) | | > | | 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 | case OF_XMLPARSER_IN_ATTR_VALUE: if (buf[i] == delim) { OFString *attr_ns; OFString *attr_val; len = i - last; if (len > 0) [cache appendCStringWithoutUTF8Checking: buf + last length: len]; pool = [[OFAutoreleasePool alloc] init]; attr_ns = namespace_for_prefix( (attrPrefix != nil ? attrPrefix : prefix), namespaces); attr_val = transform_string(cache, self); |
︙ | ︙ | |||
536 537 538 539 540 541 542 | break; case OF_XMLPARSER_IN_COMMENT_3: if (buf[i] == '-') state = OF_XMLPARSER_IN_COMMENT_4; break; case OF_XMLPARSER_IN_COMMENT_4: if (buf[i] == '-') { | > | > > | > | | > > < | | | | | | | 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 | break; case OF_XMLPARSER_IN_COMMENT_3: if (buf[i] == '-') state = OF_XMLPARSER_IN_COMMENT_4; break; case OF_XMLPARSER_IN_COMMENT_4: if (buf[i] == '-') { OFMutableString *comment; size_t len; pool = [[OFAutoreleasePool alloc] init]; [cache appendCStringWithoutUTF8Checking: buf + last length: i - last]; comment = [[cache mutableCopy] autorelease]; len = [comment length]; [comment removeCharactersFromIndex: len - 1 toIndex: len]; [comment removeLeadingAndTrailingWhitespaces]; [delegate xmlParser: self foundComment: comment]; [pool release]; [cache setToCString: ""]; last = i + 1; state = OF_XMLPARSER_EXPECT_CLOSE; } else state = OF_XMLPARSER_IN_COMMENT_3; break; } } len = size - last; /* In OF_XMLPARSER_IN_TAG, there can be only spaces */ if (len > 0 && state != OF_XMLPARSER_IN_TAG) [cache appendCStringWithoutUTF8Checking: buf + last length: len]; } - (OFString*)foundUnknownEntityNamed: (OFString*)entity { return [delegate xmlParser: self foundUnknownEntityNamed: entity]; } |
︙ | ︙ |
Modified tests/OFXMLParserTests.m from [43eb47dbde] to [24b4ef9bb7].
︙ | ︙ | |||
280 281 282 283 284 285 286 | OFAutoreleasePool *pool = [[OFAutoreleasePool alloc] init]; OFXMLParser *parser; const char *str = "foo<bar/>\n" "<foobar xmlns='urn:objfw:test:foobar'>\n" " <qux xmlns:foo='urn:objfw:test:foo'>\n" " <foo:bla foo:bla='bla' blafoo='foo'>\n" " <blup foo:qux='asd' quxqux='test'/>\n" | | | 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 | OFAutoreleasePool *pool = [[OFAutoreleasePool alloc] init]; OFXMLParser *parser; const char *str = "foo<bar/>\n" "<foobar xmlns='urn:objfw:test:foobar'>\n" " <qux xmlns:foo='urn:objfw:test:foo'>\n" " <foo:bla foo:bla='bla' blafoo='foo'>\n" " <blup foo:qux='asd' quxqux='test'/>\n" " <bla:bla\r\rxmlns:bla=\"urn:objfw:test:bla\" qux='qux'\r\n" " bla:foo='blafoo'/>\n" " <abc xmlns='urn:objfw:test:abc' abc='abc' foo:abc='abc'/>\n" " </foo:bla>\n" " <!-- commänt -->\n" " </qux>\n" "</foobar>"; size_t j, len; |
︙ | ︙ |