diff options
Diffstat (limited to 'source/myhtml/tree.c')
-rw-r--r-- | source/myhtml/tree.c | 247 |
1 files changed, 152 insertions, 95 deletions
diff --git a/source/myhtml/tree.c b/source/myhtml/tree.c index 31489d5..e68845d 100644 --- a/source/myhtml/tree.c +++ b/source/myhtml/tree.c @@ -28,7 +28,7 @@ myhtml_status_t myhtml_tree_init(myhtml_tree_t* tree, myhtml_t* myhtml) myhtml_status_t status = MyHTML_STATUS_OK; tree->myhtml = myhtml; - tree->token = myhtml_token_create(tree, (4096 * 4)); + tree->token = myhtml_token_create(tree, 4096); tree->temp_tag_name.data = NULL; tree->queue = myhtml->thread->queue; tree->single_queue = NULL; @@ -38,13 +38,24 @@ myhtml_status_t myhtml_tree_init(myhtml_tree_t* tree, myhtml_t* myhtml) if(tree->tree_obj == NULL) return MyHTML_STATUS_TREE_ERROR_MCOBJECT_CREATE; - mcobject_async_status_t mcstatus = mcobject_async_init(tree->tree_obj, 128, 4096, sizeof(myhtml_tree_node_t)); + mcobject_async_status_t mcstatus = mcobject_async_init(tree->tree_obj, 128, 1024, sizeof(myhtml_tree_node_t)); if(mcstatus) return MyHTML_STATUS_TREE_ERROR_MCOBJECT_INIT; - tree->mchar = mchar_async_create(128, (4096 * 500)); + tree->tags = myhtml_tag_create(); + status = myhtml_tag_init(tree, tree->tags); - tree->indexes = myhtml_tree_index_create(tree, myhtml->tags); + if(status) { + myhtml->parse_state_func = NULL; + myhtml->insertion_func = NULL; + myhtml->thread = NULL; + + return status; + } + + tree->mchar = mchar_async_create(128, (4096 * 5)); + + tree->indexes = myhtml_tree_index_create(tree, tree->tags); tree->active_formatting = myhtml_tree_active_formatting_init(tree); tree->open_elements = myhtml_tree_open_elements_init(tree); tree->other_elements = myhtml_tree_list_init(); @@ -69,6 +80,9 @@ myhtml_status_t myhtml_tree_init(myhtml_tree_t* tree, myhtml_t* myhtml) tree->mchar_node_id = mchar_async_node_add(tree->mchar); + // TODO: this code need send to some func +#ifndef MyHTML_BUILD_WITHOUT_THREADS + tree->async_args = (myhtml_async_args_t*)calloc(myhtml->thread->pth_list_length, sizeof(myhtml_async_args_t)); if(tree->async_args == NULL) @@ -82,6 +96,17 @@ myhtml_status_t myhtml_tree_init(myhtml_tree_t* tree, myhtml_t* myhtml) tree->async_args[(myhtml->thread->batch_first_id + i)].mchar_node_id = mchar_async_node_add(tree->mchar); } +#else /* MyHTML_BUILD_WITHOUT_THREADS */ + + tree->async_args = (myhtml_async_args_t*)calloc(1, sizeof(myhtml_async_args_t)); + + if(tree->async_args == NULL) + return MyHTML_STATUS_TREE_ERROR_MEMORY_ALLOCATION; + + tree->async_args->mchar_node_id = tree->mchar_node_id; + +#endif /* MyHTML_BUILD_WITHOUT_THREADS */ + tree->sync = mcsync_create(); mcsync_init(tree->sync); @@ -94,9 +119,11 @@ void myhtml_tree_clean(myhtml_tree_t* tree) { myhtml_t* myhtml = tree->myhtml; +#ifndef MyHTML_BUILD_WITHOUT_THREADS for(size_t i = 0; i < myhtml->thread->batch_count; i++) { mchar_async_node_clean(tree->mchar, tree->async_args[(myhtml->thread->batch_first_id + i)].mchar_node_id); } +#endif /* MyHTML_BUILD_WITHOUT_THREADS */ mcobject_async_node_clean(tree->tree_obj, tree->mcasync_tree_id); mcobject_async_node_clean(tree->token->nodes_obj, tree->mcasync_token_id); @@ -111,11 +138,13 @@ void myhtml_tree_clean(myhtml_tree_t* tree) tree->document = myhtml_tree_node_create(tree); tree->fragment = NULL; - tree->doctype.is_html = myfalse; + tree->doctype.is_html = false; tree->doctype.attr_name = NULL; tree->doctype.attr_public = NULL; tree->doctype.attr_system = NULL; + tree->node_html = 0; + tree->node_body = 0; tree->node_head = 0; tree->node_form = 0; @@ -126,7 +155,7 @@ void myhtml_tree_clean(myhtml_tree_t* tree) tree->compat_mode = MyHTML_TREE_COMPAT_MODE_NO_QUIRKS; tree->tmp_tag_id = MyHTML_TAG__UNDEF; tree->flags = MyHTML_TREE_FLAGS_CLEAN|MyHTML_TREE_FLAGS_FRAMESET_OK; - tree->foster_parenting = myfalse; + tree->foster_parenting = false; tree->token_namespace = NULL; tree->incoming_buf = NULL; tree->incoming_buf_first = NULL; @@ -147,8 +176,9 @@ void myhtml_tree_clean(myhtml_tree_t* tree) myhtml_tree_list_clean(tree->other_elements); myhtml_tree_token_list_clean(tree->token_list); myhtml_tree_template_insertion_clean(tree); - myhtml_tree_index_clean(tree, tree->myhtml->tags); + myhtml_tree_index_clean(tree, tree->tags); mcobject_async_node_clean(myhtml->async_incoming_buf, tree->mcasync_incoming_buf_id); + myhtml_tag_clean(tree->tags); myhtml_token_attr_malloc(tree->token, tree->attr_current, tree->mcasync_attr_id); } @@ -165,11 +195,13 @@ void myhtml_tree_clean_all(myhtml_tree_t* tree) tree->document = myhtml_tree_node_create(tree); tree->fragment = NULL; - tree->doctype.is_html = myfalse; + tree->doctype.is_html = false; tree->doctype.attr_name = NULL; tree->doctype.attr_public = NULL; tree->doctype.attr_system = NULL; + tree->node_html = 0; + tree->node_body = 0; tree->node_head = 0; tree->node_form = 0; @@ -180,7 +212,7 @@ void myhtml_tree_clean_all(myhtml_tree_t* tree) tree->compat_mode = MyHTML_TREE_COMPAT_MODE_NO_QUIRKS; tree->tmp_tag_id = MyHTML_TAG__UNDEF; tree->flags = MyHTML_TREE_FLAGS_CLEAN|MyHTML_TREE_FLAGS_FRAMESET_OK; - tree->foster_parenting = myfalse; + tree->foster_parenting = false; tree->token_namespace = NULL; tree->incoming_buf = NULL; tree->incoming_buf_first = NULL; @@ -201,8 +233,9 @@ void myhtml_tree_clean_all(myhtml_tree_t* tree) myhtml_tree_list_clean(tree->other_elements); myhtml_tree_token_list_clean(tree->token_list); myhtml_tree_template_insertion_clean(tree); - myhtml_tree_index_clean(tree, tree->myhtml->tags); + myhtml_tree_index_clean(tree, tree->tags); mcobject_async_node_clean(tree->myhtml->async_incoming_buf, tree->mcasync_incoming_buf_id); + myhtml_tag_clean(tree->tags); myhtml_token_attr_malloc(tree->token, tree->attr_current, tree->mcasync_attr_id); } @@ -214,22 +247,23 @@ myhtml_tree_t * myhtml_tree_destroy(myhtml_tree_t* tree) tree->active_formatting = myhtml_tree_active_formatting_destroy(tree); tree->open_elements = myhtml_tree_open_elements_destroy(tree); - tree->other_elements = myhtml_tree_list_destroy(tree->other_elements, mytrue); - tree->token_list = myhtml_tree_token_list_destroy(tree->token_list, mytrue); + tree->other_elements = myhtml_tree_list_destroy(tree->other_elements, true); + tree->token_list = myhtml_tree_token_list_destroy(tree->token_list, true); tree->template_insertion = myhtml_tree_template_insertion_destroy(tree); - tree->indexes = myhtml_tree_index_destroy(tree, tree->myhtml->tags); - tree->sync = mcsync_destroy(tree->sync, mytrue); - tree->tree_obj = mcobject_async_destroy(tree->tree_obj, mytrue); + tree->indexes = myhtml_tree_index_destroy(tree, tree->tags); + tree->sync = mcsync_destroy(tree->sync, true); + tree->tree_obj = mcobject_async_destroy(tree->tree_obj, true); tree->token = myhtml_token_destroy(tree->token); tree->mchar = mchar_async_destroy(tree->mchar, 1); tree->temp_stream = myhtml_tree_temp_stream_free(tree); + tree->tags = myhtml_tag_destroy(tree->tags); if(tree->single_queue) { tree->single_queue = mythread_queue_destroy(tree->single_queue); } mcobject_async_node_delete(tree->myhtml->async_incoming_buf, tree->mcasync_incoming_buf_id); - myhtml_tree_temp_tag_name_destroy(&tree->temp_tag_name, myfalse); + myhtml_tree_temp_tag_name_destroy(&tree->temp_tag_name, false); free(tree->async_args); free(tree); @@ -284,7 +318,7 @@ void myhtml_tree_index_append(myhtml_tree_t* tree, myhtml_tree_node_t* node) if(tree->indexes == NULL) return; - myhtml_tag_index_add(tree->myhtml->tags, tree->indexes->tags, node); + myhtml_tag_index_add(tree->tags, tree->indexes->tags, node); } myhtml_tree_node_t * myhtml_tree_index_get(myhtml_tree_t* tree, myhtml_tag_id_t tag_id) @@ -310,8 +344,8 @@ myhtml_t * myhtml_tree_get_myhtml(myhtml_tree_t* tree) myhtml_tag_t * myhtml_tree_get_tag(myhtml_tree_t* tree) { - if(tree && tree->myhtml) - return tree->myhtml->tags; + if(tree) + return tree->tags; return NULL; } @@ -329,6 +363,16 @@ myhtml_tree_node_t * myhtml_tree_get_document(myhtml_tree_t* tree) return tree->document; } +myhtml_tree_node_t * myhtml_tree_get_node_html(myhtml_tree_t* tree) +{ + return tree->node_html; +} + +myhtml_tree_node_t * myhtml_tree_get_node_body(myhtml_tree_t* tree) +{ + return tree->node_body; +} + mchar_async_t * myhtml_tree_get_mchar(myhtml_tree_t* tree) { return tree->mchar; @@ -580,6 +624,8 @@ myhtml_tree_node_t * myhtml_tree_node_insert_root(myhtml_tree_t* tree, myhtml_to myhtml_tree_open_elements_append(tree, node); myhtml_tree_index_append(tree, node); + tree->node_html = node; + return node; } @@ -594,13 +640,13 @@ myhtml_tree_node_t * myhtml_tree_node_insert_text(myhtml_tree_t* tree, myhtml_to if(mode == MyHTML_TREE_INSERTION_MODE_AFTER) { if(adjusted_location->tag_idx == MyHTML_TAG__TEXT && adjusted_location->token) { - myhtml_token_merged_two_token_string(tree, adjusted_location->token, token, myfalse); + myhtml_token_merged_two_token_string(tree, adjusted_location->token, token, false); return adjusted_location; } } else if(mode == MyHTML_TREE_INSERTION_MODE_BEFORE) { if(adjusted_location->tag_idx == MyHTML_TAG__TEXT && adjusted_location->token) { - myhtml_token_merged_two_token_string(tree, token, adjusted_location->token, mytrue); + myhtml_token_merged_two_token_string(tree, token, adjusted_location->token, true); return adjusted_location; } } @@ -608,7 +654,7 @@ myhtml_tree_node_t * myhtml_tree_node_insert_text(myhtml_tree_t* tree, myhtml_to if(adjusted_location->last_child && adjusted_location->last_child->tag_idx == MyHTML_TAG__TEXT && adjusted_location->last_child->token) { - myhtml_token_merged_two_token_string(tree, adjusted_location->last_child->token, token, myfalse); + myhtml_token_merged_two_token_string(tree, adjusted_location->last_child->token, token, false); return adjusted_location->last_child; } } @@ -675,46 +721,52 @@ myhtml_tree_node_t * myhtml_tree_node_insert_html_element(myhtml_tree_t* tree, m myhtml_tree_node_t * myhtml_tree_element_in_scope(myhtml_tree_t* tree, myhtml_tag_id_t tag_idx, myhtml_namespace_t mynamespace, enum myhtml_tag_categories category) { myhtml_tree_node_t** list = tree->open_elements->list; - myhtml_tag_context_t* tags_context = tree->myhtml->tags->context; + const myhtml_tag_context_t *tag_ctx; size_t i = tree->open_elements->length; + while(i) { i--; + tag_ctx = myhtml_tag_get_by_id(tree->tags, list[i]->tag_idx); + if(list[i]->tag_idx == tag_idx && (mynamespace == MyHTML_NAMESPACE_UNDEF || list[i]->my_namespace == mynamespace)) return list[i]; else if(category == MyHTML_TAG_CATEGORIES_SCOPE_SELECT) { - if((tags_context[list[i]->tag_idx].cats[list[i]->my_namespace] & category) == 0) + if((tag_ctx->cats[list[i]->my_namespace] & category) == 0) break; } - else if(tags_context[list[i]->tag_idx].cats[list[i]->my_namespace] & category) + else if(tag_ctx->cats[list[i]->my_namespace] & category) break; } return NULL; } -mybool_t myhtml_tree_element_in_scope_by_node(myhtml_tree_t* tree, myhtml_tree_node_t* node, enum myhtml_tag_categories category) +bool myhtml_tree_element_in_scope_by_node(myhtml_tree_t* tree, myhtml_tree_node_t* node, enum myhtml_tag_categories category) { myhtml_tree_node_t** list = tree->open_elements->list; - myhtml_tag_context_t* tags_context = tree->myhtml->tags->context; + const myhtml_tag_context_t *tag_ctx; size_t i = tree->open_elements->length; + while(i) { i--; + tag_ctx = myhtml_tag_get_by_id(tree->tags, list[i]->tag_idx); + if(list[i] == node) - return mytrue; + return true; else if(category == MyHTML_TAG_CATEGORIES_SCOPE_SELECT) { - if((tags_context[list[i]->tag_idx].cats[list[i]->my_namespace] & category) == 0) + if((tag_ctx->cats[list[i]->my_namespace] & category) == 0) break; } - else if(tags_context[list[i]->tag_idx].cats[list[i]->my_namespace] & category) + else if(tag_ctx->cats[list[i]->my_namespace] & category) break; } - return myfalse; + return false; } // list @@ -734,7 +786,7 @@ void myhtml_tree_list_clean(myhtml_tree_list_t* list) list->length = 0; } -myhtml_tree_list_t * myhtml_tree_list_destroy(myhtml_tree_list_t* list, mybool_t destroy_self) +myhtml_tree_list_t * myhtml_tree_list_destroy(myhtml_tree_list_t* list, bool destroy_self) { if(list->list) free(list->list); @@ -902,7 +954,7 @@ void myhtml_tree_open_elements_clean(myhtml_tree_t* tree) myhtml_tree_list_t * myhtml_tree_open_elements_destroy(myhtml_tree_t* tree) { - return myhtml_tree_list_destroy(tree->open_elements, mytrue); + return myhtml_tree_list_destroy(tree->open_elements, true); } myhtml_tree_node_t * myhtml_tree_current_node(myhtml_tree_t* tree) @@ -970,7 +1022,7 @@ void myhtml_tree_open_elements_remove(myhtml_tree_t* tree, myhtml_tree_node_t* n #endif } -void myhtml_tree_open_elements_pop_until(myhtml_tree_t* tree, myhtml_tag_id_t tag_idx, myhtml_namespace_t mynamespace, mybool_t is_exclude) +void myhtml_tree_open_elements_pop_until(myhtml_tree_t* tree, myhtml_tag_id_t tag_idx, myhtml_namespace_t mynamespace, bool is_exclude) { myhtml_tree_node_t** list = tree->open_elements->list; @@ -997,7 +1049,7 @@ void myhtml_tree_open_elements_pop_until(myhtml_tree_t* tree, myhtml_tag_id_t ta #endif } -void myhtml_tree_open_elements_pop_until_by_node(myhtml_tree_t* tree, myhtml_tree_node_t* node, mybool_t is_exclude) +void myhtml_tree_open_elements_pop_until_by_node(myhtml_tree_t* tree, myhtml_tree_node_t* node, bool is_exclude) { myhtml_tree_node_t** list = tree->open_elements->list; @@ -1020,7 +1072,7 @@ void myhtml_tree_open_elements_pop_until_by_node(myhtml_tree_t* tree, myhtml_tre #endif } -void myhtml_tree_open_elements_pop_until_by_index(myhtml_tree_t* tree, size_t idx, mybool_t is_exclude) +void myhtml_tree_open_elements_pop_until_by_index(myhtml_tree_t* tree, size_t idx, bool is_exclude) { while(tree->open_elements->length) { @@ -1041,7 +1093,7 @@ void myhtml_tree_open_elements_pop_until_by_index(myhtml_tree_t* tree, size_t id #endif } -mybool_t myhtml_tree_open_elements_find_reverse(myhtml_tree_t* tree, myhtml_tree_node_t* idx, size_t* pos) +bool myhtml_tree_open_elements_find_reverse(myhtml_tree_t* tree, myhtml_tree_node_t* idx, size_t* pos) { myhtml_tree_node_t** list = tree->open_elements->list; @@ -1054,14 +1106,14 @@ mybool_t myhtml_tree_open_elements_find_reverse(myhtml_tree_t* tree, myhtml_tree if(pos) *pos = i; - return mytrue; + return true; } } - return myfalse; + return false; } -mybool_t myhtml_tree_open_elements_find(myhtml_tree_t* tree, myhtml_tree_node_t* node, size_t* pos) +bool myhtml_tree_open_elements_find(myhtml_tree_t* tree, myhtml_tree_node_t* node, size_t* pos) { myhtml_tree_node_t** list = tree->open_elements->list; @@ -1071,11 +1123,11 @@ mybool_t myhtml_tree_open_elements_find(myhtml_tree_t* tree, myhtml_tree_node_t* if(pos) *pos = i; - return mytrue; + return true; } } - return myfalse; + return false; } myhtml_tree_node_t * myhtml_tree_open_elements_find_by_tag_idx_reverse(myhtml_tree_t* tree, myhtml_tag_id_t tag_idx, myhtml_namespace_t mynamespace, size_t* return_index) @@ -1219,7 +1271,7 @@ void myhtml_tree_reset_insertion_mode_appropriately(myhtml_tree_t* tree) size_t i = tree->open_elements->length; // step 1 - mybool_t last = myfalse; + bool last = false; myhtml_tree_node_t** list = tree->open_elements->list; // step 3 @@ -1237,7 +1289,7 @@ void myhtml_tree_reset_insertion_mode_appropriately(myhtml_tree_t* tree) #endif if(i == 0) { - last = mytrue; + last = true; if(tree->fragment) { node = tree->fragment; @@ -1299,7 +1351,7 @@ void myhtml_tree_reset_insertion_mode_appropriately(myhtml_tree_t* tree) switch (node->tag_idx) { case MyHTML_TAG_TD: case MyHTML_TAG_TH: - if(last == myfalse) { + if(last == false) { tree->insert_mode = MyHTML_INSERTION_MODE_IN_CELL; return; } @@ -1332,7 +1384,7 @@ void myhtml_tree_reset_insertion_mode_appropriately(myhtml_tree_t* tree) return; case MyHTML_TAG_HEAD: - if(last == myfalse) { + if(last == false) { tree->insert_mode = MyHTML_INSERTION_MODE_IN_HEAD; return; } @@ -1386,10 +1438,10 @@ void myhtml_tree_active_formatting_clean(myhtml_tree_t* tree) myhtml_tree_list_t * myhtml_tree_active_formatting_destroy(myhtml_tree_t* tree) { - return myhtml_tree_list_destroy(tree->active_formatting, mytrue); + return myhtml_tree_list_destroy(tree->active_formatting, true); } -mybool_t myhtml_tree_active_formatting_is_marker(myhtml_tree_t* tree, myhtml_tree_node_t* node) +bool myhtml_tree_active_formatting_is_marker(myhtml_tree_t* tree, myhtml_tree_node_t* node) { #ifdef DEBUG_MODE if(node == NULL) { @@ -1398,7 +1450,7 @@ mybool_t myhtml_tree_active_formatting_is_marker(myhtml_tree_t* tree, myhtml_tre #endif if(tree->myhtml->marker == node) - return mytrue; + return true; switch (node->tag_idx) { case MyHTML_TAG_APPLET: @@ -1408,13 +1460,13 @@ mybool_t myhtml_tree_active_formatting_is_marker(myhtml_tree_t* tree, myhtml_tre case MyHTML_TAG_TD: case MyHTML_TAG_TH: case MyHTML_TAG_CAPTION: - return mytrue; + return true; default: break; } - return myfalse; + return false; } void myhtml_tree_active_formatting_append(myhtml_tree_t* tree, myhtml_tree_node_t* node) @@ -1529,7 +1581,7 @@ myhtml_tree_node_t * myhtml_tree_active_formatting_current_node(myhtml_tree_t* t return tree->active_formatting->list[ tree->active_formatting->length - 1 ]; } -mybool_t myhtml_tree_active_formatting_find(myhtml_tree_t* tree, myhtml_tree_node_t* node, size_t* return_idx) +bool myhtml_tree_active_formatting_find(myhtml_tree_t* tree, myhtml_tree_node_t* node, size_t* return_idx) { myhtml_tree_node_t** list = tree->active_formatting->list; @@ -1542,11 +1594,11 @@ mybool_t myhtml_tree_active_formatting_find(myhtml_tree_t* tree, myhtml_tree_nod if(return_idx) *return_idx = i; - return mytrue; + return true; } } - return myfalse; + return false; } void myhtml_tree_active_formatting_up_to_last_marker(myhtml_tree_t* tree) @@ -1661,17 +1713,16 @@ void myhtml_tree_active_formatting_reconstruction(myhtml_tree_t* tree) } } -mybool_t myhtml_tree_adoption_agency_algorithm(myhtml_tree_t* tree, myhtml_tag_id_t subject_tag_idx) +bool myhtml_tree_adoption_agency_algorithm(myhtml_tree_t* tree, myhtml_tag_id_t subject_tag_idx) { if(tree->open_elements->length == 0) - return myfalse; + return false; size_t oel_curr_index = tree->open_elements->length - 1; myhtml_tree_node_t** oel_list = tree->open_elements->list; myhtml_tree_node_t** afe_list = tree->active_formatting->list; myhtml_tree_node_t* current_node = oel_list[oel_curr_index]; - myhtml_tag_context_t* tags_context = tree->myhtml->tags->context; #ifdef DEBUG_MODE if(current_node == NULL) { @@ -1681,10 +1732,10 @@ mybool_t myhtml_tree_adoption_agency_algorithm(myhtml_tree_t* tree, myhtml_tag_i // step 1 if(current_node->my_namespace == MyHTML_NAMESPACE_HTML && current_node->tag_idx == subject_tag_idx && - myhtml_tree_active_formatting_find(tree, current_node, NULL) == myfalse) + myhtml_tree_active_formatting_find(tree, current_node, NULL) == false) { myhtml_tree_open_elements_pop(tree); - return myfalse; + return false; } // step 2, 3 @@ -1707,7 +1758,7 @@ mybool_t myhtml_tree_adoption_agency_algorithm(myhtml_tree_t* tree, myhtml_tag_i i--; if(myhtml_tree_active_formatting_is_marker(tree, list[i])) - return myfalse; + return false; else if(list[i]->tag_idx == subject_tag_idx) { afe_index = i; formatting_element = list[i]; @@ -1721,19 +1772,19 @@ mybool_t myhtml_tree_adoption_agency_algorithm(myhtml_tree_t* tree, myhtml_tag_i // If there is no such element, then abort these steps and instead act as described in the // ===> "any other end tag" entry above. if(formatting_element == NULL) { - return mytrue; + return true; } // step 6 size_t oel_format_el_idx; - if(myhtml_tree_open_elements_find(tree, formatting_element, &oel_format_el_idx) == myfalse) { + if(myhtml_tree_open_elements_find(tree, formatting_element, &oel_format_el_idx) == false) { myhtml_tree_active_formatting_remove(tree, formatting_element); - return myfalse; + return false; } // step 7 - if(myhtml_tree_element_in_scope_by_node(tree, formatting_element, MyHTML_TAG_CATEGORIES_SCOPE) == myfalse) - return myfalse; + if(myhtml_tree_element_in_scope_by_node(tree, formatting_element, MyHTML_TAG_CATEGORIES_SCOPE) == false) + return false; // step 8 //if(afe_last != list[i]) @@ -1745,8 +1796,11 @@ mybool_t myhtml_tree_adoption_agency_algorithm(myhtml_tree_t* tree, myhtml_tag_i // here might not be one. myhtml_tree_node_t* furthest_block = NULL; size_t idx_furthest_block = 0; - for (idx_furthest_block = oel_format_el_idx; idx_furthest_block < tree->open_elements->length; idx_furthest_block++) { - if(tags_context[ oel_list[idx_furthest_block]->tag_idx ].cats[oel_list[idx_furthest_block]->my_namespace] & MyHTML_TAG_CATEGORIES_SPECIAL) { + for (idx_furthest_block = oel_format_el_idx; idx_furthest_block < tree->open_elements->length; idx_furthest_block++) + { + const myhtml_tag_context_t *tag_ctx = myhtml_tag_get_by_id(tree->tags, oel_list[idx_furthest_block]->tag_idx); + + if(tag_ctx->cats[oel_list[idx_furthest_block]->my_namespace] & MyHTML_TAG_CATEGORIES_SPECIAL) { furthest_block = oel_list[idx_furthest_block]; break; } @@ -1765,7 +1819,7 @@ mybool_t myhtml_tree_adoption_agency_algorithm(myhtml_tree_t* tree, myhtml_tag_i myhtml_tree_open_elements_pop(tree); // and including formatting element myhtml_tree_active_formatting_remove(tree, formatting_element); - return myfalse; + return false; } #ifdef DEBUG_MODE @@ -1798,7 +1852,7 @@ mybool_t myhtml_tree_adoption_agency_algorithm(myhtml_tree_t* tree, myhtml_tag_i // step 13.3 size_t node_index; - if(myhtml_tree_open_elements_find(tree, node, &node_index) == myfalse) { + if(myhtml_tree_open_elements_find(tree, node, &node_index) == false) { node_index = index_oel_node; } @@ -1806,7 +1860,7 @@ mybool_t myhtml_tree_adoption_agency_algorithm(myhtml_tree_t* tree, myhtml_tag_i node_index--; else { fprintf(stderr, "ERROR: adoption agency algorithm; decrement node_index, node_index is null"); - return myfalse; + return false; } index_oel_node = node_index; @@ -1824,7 +1878,7 @@ mybool_t myhtml_tree_adoption_agency_algorithm(myhtml_tree_t* tree, myhtml_tag_i // step 13.5 size_t afe_node_index; - mybool_t is_exists = myhtml_tree_active_formatting_find(tree, node, &afe_node_index); + bool is_exists = myhtml_tree_active_formatting_find(tree, node, &afe_node_index); if(inner_loop > 3 && is_exists) { myhtml_tree_active_formatting_remove_by_index(tree, afe_node_index); @@ -1837,7 +1891,7 @@ mybool_t myhtml_tree_adoption_agency_algorithm(myhtml_tree_t* tree, myhtml_tag_i } // step 13.6 - if(is_exists == myfalse) { + if(is_exists == false) { myhtml_tree_open_elements_remove(tree, node); continue; } @@ -1901,8 +1955,8 @@ mybool_t myhtml_tree_adoption_agency_algorithm(myhtml_tree_t* tree, myhtml_tag_i myhtml_tree_node_add_child(tree, furthest_block, new_formatting_element); // step 18 - if(myhtml_tree_active_formatting_find(tree, formatting_element, &afe_index) == myfalse) - return myfalse; + if(myhtml_tree_active_formatting_find(tree, formatting_element, &afe_index) == false) + return false; if(afe_index < bookmark) bookmark--; @@ -1927,7 +1981,7 @@ mybool_t myhtml_tree_adoption_agency_algorithm(myhtml_tree_t* tree, myhtml_tag_i } } - return myfalse; + return false; } myhtml_tree_node_t * myhtml_tree_appropriate_place_inserting(myhtml_tree_t* tree, myhtml_tree_node_t* override_target, @@ -2195,20 +2249,19 @@ void myhtml_tree_print_node(myhtml_tree_t* tree, myhtml_tree_node_t* node, FILE* if(node == NULL) return; - myhtml_t* myhtml = tree->myhtml; - mctree_node_t* mctree_nodes = myhtml->tags->tree->nodes; + const myhtml_tag_context_t *ctx = myhtml_tag_get_by_id(tree->tags, node->tag_idx); - size_t mctree_id = mh_tags_get(node->tag_idx, mctree_id); - size_t tag_name_size = mctree_nodes[mctree_id].str_size; +// size_t mctree_id = mh_tags_get(node->tag_idx, mctree_id); +// size_t tag_name_size = mctree_nodes[mctree_id].str_size; if(node->tag_idx == MyHTML_TAG__TEXT || node->tag_idx == MyHTML_TAG__COMMENT) { if(node->token) - fprintf(out, "<%.*s>: %.*s\n", (int)tag_name_size, mctree_nodes[mctree_id].str, + fprintf(out, "<%.*s>: %.*s\n", (int)ctx->name_length, ctx->name, (int)node->token->length, &node->token->my_str_tm.data[node->token->begin]); else - fprintf(out, "<%.*s>\n", (int)tag_name_size, mctree_nodes[mctree_id].str); + fprintf(out, "<%.*s>\n", (int)ctx->name_length, ctx->name); } else if(node->tag_idx == MyHTML_TAG__DOCTYPE) { @@ -2234,7 +2287,7 @@ void myhtml_tree_print_node(myhtml_tree_t* tree, myhtml_tree_node_t* node, FILE* fprintf(out, "<%.*s tagid=\"%zu\" mem=\"%zx\"", (int)tag_name_size, mctree_nodes[mctree_id].str, mh_tags_get(node->tag_idx, id), (size_t)node); #else - fprintf(out, "<%.*s", (int)tag_name_size, mctree_nodes[mctree_id].str); + fprintf(out, "<%.*s", (int)ctx->name_length, ctx->name); if(node->my_namespace != MyHTML_NAMESPACE_HTML) { switch (node->my_namespace) { @@ -2319,7 +2372,7 @@ void myhtml_tree_token_list_clean(myhtml_tree_token_list_t* list) list->length = 0; } -myhtml_tree_token_list_t * myhtml_tree_token_list_destroy(myhtml_tree_token_list_t* list, mybool_t destroy_self) +myhtml_tree_token_list_t * myhtml_tree_token_list_destroy(myhtml_tree_token_list_t* list, bool destroy_self) { if(list->list) free(list->list); @@ -2384,7 +2437,7 @@ myhtml_token_node_t * myhtml_tree_token_list_current_node(myhtml_tree_token_list void myhtml_tree_tags_close_p(myhtml_tree_t* tree) { myhtml_tree_generate_implied_end_tags(tree, MyHTML_TAG_P, MyHTML_NAMESPACE_HTML); - myhtml_tree_open_elements_pop_until(tree, MyHTML_TAG_P, MyHTML_NAMESPACE_HTML, myfalse); + myhtml_tree_open_elements_pop_until(tree, MyHTML_TAG_P, MyHTML_NAMESPACE_HTML, false); } myhtml_tree_node_t * myhtml_tree_generic_raw_text_element_parsing_algorithm(myhtml_tree_t* tree, myhtml_token_node_t* token_node) @@ -2456,7 +2509,7 @@ void myhtml_tree_close_cell(myhtml_tree_t* tree, myhtml_tree_node_t* tr_or_th_no } // step 3 - myhtml_tree_open_elements_pop_until(tree, tr_or_th_node->tag_idx, tr_or_th_node->my_namespace, myfalse); + myhtml_tree_open_elements_pop_until(tree, tr_or_th_node->tag_idx, tr_or_th_node->my_namespace, false); // step 4 myhtml_tree_active_formatting_up_to_last_marker(tree); @@ -2465,7 +2518,7 @@ void myhtml_tree_close_cell(myhtml_tree_t* tree, myhtml_tree_node_t* tr_or_th_no tree->insert_mode = MyHTML_INSERTION_MODE_IN_ROW; } -mybool_t myhtml_tree_is_mathml_integration_point(myhtml_tree_t* tree, myhtml_tree_node_t* node) +bool myhtml_tree_is_mathml_integration_point(myhtml_tree_t* tree, myhtml_tree_node_t* node) { if(node->my_namespace == MyHTML_NAMESPACE_MATHML && (node->tag_idx == MyHTML_TAG_MI || @@ -2474,19 +2527,19 @@ mybool_t myhtml_tree_is_mathml_integration_point(myhtml_tree_t* tree, myhtml_tre node->tag_idx == MyHTML_TAG_MS || node->tag_idx == MyHTML_TAG_MTEXT) ) - return mytrue; + return true; - return myfalse; + return false; } -mybool_t myhtml_tree_is_html_integration_point(myhtml_tree_t* tree, myhtml_tree_node_t* node) +bool myhtml_tree_is_html_integration_point(myhtml_tree_t* tree, myhtml_tree_node_t* node) { if(node->my_namespace == MyHTML_NAMESPACE_SVG && (node->tag_idx == MyHTML_TAG_FOREIGNOBJECT || node->tag_idx == MyHTML_TAG_DESC || node->tag_idx == MyHTML_TAG_TITLE) ) - return mytrue; + return true; if(node->my_namespace == MyHTML_NAMESPACE_MATHML && node->tag_idx == MyHTML_TAG_ANNOTATION_XML && node->token && @@ -2497,15 +2550,15 @@ mybool_t myhtml_tree_is_html_integration_point(myhtml_tree_t* tree, myhtml_tree_ myhtml_token_attr_t* attr = myhtml_token_attr_match_case(tree->token, node->token, "encoding", 8, "text/html", 9); if(attr) - return mytrue; + return true; attr = myhtml_token_attr_match_case(tree->token, node->token, "encoding", 8, "application/xhtml+xml", 21); if(attr) - return mytrue; + return true; } - return myfalse; + return false; } // temp tag name @@ -2526,7 +2579,7 @@ void myhtml_tree_temp_tag_name_clean(myhtml_tree_temp_tag_name_t* temp_tag_name) temp_tag_name->length = 0; } -myhtml_tree_temp_tag_name_t * myhtml_tree_temp_tag_name_destroy(myhtml_tree_temp_tag_name_t* temp_tag_name, mybool_t self_destroy) +myhtml_tree_temp_tag_name_t * myhtml_tree_temp_tag_name_destroy(myhtml_tree_temp_tag_name_t* temp_tag_name, bool self_destroy) { if(temp_tag_name == NULL) return NULL; @@ -2590,8 +2643,12 @@ myhtml_status_t myhtml_tree_temp_tag_name_append(myhtml_tree_temp_tag_name_t* te void myhtml_tree_wait_for_last_done_token(myhtml_tree_t* tree, myhtml_token_node_t* token_for_wait) { +#ifndef MyHTML_BUILD_WITHOUT_THREADS + const struct timespec tomeout = {0, 1000}; while(tree->token_last_done != token_for_wait) {myhtml_thread_nanosleep(&tomeout);} + +#endif } /* special tonek list */ @@ -2612,7 +2669,7 @@ void myhtml_tree_special_list_clean(myhtml_tree_temp_tag_name_t* temp_tag_name) temp_tag_name->length = 0; } -myhtml_tree_special_token_list_t * myhtml_tree_special_list_destroy(myhtml_tree_special_token_list_t* special, mybool_t self_destroy) +myhtml_tree_special_token_list_t * myhtml_tree_special_list_destroy(myhtml_tree_special_token_list_t* special, bool self_destroy) { if(special == NULL) return NULL; |