Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/lexborisov/perl-html-myhtml.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/myhtml/tree.c')
-rw-r--r--source/myhtml/tree.c247
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;