Index: boost/property_tree/detail/rapidxml.hpp =================================================================== --- boost/property_tree/detail/rapidxml.hpp (revision 75709) +++ boost/property_tree/detail/rapidxml.hpp (working copy) @@ -1632,39 +1632,41 @@ // &#...; - assumes ASCII case Ch('#'): - if (src[2] == Ch('x')) { + Ch* src_ascii = src; unsigned long code = 0; - src += 3; // Skip &#x - while (1) + if (src_ascii[2] == Ch('x')) { - unsigned char digit = internal::lookup_tables<0>::lookup_digits[static_cast(*src)]; - if (digit == 0xFF) - break; - code = code * 16 + digit; - ++src; + src_ascii += 3; // Skip &#x + while (1) + { + unsigned char digit = internal::lookup_tables<0>::lookup_digits[static_cast(*src_ascii)]; + if (digit == 0xFF) + break; + code = code * 16 + digit; + ++src_ascii; + } } - insert_coded_character(dest, code); // Put character in output - } - else - { - unsigned long code = 0; - src += 2; // Skip &# - while (1) + else { - unsigned char digit = internal::lookup_tables<0>::lookup_digits[static_cast(*src)]; - if (digit == 0xFF) - break; - code = code * 10 + digit; - ++src; + src_ascii += 2; // Skip &# + while (1) + { + unsigned char digit = internal::lookup_tables<0>::lookup_digits[static_cast(*src_ascii)]; + if (digit == 0xFF) + break; + code = code * 10 + digit; + ++src_ascii; + } } - insert_coded_character(dest, code); // Put character in output + if (*src_ascii == Ch(';')) + { + src = src_ascii + 1; + insert_coded_character(dest, code); // Put character in output + continue; + } + break; } - if (*src == Ch(';')) - ++src; - else - BOOST_PROPERTY_TREE_RAPIDXML_PARSE_ERROR("expected ;", src); - continue; // Something else default: