size_t myhtml_parser_add_text_with_charef(myhtml_tree_t *tree, myhtml_string_t* string, const char *text, size_t begin, size_t length) { myhtml_incoming_buf_t *inc_buf = myhtml_parser_find_first_buf(tree, begin); myhtml_string_char_ref_chunk_t str_chunk = {0, 0, 0, NULL, tree->encoding}; myhtml_encoding_result_clean(&str_chunk.res); size_t current_buf_offset = begin - inc_buf->offset; size_t save_str_len = string->length; if((current_buf_offset + length) <= inc_buf->size) { myhtml_string_append_charef(&str_chunk, string, &inc_buf->data[current_buf_offset], length); myhtml_string_append_charef_end(&str_chunk, string); return (string->length - save_str_len); } size_t buf_next_offset = inc_buf->size - current_buf_offset; myhtml_string_append_charef(&str_chunk, string, &inc_buf->data[current_buf_offset], buf_next_offset); length = length - buf_next_offset; inc_buf = inc_buf->next; while (inc_buf && length) { if(length > inc_buf->size) { myhtml_string_append_charef(&str_chunk, string, inc_buf->data, inc_buf->size); length -= inc_buf->size; } else { myhtml_string_append_charef(&str_chunk, string, inc_buf->data, length); break; } inc_buf = inc_buf->next; } myhtml_string_append_charef_end(&str_chunk, string); return (string->length - save_str_len); }
void myhtml_parser_drop_first_newline(myhtml_tree_t *tree, size_t *begin, size_t *length) { if(*length == 0) return; myhtml_incoming_buf_t *inc_buf = myhtml_parser_find_first_buf(tree, *begin); size_t current_buf_offset = *begin - inc_buf->offset; if(inc_buf->data[current_buf_offset] == '\n') { (*begin)++; (*length)--; } else if(inc_buf->data[current_buf_offset] == '\r') { current_buf_offset++; (*begin)++; (*length)--; if(*length > 1 && inc_buf->data[current_buf_offset] == '\n') { (*begin)++; (*length)--; } } }
size_t myhtml_parser_add_text(myhtml_tree_t *tree, myhtml_string_t* string, const char *text, size_t begin, size_t length) { myhtml_incoming_buf_t *inc_buf = myhtml_parser_find_first_buf(tree, begin); size_t current_buf_offset = begin - inc_buf->offset; size_t save_str_len = string->length; if((current_buf_offset + length) <= inc_buf->size) { if(tree->encoding == MyHTML_ENCODING_UTF_8) myhtml_string_append(string, &inc_buf->data[current_buf_offset], length); else myhtml_string_append_with_convert_encoding(string, &inc_buf->data[current_buf_offset], length, tree->encoding); return (string->length - save_str_len); } size_t buf_next_offset = inc_buf->size - current_buf_offset; myhtml_encoding_result_t res; myhtml_encoding_result_clean(&res); if(tree->encoding == MyHTML_ENCODING_UTF_8) myhtml_string_append(string, &inc_buf->data[current_buf_offset], buf_next_offset); else myhtml_string_append_chunk_with_convert_encoding(string, &res, &inc_buf->data[current_buf_offset], buf_next_offset, tree->encoding); length = length - buf_next_offset; inc_buf = inc_buf->next; if(tree->encoding == MyHTML_ENCODING_UTF_8) { while (inc_buf && length) { if(length > inc_buf->size) { myhtml_string_append(string, inc_buf->data, inc_buf->size); length -= inc_buf->size; } else { myhtml_string_append(string, inc_buf->data, length); break; } inc_buf = inc_buf->next; } } else { while (inc_buf && length) { if(length > inc_buf->size) { myhtml_string_append_chunk_with_convert_encoding(string, &res, inc_buf->data, inc_buf->size, tree->encoding); length -= inc_buf->size; } else { myhtml_string_append_chunk_with_convert_encoding(string, &res, inc_buf->data, length, tree->encoding); break; } inc_buf = inc_buf->next; } } return (string->length - save_str_len); }