void sax_parser<_Handler,_Config>::characters() { size_t first = m_pos; const char* p0 = m_char; for (; has_char(); next()) { if (cur_char() == '<') break; if (cur_char() == '&') { // Text span with one or more encoded characters. Parse using cell buffer. cell_buffer& buf = get_cell_buffer(); buf.reset(); buf.append(p0, m_pos-first); characters_with_encoded_char(buf); if (buf.empty()) m_handler.characters(pstring(), false); else m_handler.characters(pstring(buf.get(), buf.size()), true); return; } } if (m_pos > first) { size_t size = m_pos - first; pstring val(m_content + first, size); m_handler.characters(val, false); } }
bool parser_base::value(pstring& str, bool decode) { char c = cur_char(); if (c != '"') throw malformed_xml_error("value must be quoted"); c = next_char_checked(); size_t first = m_pos; const char* p0 = m_char; for (; c != '"'; c = next_char_checked()) { if (decode && c == '&') { // This value contains one or more encoded characters. cell_buffer& buf = get_cell_buffer(); buf.reset(); buf.append(p0, m_pos-first); value_with_encoded_char(buf, str); return true; } } str = pstring(p0, m_pos-first); // Skip the closing quote. next(); return false; }