size_t _myhtml_string_append_char_references_state_5(myhtml_string_char_ref_chunk_t *chunk, myhtml_string_t* str, const char* buff, size_t offset, size_t size) { unsigned const char *u_buff = (unsigned const char*)buff; size_t start_pos = chunk->begin + 3; while(offset < size) { if(myhtml_string_chars_hex_map[ u_buff[offset] ] == 0xff) { chunk->state = 0; if((str->length - (chunk->begin + 2)) == 0) { return offset; } if(buff[offset] == ';') offset++; _myhtml_string_append_char_references_state_end(chunk, str); break; } if((str->length - start_pos) < 5) { chunk->l_data <<= 4; chunk->l_data |= myhtml_string_chars_hex_map[ u_buff[offset] ]; _myhtml_string_charef_append(str, buff[offset]); } offset++; } return offset; }
size_t _myhtml_string_append_char_references_state_4(myhtml_string_char_ref_chunk_t *chunk, myhtml_string_t* str, const unsigned char *buff, size_t offset, size_t size) { while(offset < size) { if(myhtml_string_chars_num_map[ buff[offset] ] == 0xff) { chunk->state = 0; if((str->length - (chunk->begin + 2)) == 0) { return offset; } if(buff[offset] == ';') offset++; _myhtml_string_append_char_references_state_end(chunk, str); break; } chunk->l_data = myhtml_string_chars_num_map[ buff[offset] ] + chunk->l_data * 10; _myhtml_string_charef_append(str, buff[offset]); offset++; } return offset; }
size_t _myhtml_string_append_char_references_state_4(myhtml_string_char_ref_chunk_t *chunk, myhtml_string_t* str, const unsigned char *buff, size_t offset, size_t size) { size_t tmp_offset = offset; while(offset < size) { if(myhtml_string_chars_num_map[ buff[offset] ] == 0xff) { chunk->state = 0; myhtml_string_append_with_preprocessing(str, (const char*)&buff[tmp_offset], (offset - tmp_offset)); if((str->length - (chunk->begin + 2)) == 0) { return offset; } if(buff[offset] == ';') offset++; _myhtml_string_append_char_references_state_end(chunk, str); return offset; } chunk->l_data = myhtml_string_chars_num_map[ buff[offset] ] + chunk->l_data * 10; offset++; } myhtml_string_append_with_preprocessing(str, (const char*)&buff[tmp_offset], (offset - tmp_offset)); return offset; }
size_t _myhtml_string_append_char_references_state_5(myhtml_string_char_ref_chunk_t *chunk, myhtml_string_t* str, const char* buff, size_t offset, size_t size) { unsigned const char *u_buff = (unsigned const char*)buff; size_t start_pos = chunk->begin + 3; size_t tmp_offset = offset, tmp_set_to = offset; while(offset < size) { if(myhtml_string_chars_hex_map[ u_buff[offset] ] == 0xff) { chunk->state = 0; myhtml_string_append_with_preprocessing(str, &buff[tmp_offset], (tmp_set_to - tmp_offset)); if((str->length - (chunk->begin + 3)) == 0) { return offset; } if(buff[offset] == ';') offset++; _myhtml_string_append_char_references_state_end(chunk, str); return offset; } if((str->length - start_pos) < 6) { chunk->l_data <<= 4; chunk->l_data |= myhtml_string_chars_hex_map[ u_buff[offset] ]; tmp_set_to++; } offset++; } myhtml_string_append_with_preprocessing(str, &buff[tmp_offset], (offset - tmp_offset)); return offset; }
void myhtml_string_append_charef_end(myhtml_string_char_ref_chunk_t *chunk, myhtml_string_t* str) { if(chunk->state == 4 || chunk->state == 5) { _myhtml_string_append_char_references_state_end(chunk, str); } else if(chunk->state == 2 && chunk->charef_res.last_entry) { const charef_entry_t *entry = chunk->charef_res.last_entry; for (size_t i = 0; i < entry->codepoints_len; i++) { MyHTML_STRING_REALLOC_IF_NEED(str, (chunk->begin + 4), 32); chunk->begin += myhtml_encoding_codepoint_to_ascii_utf_8(entry->codepoints[i], &str->data[chunk->begin]); } str->length = chunk->begin; } if(str->length) { if(str->data[ (str->length - 1) ] == '\r') { str->data[ (str->length - 1) ] = '\n'; } } }
void myhtml_string_append_charef_end(myhtml_string_char_ref_chunk_t *chunk, myhtml_string_t* str) { if(chunk->state == 4 || chunk->state == 5) { _myhtml_string_append_char_references_state_end(chunk, str); } }