/* queue */ void myhtml_queue_add(myhtml_tree_t *tree, size_t begin, myhtml_token_node_t* token) { mythread_queue_node_t *qnode = tree->current_qnode; if(tree->parse_flags & MyHTML_TREE_PARSE_FLAGS_SKIP_WHITESPACE_TOKEN) { if(token && token->tag_id == MyHTML_TAG__TEXT && token->type & MyHTML_TOKEN_TYPE_WHITESPACE) { myhtml_token_node_clean(token); token->raw_begin = token->element_begin = (tree->global_offset + begin); return; } } qnode->token = token; #ifndef MyHTML_BUILD_WITHOUT_THREADS if(tree->flags & MyHTML_TREE_FLAGS_SINGLE_MODE) { myhtml_parser_worker(0, qnode); while(myhtml_rules_tree_dispatcher(tree, token)){}; tree->current_qnode = mythread_queue_node_malloc_limit(tree->myhtml->thread, tree->queue, 4, NULL); } else { tree->current_qnode = mythread_queue_node_malloc_round(tree->myhtml->thread, tree->queue_entry, NULL); } #else myhtml_parser_worker(0, qnode); while(myhtml_rules_tree_dispatcher(tree, token)){}; tree->current_qnode = mythread_queue_node_malloc_limit(tree->myhtml->thread, tree->queue, 4, NULL); #endif /* MyHTML_BUILD_WITHOUT_THREADS */ tree->current_qnode->tree = tree; tree->current_qnode->prev = qnode; if(qnode) myhtml_tokenizer_calc_current_namespace(tree, token); myhtml_token_node_malloc(tree->token, tree->current_token_node, tree->token->mcasync_token_id); tree->current_token_node->raw_begin = tree->current_token_node->element_begin = (tree->global_offset + begin); }
myhtml_tree_attr_t * myhtml_attribute_add(myhtml_tree_t *tree, myhtml_tree_node_t *node, const char *key, size_t key_len, const char *value, size_t value_len, myhtml_encoding_t encoding) { if(node == NULL) return NULL; if(node->token == NULL) { mcobject_async_status_t mcstatus; node->token = (myhtml_token_node_t*)mcobject_async_malloc(tree->token->nodes_obj, tree->mcasync_token_id, &mcstatus); if(mcstatus) return NULL; myhtml_token_node_clean(node->token); } return myhtml_token_node_attr_append_with_convert_encoding(tree->token, node->token, key, key_len, value, value_len, tree->mcasync_token_id, encoding); }
myhtml_string_t * myhtml_node_text_set_with_charef(myhtml_tree_t* tree, myhtml_tree_node_t *node, const char* text, size_t length, myhtml_encoding_t encoding) { if(node == NULL) return NULL; if(encoding >= MyHTML_ENCODING_LAST_ENTRY) return NULL; if(node->token == NULL) { mcobject_async_status_t mcstatus; node->token = (myhtml_token_node_t*)mcobject_async_malloc(tree->token->nodes_obj, tree->mcasync_token_id, &mcstatus); if(mcstatus) return NULL; myhtml_token_node_clean(node->token); } if(node->token->str.data == NULL) { myhtml_string_init(tree->mchar, tree->mchar_node_id, &node->token->str, (length + 2)); } else { if(node->token->str.size < length) { mchar_async_free(tree->mchar, node->token->str.node_idx, node->token->str.data); myhtml_string_init(tree->mchar, tree->mchar_node_id, &node->token->str, length); } else node->token->str.length = 0; } myhtml_data_process_entry_t proc_entry; myhtml_data_process_entry_clean(&proc_entry); proc_entry.encoding = encoding; myhtml_encoding_result_clean(&proc_entry.res); myhtml_data_process(&proc_entry, &node->token->str, text, length); myhtml_data_process_end(&proc_entry, &node->token->str); node->token->raw_begin = 0; node->token->raw_length = 0; return &node->token->str; }
myhtml_string_t * myhtml_node_text_set(myhtml_tree_t* tree, myhtml_tree_node_t *node, const char* text, size_t length, myhtml_encoding_t encoding) { if(node == NULL) return NULL; if(encoding >= MyHTML_ENCODING_LAST_ENTRY) return NULL; if(node->token == NULL) { mcobject_async_status_t mcstatus; node->token = (myhtml_token_node_t*)mcobject_async_malloc(tree->token->nodes_obj, tree->mcasync_token_id, &mcstatus); if(mcstatus) return NULL; myhtml_token_node_clean(node->token); } if(node->token->my_str_tm.data == NULL) { myhtml_string_init(tree->mchar, tree->mchar_node_id, &node->token->my_str_tm, (length + 2)); } else { if(node->token->my_str_tm.size < length) { mchar_async_free(tree->mchar, node->token->my_str_tm.node_idx, node->token->my_str_tm.data); myhtml_string_init(tree->mchar, tree->mchar_node_id, &node->token->my_str_tm, length); } else node->token->my_str_tm.length = 0; } if(encoding != MyHTML_ENCODING_UTF_8) { myhtml_string_append_with_convert_encoding(&node->token->my_str_tm, text, length, encoding); } else { myhtml_string_append(&node->token->my_str_tm, text, length); } node->token->begin = 0; node->token->length = node->token->my_str_tm.length; return &node->token->my_str_tm; }
myhtml_string_t * myhtml_node_text_set_with_charef(myhtml_tree_t* tree, myhtml_tree_node_t *node, const char* text, size_t length, myhtml_encoding_t encoding) { if(node == NULL) return NULL; if(encoding >= MyHTML_ENCODING_LAST_ENTRY) return NULL; if(node->token == NULL) { mcobject_async_status_t mcstatus; node->token = (myhtml_token_node_t*)mcobject_async_malloc(tree->token->nodes_obj, tree->mcasync_token_id, &mcstatus); if(mcstatus) return NULL; myhtml_token_node_clean(node->token); } if(node->token->my_str_tm.data == NULL) { myhtml_string_init(tree->mchar, tree->mchar_node_id, &node->token->my_str_tm, (length + 2)); } else { if(node->token->my_str_tm.size < length) { mchar_async_free(tree->mchar, node->token->my_str_tm.node_idx, node->token->my_str_tm.data); myhtml_string_init(tree->mchar, tree->mchar_node_id, &node->token->my_str_tm, length); } else node->token->my_str_tm.length = 0; } myhtml_string_char_ref_chunk_t str_chunk = {0, 0, 0, {0}, false, encoding}; myhtml_encoding_result_clean(&str_chunk.res); myhtml_string_append_charef(&str_chunk, &node->token->my_str_tm, text, length); myhtml_string_append_charef_end(&str_chunk, &node->token->my_str_tm); node->token->begin = 0; node->token->length = node->token->my_str_tm.length; return &node->token->my_str_tm; }
/* queue */ mystatus_t myhtml_queue_add(myhtml_tree_t *tree, size_t begin, myhtml_token_node_t* token) { // TODO: need refactoring this code // too many conditions mythread_queue_node_t *qnode = tree->current_qnode; if(tree->parse_flags & MyHTML_TREE_PARSE_FLAGS_SKIP_WHITESPACE_TOKEN) { if(token && token->tag_id == MyHTML_TAG__TEXT && token->type & MyHTML_TOKEN_TYPE_WHITESPACE) { myhtml_token_node_clean(token); token->raw_begin = token->element_begin = (tree->global_offset + begin); return MyHTML_STATUS_OK; } } #ifndef MyCORE_BUILD_WITHOUT_THREADS if(tree->flags & MyHTML_TREE_FLAGS_SINGLE_MODE) { if(qnode && token) { qnode->args = token; myhtml_parser_worker(0, qnode); myhtml_parser_stream(0, qnode); } tree->current_qnode = mythread_queue_node_malloc_limit(tree->myhtml->thread_stream, tree->queue, 4, NULL); } else { if(qnode) qnode->args = token; tree->current_qnode = mythread_queue_node_malloc_round(tree->myhtml->thread_stream, tree->queue_entry); /* we have a clean queue list */ if(tree->queue_entry->queue->nodes_length == 0) { mythread_queue_list_entry_make_batch(tree->myhtml->thread_batch, tree->queue_entry); mythread_queue_list_entry_make_stream(tree->myhtml->thread_stream, tree->queue_entry); } } #else if(qnode && token) { qnode->args = token; myhtml_parser_worker(0, qnode); myhtml_parser_stream(0, qnode); } tree->current_qnode = mythread_queue_node_malloc_limit(tree->myhtml->thread_stream, tree->queue, 4, NULL); #endif /* MyCORE_BUILD_WITHOUT_THREADS */ if(tree->current_qnode == NULL) return MyHTML_STATUS_ERROR_MEMORY_ALLOCATION; tree->current_qnode->context = tree; tree->current_qnode->prev = qnode; if(qnode && token) myhtml_tokenizer_calc_current_namespace(tree, token); tree->current_token_node = myhtml_token_node_create(tree->token, tree->token->mcasync_token_id); if(tree->current_token_node == NULL) return MyHTML_STATUS_ERROR_MEMORY_ALLOCATION; tree->current_token_node->raw_begin = tree->current_token_node->element_begin = (tree->global_offset + begin); return MyHTML_STATUS_OK; }