File 3321-xmerl-Implement-handling-of-parsed-entity-content.patch of Package erlang

From e986228e8cc236e9554aeea8831d78eef2e8a58b Mon Sep 17 00:00:00 2001
From: zadean <contact@zadean.com>
Date: Mon, 2 Sep 2019 13:48:07 +0200
Subject: [PATCH 1/5] [xmerl] Implement handling of parsed entity content

- add function parse_text_decl/2 [77]
- add function parse_entity_content/4 [43]
- uncomment/unskip tests related to external entities

3 tests remain skipped due to differing encoding between XML document
and the entity file:
1. valid-ext-sa-007
2. valid-ext-sa-008
3. valid-ext-sa-014
---
 lib/xmerl/src/xmerl_sax_parser_base.erlsrc | 151 ++++++++++++++++++++++++--
 lib/xmerl/test/xmerl_sax_std_SUITE.erl     | 166 ++++++++++++++---------------
 2 files changed, 227 insertions(+), 90 deletions(-)

diff --git a/lib/xmerl/src/xmerl_sax_parser_base.erlsrc b/lib/xmerl/src/xmerl_sax_parser_base.erlsrc
index ef753c7148..d7128dd4d0 100644
--- a/lib/xmerl/src/xmerl_sax_parser_base.erlsrc
+++ b/lib/xmerl/src/xmerl_sax_parser_base.erlsrc
@@ -273,7 +273,67 @@ parse_xml_decl_rest(?STRING_UNBOUND_REST(C, Rest) = Bytes, State) ->
 parse_xml_decl_rest(Bytes, State) ->
     unicode_incomplete_check([Bytes, State, fun parse_xml_decl_rest/2], undefined).
 
-
+%%----------------------------------------------------------------------
+%% Function: parse_text_decl(Rest, State) -> Result
+%% Input:    Rest = string() | binary()
+%%           State = #xmerl_sax_parser_state{}
+%% Output:   Result = {Rest, State}
+%% Description: Parsing the text declaration in an external parsed entity.
+%%             [77] TextDecl ::=    '<?xml' VersionInfo? EncodingDecl S? '?>'
+%%----------------------------------------------------------------------
+parse_text_decl(?STRING_EMPTY, State) ->
+    cf(?STRING_EMPTY, State, fun parse_text_decl/2);
+parse_text_decl(?STRING("<") = Bytes, State) ->
+    cf(Bytes, State, fun parse_text_decl/2);
+parse_text_decl(?STRING("<?") = Bytes, State) ->
+    cf(Bytes, State, fun parse_text_decl/2);
+parse_text_decl(?STRING("<?x") = Bytes, State) ->
+    cf(Bytes, State, fun parse_text_decl/2);
+parse_text_decl(?STRING("<?xm") = Bytes, State) ->
+    cf(Bytes, State, fun parse_text_decl/2);
+parse_text_decl(?STRING("<?xml") = Bytes, State) ->
+    cf(Bytes, State, fun parse_text_decl/2);
+parse_text_decl(?STRING_REST("<?xml", Rest1), State) ->
+    parse_text_decl_rest(Rest1, State);
+parse_text_decl(Bytes, State) when is_binary(Bytes) ->
+    {Bytes, State}.
+
+parse_text_decl_rest(?STRING_EMPTY, State) ->
+    cf(?STRING_EMPTY, State, fun parse_text_decl_rest/2);
+parse_text_decl_rest(?STRING("?") = Rest, State) ->
+    cf(Rest, State, fun parse_text_decl_rest/2);
+parse_text_decl_rest(?STRING("v") = Rest, State) ->
+    cf(Rest, State, fun parse_text_decl_rest/2);
+parse_text_decl_rest(?STRING("e") = Rest, State) ->
+    cf(Rest, State, fun parse_text_decl_rest/2);
+parse_text_decl_rest(?STRING_UNBOUND_REST("?>", Rest) = _Bytes, State) ->
+    {Rest, State};
+parse_text_decl_rest(?STRING_UNBOUND_REST(C, _) = Rest, State) when ?is_whitespace(C) ->
+    {_WS, Rest1, State1} = whitespace(Rest, State, []),
+    parse_text_decl_rest(Rest1, State1);
+parse_text_decl_rest(?STRING_UNBOUND_REST("v", Rest) = _Bytes, State) ->
+    case parse_name(Rest, State, [$v]) of
+        {"version", Rest1, State1} ->
+            {Rest2, State2} = parse_eq(Rest1, State1),
+            {_Version, Rest3, State3} = parse_att_value(Rest2, State2),
+            parse_text_decl_rest(Rest3, State3);
+        {_, _, State1} ->
+            ?fatal_error(State1, "expecting attribute version")
+    end;
+parse_text_decl_rest(?STRING_UNBOUND_REST("e", Rest) = _Bytes, State) ->
+    case parse_name(Rest, State, [$e]) of
+        {"encoding", Rest1, State1} ->
+            {Rest2, State2} = parse_eq(Rest1, State1),
+            {_Version, Rest3, State3} = parse_att_value(Rest2, State2),
+            parse_text_decl_rest(Rest3, State3);
+        {_, _, State1} ->
+            ?fatal_error(State1, "expecting attribute encoding")
+    end;
+parse_text_decl_rest(?STRING_UNBOUND_REST(_, _), State) ->
+    ?fatal_error(State, "expecting attribute encoding or version");
+parse_text_decl_rest(Bytes, State) ->
+    unicode_incomplete_check([Bytes, State, fun parse_text_decl_rest/2], 
+                             "expecting attribute encoding or version").
 
 %%----------------------------------------------------------------------
 %% Function: parse_prolog(Rest, State) -> Result
@@ -1254,6 +1314,81 @@ parse_content(Bytes, State, Acc, IgnorableWS)   ->
     unicode_incomplete_check([Bytes, State, Acc, IgnorableWS, fun parse_content/4],
 			     undefined).
 
+%%----------------------------------------------------------------------
+%% Function: parse_entity_content(Rest, State, Acc, IgnorableWS) -> Result
+%% Parameters: Rest = string() | binary()
+%%             State = #xmerl_sax_parser_state{}
+%%             Acc = string()
+%%             IgnorableWS = true | false
+%% Result    : {Rest, State}
+%% Description: Parsing the content part of an external entity
+%%              [43] content ::= (element | CharData | Reference | CDSect | PI | Comment)*
+%%----------------------------------------------------------------------
+parse_entity_content(?STRING_EMPTY, State, Acc, IgnorableWS) ->
+    parse_content(?STRING_EMPTY, State, Acc, IgnorableWS);
+parse_entity_content(?STRING_REST("<", Rest1), State, Acc, IgnorableWS) ->
+    State1 = send_character_event(length(Acc), IgnorableWS, lists:reverse(Acc), State),
+    case parse_stag(Rest1, State1) of
+        {?STRING_EMPTY, State2} ->
+            {?STRING_EMPTY, State2};
+        {Rest2, State2} when is_record(State2, xmerl_sax_parser_state) ->
+            parse_entity_content(Rest2, State2, [], true);
+        Other ->
+            Other
+    end;
+parse_entity_content(?STRING_REST("\n", Rest), State, Acc, IgnorableWS) ->
+    N = State#xmerl_sax_parser_state.line_no,
+    parse_entity_content(Rest, State#xmerl_sax_parser_state{line_no=N+1},[?lf |Acc], IgnorableWS);
+parse_entity_content(?STRING_REST("\r\n", Rest), State, Acc, IgnorableWS) ->
+    N = State#xmerl_sax_parser_state.line_no,
+    parse_entity_content(Rest, State#xmerl_sax_parser_state{line_no=N+1},[?lf |Acc], IgnorableWS);
+parse_entity_content(?STRING_REST("\r", Rest), State, Acc, IgnorableWS) ->
+    N = State#xmerl_sax_parser_state.line_no,
+    parse_entity_content(Rest, State#xmerl_sax_parser_state{line_no=N+1},[?lf |Acc], IgnorableWS);
+parse_entity_content(?STRING_REST(" ", Rest), State, Acc, IgnorableWS) ->
+    parse_entity_content(Rest, State,[?space |Acc], IgnorableWS);
+parse_entity_content(?STRING_REST("\t", Rest), State, Acc, IgnorableWS) ->
+    parse_entity_content(Rest, State,[?tab |Acc], IgnorableWS);
+parse_entity_content(?STRING_REST("&", Rest), State, Acc, _IgnorableWS) ->
+    {Ref, Rest1, State1} = parse_reference(Rest, State, true),
+    case Ref of 
+        {character, _, CharValue}  ->
+            parse_entity_content(Rest1, State1, [CharValue | Acc], false);
+        {internal_general, true, _, Value} ->
+            parse_entity_content(Rest1, State1, Value ++ Acc, false);
+        {internal_general, false, _, Value} ->
+            IValue = ?TO_INPUT_FORMAT(Value),
+            parse_entity_content(?APPEND_STRING(IValue, Rest1), State1, Acc, false);     
+        {external_general, _, {PubId, SysId}} ->
+            State2 = parse_external_entity(State1, PubId, SysId),
+            parse_entity_content(Rest1, State2, Acc, false);
+        {not_found, Name} ->
+            case State#xmerl_sax_parser_state.skip_external_dtd of
+                false ->
+                    ?fatal_error(State1, "Entity not declared: " ++ Name); %%VC: Entity Declared
+                true ->
+                    parse_entity_content(Rest1, State1, ";" ++ lists:reverse(Name) ++ "&" ++ Acc, false)
+            end;
+        {unparsed, Name, _}  ->
+            ?fatal_error(State1, "Unparsed entity reference in content: " ++ Name)
+    end;
+parse_entity_content(?STRING_UNBOUND_REST(C, Rest), State, Acc, _IgnorableWS) ->
+    if 
+        ?is_char(C) ->
+            case parse_content(Rest, State, [C|Acc], false) of
+                {?STRING_EMPTY, State1} ->
+                    {?STRING_EMPTY, State1};
+                {Rest1, State1} when is_record(State1, xmerl_sax_parser_state) ->
+                    parse_entity_content(Rest1, State1, [], true);
+                Other ->
+                    Other
+            end;
+        true ->
+            ?fatal_error(State, lists:flatten(io_lib:format("Bad character in content: ~p", [C])))
+    end;
+parse_entity_content(Bytes, State, Acc, IgnorableWS)   ->
+    unicode_incomplete_check([Bytes, State, Acc, IgnorableWS, fun parse_entity_content/4],
+              undefined).
 
 %%----------------------------------------------------------------------
 %% Function: check_if_document_complete(State, ErrorMsg) -> Result
@@ -1808,11 +1943,11 @@ handle_external_entity({Tag, _Url}, State) ->
 %% Result    : {Rest, State}
 %% Description: Parse the external entity.
 %%----------------------------------------------------------------------
-parse_external_entity_1(?STRING_EMPTY, #xmerl_sax_parser_state{file_type=Type} = State) ->
+parse_external_entity_1(?STRING_EMPTY, State) ->
     case catch cf(?STRING_EMPTY, State, fun parse_external_entity_1/2) of
 	{Rest, State1} when is_record(State1, xmerl_sax_parser_state) ->
 	    {Rest, State1};
-	{fatal_error, {State1, "No more bytes"}} when Type == dtd; Type == entity ->
+	{fatal_error, {State1, "No more bytes"}} ->
 	    {?STRING_EMPTY, State1};
 	Other ->
 	    throw(Other)
@@ -1833,10 +1968,12 @@ parse_external_entity_1(?STRING_REST("<?xml", Rest) = Bytes,
 	case is_next_char_whitespace(Rest, State) of
 	    false ->
 		{Bytes, State};
-	    true ->
+	    true when Type =:= dtd ->
 		{_XmlAttributes, R, S} = parse_version_info(Rest, State, []),
 		%S1 =  event_callback({processingInstruction, "xml", XmlAttributes}, S),% The XML decl. should not be reported as a PI
-		{R, S}
+		{R, S};
+        true ->
+        	parse_text_decl(Bytes, State)
 	end,
     case Type of
 	dtd -> 
@@ -1850,13 +1987,13 @@ parse_external_entity_1(?STRING_REST("<?xml", Rest) = Bytes,
 	    end;
 
 	_ -> % Type is normal or entity
-	    parse_content(Rest1, State1, [], true)
+	    parse_entity_content(Rest1, State1, [], true)
     end;
 parse_external_entity_1(?STRING_UNBOUND_REST(_C, _) = Bytes, 
 			#xmerl_sax_parser_state{file_type=Type} = State) ->  
     case Type of
 	normal ->
-	    parse_content(Bytes, State, [], true);
+	    parse_entity_content(Bytes, State, [], true);
 	dtd ->
 	    parse_doctype_decl(Bytes, State);
 	entity ->
diff --git a/lib/xmerl/test/xmerl_sax_std_SUITE.erl b/lib/xmerl/test/xmerl_sax_std_SUITE.erl
index b8412206cc..36424baf3b 100644
--- a/lib/xmerl/test/xmerl_sax_std_SUITE.erl
+++ b/lib/xmerl/test/xmerl_sax_std_SUITE.erl
@@ -2440,11 +2440,11 @@ end_per_testcase(_Func,_Config) ->
 %% ID: not-wf-ext-sa-002
 %% Type: not-wf
 %% Sections: 4.3.1 4.3.2 [77, 78]
-'not-wf-ext-sa-002'(Config) -> {skip, "Fix 1"}.
-   %%file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
-   %%Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/ext-sa/002.xml"]),
-   %%R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
-   %%check_result(R, "not-wf").
+'not-wf-ext-sa-002'(Config) -> 
+    file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+    Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/ext-sa/002.xml"]),
+    R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+    check_result(R, "not-wf").
 
 %%----------------------------------------------------------------------
 %% Test Case 
@@ -2452,11 +2452,11 @@ end_per_testcase(_Func,_Config) ->
 %% ID: not-wf-ext-sa-003
 %% Type: not-wf
 %% Sections: 2.6 [17]
-'not-wf-ext-sa-003'(Config) -> {skip, "Fix 1"}.
-   %%file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
-   %%Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/ext-sa/003.xml"]),
-   %%R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
-   %%check_result(R, "not-wf").
+'not-wf-ext-sa-003'(Config) -> 
+    file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+    Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/ext-sa/003.xml"]),
+    R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+    check_result(R, "not-wf").
 
 %%----------------------------------------------------------------------
 %% Test Case 
@@ -2644,11 +2644,11 @@ end_per_testcase(_Func,_Config) ->
 %% ID: valid-sa-012
 %% Type: valid
 %% Sections: 2.3 [4]
-'valid-sa-012'(Config) ->  {skip, "Fix 1"}.
-   %%file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
-   %%Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/012.xml"]),
-   %%R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
-   %%check_result(R, "valid").
+'valid-sa-012'(Config) -> 
+    file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+    Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/012.xml"]),
+    R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+    check_result(R, "valid").
 
 %%----------------------------------------------------------------------
 %% Test Case 
@@ -4300,11 +4300,11 @@ end_per_testcase(_Func,_Config) ->
 %% ID: valid-ext-sa-001
 %% Type: valid
 %% Sections: 2.11
-'valid-ext-sa-001'(_Config) -> {skip, "NYI"}.
-%%    file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
-%%    Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/ext-sa/001.xml"]),
-%%    R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
-%%    check_result(R, "valid").
+'valid-ext-sa-001'(Config) -> 
+    file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+    Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/ext-sa/001.xml"]),
+    R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+    check_result(R, "valid").
 
 %%----------------------------------------------------------------------
 %% Test Case 
@@ -4312,11 +4312,11 @@ end_per_testcase(_Func,_Config) ->
 %% ID: valid-ext-sa-002
 %% Type: valid
 %% Sections: 2.11
-'valid-ext-sa-002'(_Config) -> {skip, "NYI"}.
-%%    file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
-%%    Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/ext-sa/002.xml"]),
-%%    R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
-%%    check_result(R, "valid").
+'valid-ext-sa-002'(Config) -> 
+    file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+    Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/ext-sa/002.xml"]),
+    R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+    check_result(R, "valid").
 
 %%----------------------------------------------------------------------
 %% Test Case 
@@ -4324,11 +4324,11 @@ end_per_testcase(_Func,_Config) ->
 %% ID: valid-ext-sa-003
 %% Type: valid
 %% Sections: 3.1 4.1 [43] [68]
-'valid-ext-sa-003'(_Config) -> {skip, "NYI"}.
-%%    file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
-%%    Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/ext-sa/003.xml"]),
-%%    R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
-%%    check_result(R, "valid").
+'valid-ext-sa-003'(Config) -> 
+    file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+    Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/ext-sa/003.xml"]),
+    R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+    check_result(R, "valid").
 
 %%----------------------------------------------------------------------
 %% Test Case 
@@ -4336,11 +4336,11 @@ end_per_testcase(_Func,_Config) ->
 %% ID: valid-ext-sa-004
 %% Type: valid
 %% Sections: 2.11
-'valid-ext-sa-004'(_Config) -> {skip, "NYI"}.
-%%    file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
-%%    Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/ext-sa/004.xml"]),
-%%    R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
-%%    check_result(R, "valid").
+'valid-ext-sa-004'(Config) -> 
+    file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+    Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/ext-sa/004.xml"]),
+    R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+    check_result(R, "valid").
 
 %%----------------------------------------------------------------------
 %% Test Case 
@@ -4348,11 +4348,11 @@ end_per_testcase(_Func,_Config) ->
 %% ID: valid-ext-sa-005
 %% Type: valid
 %% Sections: 3.2.1 4.2.2 [48] [75]
-'valid-ext-sa-005'(_Config) -> {skip, "NYI"}.
-%%    file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
-%%    Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/ext-sa/005.xml"]),
-%%    R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
-%%    check_result(R, "valid").
+'valid-ext-sa-005'(Config) -> 
+    file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+    Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/ext-sa/005.xml"]),
+    R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+    check_result(R, "valid").
 
 %%----------------------------------------------------------------------
 %% Test Case 
@@ -4360,11 +4360,11 @@ end_per_testcase(_Func,_Config) ->
 %% ID: valid-ext-sa-006
 %% Type: valid
 %% Sections: 2.11 3.2.1 3.2.2 4.2.2 [48] [51] [75]
-'valid-ext-sa-006'(_Config) -> {skip, "NYI"}.
-%%    file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
-%%    Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/ext-sa/006.xml"]),
-%%    R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
-%%    check_result(R, "valid").
+'valid-ext-sa-006'(Config) -> 
+    file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+    Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/ext-sa/006.xml"]),
+    R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+    check_result(R, "valid").
 
 %%----------------------------------------------------------------------
 %% Test Case 
@@ -4372,7 +4372,7 @@ end_per_testcase(_Func,_Config) ->
 %% ID: valid-ext-sa-007
 %% Type: valid
 %% Sections: 4.2.2 4.4.3 [75]
-'valid-ext-sa-007'(_Config) -> {skip, "NYI"}.
+'valid-ext-sa-007'(_Config) -> {skip, "Different encoding in entity"}.
 %%    file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
 %%    Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/ext-sa/007.xml"]),
 %%    R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
@@ -4384,7 +4384,7 @@ end_per_testcase(_Func,_Config) ->
 %% ID: valid-ext-sa-008
 %% Type: valid
 %% Sections: 4.2.2 4.3.3. 4.4.3 [75] [80]
-'valid-ext-sa-008'(_Config) -> {skip, "NYI"}.
+'valid-ext-sa-008'(_Config) -> {skip, "Different encoding in entity"}.
 %%    file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
 %%    Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/ext-sa/008.xml"]),
 %%    R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
@@ -4396,11 +4396,11 @@ end_per_testcase(_Func,_Config) ->
 %% ID: valid-ext-sa-009
 %% Type: valid
 %% Sections: 2.11
-'valid-ext-sa-009'(_Config) ->  {skip, "NYI"}.
-%%    file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
-%%    Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/ext-sa/009.xml"]),
-%%    R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
-%%    check_result(R, "valid").
+'valid-ext-sa-009'(Config) -> 
+    file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+    Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/ext-sa/009.xml"]),
+    R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+    check_result(R, "valid").
 
 %%----------------------------------------------------------------------
 %% Test Case 
@@ -4408,11 +4408,11 @@ end_per_testcase(_Func,_Config) ->
 %% ID: valid-ext-sa-011
 %% Type: valid
 %% Sections: 2.11 4.2.2 [75]
-'valid-ext-sa-011'(_Config) ->  {skip, "NYI"}.
-%%    file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
-%%    Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/ext-sa/011.xml"]),
-%%    R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
-%%    check_result(R, "valid").
+'valid-ext-sa-011'(Config) -> 
+    file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+    Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/ext-sa/011.xml"]),
+    R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+    check_result(R, "valid").
 
 %%----------------------------------------------------------------------
 %% Test Case 
@@ -4420,11 +4420,11 @@ end_per_testcase(_Func,_Config) ->
 %% ID: valid-ext-sa-012
 %% Type: valid
 %% Sections: 4.2.1 4.2.2
-'valid-ext-sa-012'(_Config) ->  {skip, "NYI"}.
-%%    file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
-%%    Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/ext-sa/012.xml"]),
-%%    R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
-%%    check_result(R, "valid").
+'valid-ext-sa-012'(Config) -> 
+    file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+    Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/ext-sa/012.xml"]),
+    R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+    check_result(R, "valid").
 
 %%----------------------------------------------------------------------
 %% Test Case 
@@ -4432,11 +4432,11 @@ end_per_testcase(_Func,_Config) ->
 %% ID: valid-ext-sa-013
 %% Type: valid
 %% Sections: 3.3.3
-'valid-ext-sa-013'(_Config) ->  {skip, "NYI"}.
-%%    file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
-%%    Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/ext-sa/013.xml"]),
-%%    R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
-%%    check_result(R, "valid").
+'valid-ext-sa-013'(Config) -> 
+    file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+    Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/ext-sa/013.xml"]),
+    R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+    check_result(R, "valid").
 
 %%----------------------------------------------------------------------
 %% Test Case 
@@ -4444,7 +4444,7 @@ end_per_testcase(_Func,_Config) ->
 %% ID: valid-ext-sa-014
 %% Type: valid
 %% Sections: 4.1 4.4.3 [68]
-'valid-ext-sa-014'(_Config) -> {skip, "NYI"}.
+'valid-ext-sa-014'(_Config) -> {skip, "Different encoding in entity"}.
 %%    file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
 %%    Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/ext-sa/014.xml"]),
 %%    R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
@@ -16291,11 +16291,11 @@ end_per_testcase(_Func,_Config) ->
 %% ID: ibm-not-wf-P77-ibm77n02.xml
 %% Type: not-wf
 %% Sections: 4.3.1
-'ibm-not-wf-P77-ibm77n02'(Config) ->  {skip, "Fix 3"}.
-   %%file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
-   %%Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P77/ibm77n02.xml"]),
-   %%R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
-   %%check_result(R, "not-wf").
+'ibm-not-wf-P77-ibm77n02'(Config) -> 
+    file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+    Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P77/ibm77n02.xml"]),
+    R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+    check_result(R, "not-wf").
 
 %%----------------------------------------------------------------------
 %% Test Case 
@@ -16332,11 +16332,11 @@ end_per_testcase(_Func,_Config) ->
 %% ID: ibm-not-wf-P78-ibm78n01.xml
 %% Type: not-wf
 %% Sections: 4.3.2
-'ibm-not-wf-P78-ibm78n01'(Config) ->  {skip, "Fix 3"}.
-   %%file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
-   %%Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P78/ibm78n01.xml"]),
-   %%R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
-   %%check_result(R, "not-wf").
+'ibm-not-wf-P78-ibm78n01'(Config) -> 
+    file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+    Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P78/ibm78n01.xml"]),
+    R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+    check_result(R, "not-wf").
 
 %%----------------------------------------------------------------------
 %% Test Case 
@@ -16344,11 +16344,11 @@ end_per_testcase(_Func,_Config) ->
 %% ID: ibm-not-wf-P78-ibm78n02.xml
 %% Type: not-wf
 %% Sections: 4.3.2
-'ibm-not-wf-P78-ibm78n02'(Config) ->  {skip, "Fix 3"}.
-   %%file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
-   %%Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P78/ibm78n02.xml"]),
-   %%R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
-   %%check_result(R, "not-wf").
+'ibm-not-wf-P78-ibm78n02'(Config) -> 
+    file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+    Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P78/ibm78n02.xml"]),
+    R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+    check_result(R, "not-wf").
 
 %%----------------------------------------------------------------------
 %% Test Cases 
-- 
2.16.4

openSUSE Build Service is sponsored by