--TEST--
htmlentities() / htmlspecialchars() ENT_DISALLOWED with entities and no double encode
--FILE--
<?php
$tests 
= array(
    
"&#0;"//C0
    
"&#1;",
    
"&#x09;",
    
"&#x0A;",
    
"&#x0B;",
    
"&#x0C;",
    
"&#x0D;"//note that HTML5 is unique in that it forbids this entity, but allows a literal U+0D
    
"&#x0E;",
    
"&#x1F;",
    
"&#x20;"//allowed always
    
"&#x7F;"//DEL
    
"&#x80;"//C1
    
"&#x9F;",
    
"&#xA0;"//allowed always
    
"&#xD7FF;"//surrogates
    
"&#xD800;",
    
"&#xDFFF;",
    
"&#xE000;"//allowed always
    
"&#xFFFE;"//nonchar
    
"&#xFFFF;",
    
"&#xFDCF;"//allowed always
    
"&#xFDD0;"//nonchar
    
"&#xFDEF;",
    
"&#xFDF0;"//allowed always
    
"&#x2FFFE;"//nonchar
    
"&#x2FFFF;",
    
"&#x110000;"//bad reference
);

function 
test($flag$flag2=ENT_DISALLOWED$charset="UTF-8") {
    global 
$tests;
    
$i = -1;
    
error_reporting(-& ~E_STRICT);
    foreach (
$tests as $test) {
        
$i++;
        
$a htmlentities($test$flag $flag2$charsetFALSE);
        
$b htmlspecialchars($test$flag $flag2$charsetFALSE);
        
        if (
$a == $b)
            echo 
sprintf("%s\t%s"$test$a==$test?"NOT CHANGED":"CHANGED"), "\n";
        else
            echo 
sprintf("%s\tCHANGED (%s, %s)"$test$a$b), "\n";
    }
    
error_reporting(-1);
}

echo 
"*** Testing HTML 4.01 ***\n";

test(ENT_HTML401);

echo 
"\n*** Testing XHTML 1.0 ***\n";

test(ENT_XHTML);

echo 
"\n*** Testing HTML 5 ***\n";

test(ENT_HTML5);

echo 
"\n*** Testing XML 1.0 ***\n";

test(ENT_XML1);

echo 
"\n*** Testing 5 without the flag ***\n";

test(ENT_HTML50);

echo 
"\n*** Testing HTML 5 with another single-byte encoding ***\n";

test(ENT_HTML5ENT_DISALLOWED"Windows-1251");

echo 
"\n*** Testing HTML 5 with another multibyte-byte encoding ***\n";

test(ENT_HTML5ENT_DISALLOWED"SJIS");

?>
--EXPECT--
*** Testing HTML 4.01 ***
&#0;    NOT CHANGED
&#1;    NOT CHANGED
&#x09;    NOT CHANGED
&#x0A;    NOT CHANGED
&#x0B;    NOT CHANGED
&#x0C;    NOT CHANGED
&#x0D;    NOT CHANGED
&#x0E;    NOT CHANGED
&#x1F;    NOT CHANGED
&#x20;    NOT CHANGED
&#x7F;    NOT CHANGED
&#x80;    NOT CHANGED
&#x9F;    NOT CHANGED
&#xA0;    NOT CHANGED
&#xD7FF;    NOT CHANGED
&#xD800;    NOT CHANGED
&#xDFFF;    NOT CHANGED
&#xE000;    NOT CHANGED
&#xFFFE;    NOT CHANGED
&#xFFFF;    NOT CHANGED
&#xFDCF;    NOT CHANGED
&#xFDD0;    NOT CHANGED
&#xFDEF;    NOT CHANGED
&#xFDF0;    NOT CHANGED
&#x2FFFE;    NOT CHANGED
&#x2FFFF;    NOT CHANGED
&#x110000;    CHANGED

*** Testing XHTML 1.0 ***
&#0;    CHANGED
&#1;    CHANGED
&#x09;    NOT CHANGED
&#x0A;    NOT CHANGED
&#x0B;    CHANGED
&#x0C;    CHANGED
&#x0D;    NOT CHANGED
&#x0E;    CHANGED
&#x1F;    CHANGED
&#x20;    NOT CHANGED
&#x7F;    NOT CHANGED
&#x80;    NOT CHANGED
&#x9F;    NOT CHANGED
&#xA0;    NOT CHANGED
&#xD7FF;    NOT CHANGED
&#xD800;    CHANGED
&#xDFFF;    CHANGED
&#xE000;    NOT CHANGED
&#xFFFE;    CHANGED
&#xFFFF;    CHANGED
&#xFDCF;    NOT CHANGED
&#xFDD0;    NOT CHANGED
&#xFDEF;    NOT CHANGED
&#xFDF0;    NOT CHANGED
&#x2FFFE;    NOT CHANGED
&#x2FFFF;    NOT CHANGED
&#x110000;    CHANGED

*** Testing HTML 5 ***
&#0;    CHANGED (&amp;&num;0&semi;, &amp;#0;)
&#1;    CHANGED (&amp;&num;1&semi;, &amp;#1;)
&#x09;    NOT CHANGED
&#x0A;    NOT CHANGED
&#x0B;    CHANGED (&amp;&num;x0B&semi;, &amp;#x0B;)
&#x0C;    NOT CHANGED
&#x0D;    CHANGED (&amp;&num;x0D&semi;, &amp;#x0D;)
&#x0E;    CHANGED (&amp;&num;x0E&semi;, &amp;#x0E;)
&#x1F;    CHANGED (&amp;&num;x1F&semi;, &amp;#x1F;)
&#x20;    NOT CHANGED
&#x7F;    CHANGED (&amp;&num;x7F&semi;, &amp;#x7F;)
&#x80;    CHANGED (&amp;&num;x80&semi;, &amp;#x80;)
&#x9F;    CHANGED (&amp;&num;x9F&semi;, &amp;#x9F;)
&#xA0;    NOT CHANGED
&#xD7FF;    NOT CHANGED
&#xD800;    NOT CHANGED
&#xDFFF;    NOT CHANGED
&#xE000;    NOT CHANGED
&#xFFFE;    CHANGED (&amp;&num;xFFFE&semi;, &amp;#xFFFE;)
&#xFFFF;    CHANGED (&amp;&num;xFFFF&semi;, &amp;#xFFFF;)
&#xFDCF;    NOT CHANGED
&#xFDD0;    CHANGED (&amp;&num;xFDD0&semi;, &amp;#xFDD0;)
&#xFDEF;    CHANGED (&amp;&num;xFDEF&semi;, &amp;#xFDEF;)
&#xFDF0;    NOT CHANGED
&#x2FFFE;    CHANGED (&amp;&num;x2FFFE&semi;, &amp;#x2FFFE;)
&#x2FFFF;    CHANGED (&amp;&num;x2FFFF&semi;, &amp;#x2FFFF;)
&#x110000;    CHANGED (&amp;&num;x110000&semi;, &amp;#x110000;)

*** Testing XML 1.0 ***
&#0;    CHANGED
&#1;    CHANGED
&#x09;    NOT CHANGED
&#x0A;    NOT CHANGED
&#x0B;    CHANGED
&#x0C;    CHANGED
&#x0D;    NOT CHANGED
&#x0E;    CHANGED
&#x1F;    CHANGED
&#x20;    NOT CHANGED
&#x7F;    NOT CHANGED
&#x80;    NOT CHANGED
&#x9F;    NOT CHANGED
&#xA0;    NOT CHANGED
&#xD7FF;    NOT CHANGED
&#xD800;    CHANGED
&#xDFFF;    CHANGED
&#xE000;    NOT CHANGED
&#xFFFE;    CHANGED
&#xFFFF;    CHANGED
&#xFDCF;    NOT CHANGED
&#xFDD0;    NOT CHANGED
&#xFDEF;    NOT CHANGED
&#xFDF0;    NOT CHANGED
&#x2FFFE;    NOT CHANGED
&#x2FFFF;    NOT CHANGED
&#x110000;    CHANGED

*** Testing 5 without the flag ***
&#0;    NOT CHANGED
&#1;    NOT CHANGED
&#x09;    NOT CHANGED
&#x0A;    NOT CHANGED
&#x0B;    NOT CHANGED
&#x0C;    NOT CHANGED
&#x0D;    NOT CHANGED
&#x0E;    NOT CHANGED
&#x1F;    NOT CHANGED
&#x20;    NOT CHANGED
&#x7F;    NOT CHANGED
&#x80;    NOT CHANGED
&#x9F;    NOT CHANGED
&#xA0;    NOT CHANGED
&#xD7FF;    NOT CHANGED
&#xD800;    NOT CHANGED
&#xDFFF;    NOT CHANGED
&#xE000;    NOT CHANGED
&#xFFFE;    NOT CHANGED
&#xFFFF;    NOT CHANGED
&#xFDCF;    NOT CHANGED
&#xFDD0;    NOT CHANGED
&#xFDEF;    NOT CHANGED
&#xFDF0;    NOT CHANGED
&#x2FFFE;    NOT CHANGED
&#x2FFFF;    NOT CHANGED
&#x110000;    CHANGED (&amp;&num;x110000&semi;, &amp;#x110000;)

*** Testing HTML 5 with another single-byte encoding ***
&#0;    CHANGED (&amp;&num;0&semi;, &amp;#0;)
&#1;    CHANGED (&amp;&num;1&semi;, &amp;#1;)
&#x09;    NOT CHANGED
&#x0A;    NOT CHANGED
&#x0B;    CHANGED (&amp;&num;x0B&semi;, &amp;#x0B;)
&#x0C;    NOT CHANGED
&#x0D;    CHANGED (&amp;&num;x0D&semi;, &amp;#x0D;)
&#x0E;    CHANGED (&amp;&num;x0E&semi;, &amp;#x0E;)
&#x1F;    CHANGED (&amp;&num;x1F&semi;, &amp;#x1F;)
&#x20;    NOT CHANGED
&#x7F;    CHANGED (&amp;&num;x7F&semi;, &amp;#x7F;)
&#x80;    CHANGED (&amp;&num;x80&semi;, &amp;#x80;)
&#x9F;    CHANGED (&amp;&num;x9F&semi;, &amp;#x9F;)
&#xA0;    NOT CHANGED
&#xD7FF;    NOT CHANGED
&#xD800;    NOT CHANGED
&#xDFFF;    NOT CHANGED
&#xE000;    NOT CHANGED
&#xFFFE;    CHANGED (&amp;&num;xFFFE&semi;, &amp;#xFFFE;)
&#xFFFF;    CHANGED (&amp;&num;xFFFF&semi;, &amp;#xFFFF;)
&#xFDCF;    NOT CHANGED
&#xFDD0;    CHANGED (&amp;&num;xFDD0&semi;, &amp;#xFDD0;)
&#xFDEF;    CHANGED (&amp;&num;xFDEF&semi;, &amp;#xFDEF;)
&#xFDF0;    NOT CHANGED
&#x2FFFE;    CHANGED (&amp;&num;x2FFFE&semi;, &amp;#x2FFFE;)
&#x2FFFF;    CHANGED (&amp;&num;x2FFFF&semi;, &amp;#x2FFFF;)
&#x110000;    CHANGED (&amp;&num;x110000&semi;, &amp;#x110000;)

*** Testing HTML 5 with another multibyte-byte encoding ***
&#0;    CHANGED
&#1;    CHANGED
&#x09;    NOT CHANGED
&#x0A;    NOT CHANGED
&#x0B;    CHANGED
&#x0C;    NOT CHANGED
&#x0D;    CHANGED
&#x0E;    CHANGED
&#x1F;    CHANGED
&#x20;    NOT CHANGED
&#x7F;    CHANGED
&#x80;    CHANGED
&#x9F;    CHANGED
&#xA0;    NOT CHANGED
&#xD7FF;    NOT CHANGED
&#xD800;    NOT CHANGED
&#xDFFF;    NOT CHANGED
&#xE000;    NOT CHANGED
&#xFFFE;    CHANGED
&#xFFFF;    CHANGED
&#xFDCF;    NOT CHANGED
&#xFDD0;    CHANGED
&#xFDEF;    CHANGED
&#xFDF0;    NOT CHANGED
&#x2FFFE;    CHANGED
&#x2FFFF;    CHANGED
&#x110000;    CHANGED