ObjFW  Check-in [66cb66e6d8]

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: 66cb66e6d8660ae9cfd4b61b05b5504d3ffda3c583dc2281587b4c6c35b0904e
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
144

145
146
147
148
149
150
151
152
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_1,
		OF_XMLPARSER_IN_CDATA,
		OF_XMLPARSER_IN_CDATA_2,
		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
157

158
159
160
161
162
163
164
165
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_inCDATAState1),
		@selector(OF_inCDATAState),
		@selector(OF_inCDATAState2),
		@selector(OF_inCommentOpeningState),
		@selector(OF_inCommentState1),
		@selector(OF_inCommentState2),
		@selector(OF_inDOCTYPEState)
	};
	memcpy(selectors, selectors_, sizeof(selectors_));

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




955
956

957
958

959
960
961




962
963
964
965
966
967
968
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_1;
		_state = OF_XMLPARSER_IN_CDATA;
		_level = 0;
	}

	_last = _i + 1;
}

- (void)OF_inCDATAState1
- (void)OF_inCDATAState
{

	if (_data[_i] == ']')
		_level++;
	else
		_level = 0;

	else if (_data[_i] == '>' && _level >= 2) {
	if (_level == 2)
		_state = OF_XMLPARSER_IN_CDATA_2;
}

- (void)OF_inCDATAState2
{
	void *pool;
	OFString *CDATA;
		void *pool = objc_autoreleasePoolPush();
		OFString *CDATA;

	if (_data[_i] != '>') {
		_state = OF_XMLPARSER_IN_CDATA_1;
		_level = (_data[_i] == ']' ? 1 : 0);

		return;
	}

	pool = objc_autoreleasePoolPush();

	buffer_append(_buffer, _data + _last, _encoding, _i - _last);
	CDATA = transform_string(_buffer, 2, false, nil);
		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];
		if ([_delegate respondsToSelector:
		    @selector(parser:foundCDATA:)])
			[_delegate parser: self
			       foundCDATA: CDATA];

	objc_autoreleasePoolPop(pool);
		objc_autoreleasePoolPop(pool);

	[_buffer removeAllItems];
		[_buffer removeAllItems];

	_last = _i + 1;
	_state = OF_XMLPARSER_OUTSIDE_TAG;
		_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
74

75
76
77
78
79
80
81
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"] &&
		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
328

329
330
331
332
333
334
335
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"
	    " <![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 = '&#x62;&#x6c;&#x61;' 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"