Overview
Comment: | OFXMLParser: Fix parsing of <![CDATA[x]]]>. |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA3-256: |
66cb66e6d8660ae9cfd4b61b05b5504d |
User & Date: | js on 2013-08-01 22:12:20 |
Other Links: | manifest | tags |
Context
2013-08-01
| ||
23:07 | OFXMLParser: Improve handling of whitespaces. check-in: a69e13fa8d user: js tags: trunk | |
22:12 | OFXMLParser: Fix parsing of <![CDATA[x]]]>. check-in: 66cb66e6d8 user: js tags: trunk | |
18:59 | Add of_forward_stret for MIPS/ELF. check-in: d694ea89af user: js tags: trunk | |
Changes
Modified src/OFXMLParser.h from [cb1201f0a4] to [4fa33b0da4].
︙ | ︙ | |||
137 138 139 140 141 142 143 | OF_XMLPARSER_IN_ATTR_NAME, OF_XMLPARSER_EXPECT_DELIMITER, OF_XMLPARSER_IN_ATTR_VALUE, OF_XMLPARSER_EXPECT_CLOSE, OF_XMLPARSER_EXPECT_SPACE_OR_CLOSE, OF_XMLPARSER_IN_EXCLAMATIONMARK, OF_XMLPARSER_IN_CDATA_OPENING, | | < | 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 | OF_XMLPARSER_IN_ATTR_NAME, OF_XMLPARSER_EXPECT_DELIMITER, OF_XMLPARSER_IN_ATTR_VALUE, OF_XMLPARSER_EXPECT_CLOSE, OF_XMLPARSER_EXPECT_SPACE_OR_CLOSE, OF_XMLPARSER_IN_EXCLAMATIONMARK, OF_XMLPARSER_IN_CDATA_OPENING, OF_XMLPARSER_IN_CDATA, OF_XMLPARSER_IN_COMMENT_OPENING, OF_XMLPARSER_IN_COMMENT_1, OF_XMLPARSER_IN_COMMENT_2, OF_XMLPARSER_IN_DOCTYPE, OF_XMLPARSER_NUM_STATES } _state; size_t _i, _last; |
︙ | ︙ |
Modified src/OFXMLParser.m from [c5cbe08edf] to [a08464f480].
︙ | ︙ | |||
150 151 152 153 154 155 156 | @selector(OF_inAttributeNameState), @selector(OF_expectDelimiterState), @selector(OF_inAttributeValueState), @selector(OF_expectCloseState), @selector(OF_expectSpaceOrCloseState), @selector(OF_inExclamationMarkState), @selector(OF_inCDATAOpeningState), | | < | 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 | @selector(OF_inAttributeNameState), @selector(OF_expectDelimiterState), @selector(OF_inAttributeValueState), @selector(OF_expectCloseState), @selector(OF_expectSpaceOrCloseState), @selector(OF_inExclamationMarkState), @selector(OF_inCDATAOpeningState), @selector(OF_inCDATAState), @selector(OF_inCommentOpeningState), @selector(OF_inCommentState1), @selector(OF_inCommentState2), @selector(OF_inDOCTYPEState) }; memcpy(selectors, selectors_, sizeof(selectors_)); |
︙ | ︙ | |||
910 911 912 913 914 915 916 | /* CDATA */ - (void)OF_inCDATAOpeningState { if (_data[_i] != "CDATA["[_level]) @throw [OFMalformedXMLException exceptionWithParser: self]; if (++_level == 6) { | | | > < < | < < < < < < | | < < < < < < < < < | | | > | | | | | | > > | 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 | /* CDATA */ - (void)OF_inCDATAOpeningState { if (_data[_i] != "CDATA["[_level]) @throw [OFMalformedXMLException exceptionWithParser: self]; if (++_level == 6) { _state = OF_XMLPARSER_IN_CDATA; _level = 0; } _last = _i + 1; } - (void)OF_inCDATAState { if (_data[_i] == ']') _level++; else if (_data[_i] == '>' && _level >= 2) { void *pool = objc_autoreleasePoolPush(); OFString *CDATA; buffer_append(_buffer, _data + _last, _encoding, _i - _last); CDATA = transform_string(_buffer, 2, false, nil); if ([_delegate respondsToSelector: @selector(parser:foundCDATA:)]) [_delegate parser: self foundCDATA: CDATA]; objc_autoreleasePoolPop(pool); [_buffer removeAllItems]; _last = _i + 1; _state = OF_XMLPARSER_OUTSIDE_TAG; } else _level = 0; } /* Comment */ - (void)OF_inCommentOpeningState { if (_data[_i] != '-') @throw [OFMalformedXMLException exceptionWithParser: self]; |
︙ | ︙ |
Modified tests/OFXMLParserTests.m from [5633d6614b] to [4a4fe040f0].
︙ | ︙ | |||
67 68 69 70 71 72 73 | TEST(msg, et == TAG_START && [name isEqual: @"root"] && prefix == nil && ns == nil && [attrs count] == 0) break; case 4: TEST(msg, et == STRING && [string isEqual: @"\n\n "]) break; case 5: | | | 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 | TEST(msg, et == TAG_START && [name isEqual: @"root"] && prefix == nil && ns == nil && [attrs count] == 0) break; case 4: TEST(msg, et == STRING && [string isEqual: @"\n\n "]) break; case 5: TEST(msg, et == CDATA && [string isEqual: @"f<]]]oo]"] && [parser lineNumber] == 3) break; case 6: TEST(msg, et == TAG_START && [name isEqual: @"bar"] && prefix == nil && ns == nil && attrs == nil) break; case 7: |
︙ | ︙ | |||
321 322 323 324 325 326 327 | } - (void)XMLParserTests { OFAutoreleasePool *pool = [[OFAutoreleasePool alloc] init]; const char *str = "\xEF\xBB\xBF<?xml version='1.0'?><?p?i?>" "<!DOCTYPE foo><root>\r\r" | | | 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 | } - (void)XMLParserTests { OFAutoreleasePool *pool = [[OFAutoreleasePool alloc] init]; const char *str = "\xEF\xBB\xBF<?xml version='1.0'?><?p?i?>" "<!DOCTYPE foo><root>\r\r" " <![CDATA[f<]]]oo]]]><bar/>\n" " <foobar xmlns='urn:objfw:test:foobar'>\r\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\r=\t\"urn:objfw:test:bla\" qux='qux'\r\n" " bla:foo='blafoo'/>\n" " <abc xmlns='urn:objfw:test:abc' abc='abc' foo:abc='abc'/>\n" |
︙ | ︙ |