myhtml_collection_t * _myhtml_get_nodes_by_attribute_value(myhtml_tree_t *tree, myhtml_collection_t* collection, myhtml_tree_node_t* node, myhtml_attribute_value_find_f func_eq, const char* key, size_t key_len, const char* value, size_t value_len, mystatus_t* status) { if(collection == NULL) { collection = myhtml_collection_create(1024, status); if((status && *status) || collection == NULL) return NULL; } if(node == NULL) node = tree->node_html; mystatus_t rec_status; if(key && key_len) rec_status = myhtml_get_nodes_by_attribute_value_recursion_by_key(node, collection, func_eq, key, key_len, value, value_len); else rec_status = myhtml_get_nodes_by_attribute_value_recursion(node, collection, func_eq, value, value_len); if(rec_status && status) *status = rec_status; return collection; }
myhtml_collection_t * myhtml_get_nodes_by_tag_id_in_scope(myhtml_tree_t* tree, myhtml_collection_t *collection, myhtml_tree_node_t *node, myhtml_tag_id_t tag_id, mystatus_t *status) { if(node == NULL) return NULL; mystatus_t mystatus = MyHTML_STATUS_OK; if(collection == NULL) { collection = myhtml_collection_create(1024, &mystatus); } if(mystatus) { if(status) *status = mystatus; return collection; } if(node->child) mystatus = myhtml_get_nodes_by_tag_id_in_scope_find_recursion(node->child, collection, tag_id); collection->list[collection->length] = NULL; if(status) *status = mystatus; return collection; }
myhtml_collection_t * myhtml_get_nodes_by_tag_id(myhtml_tree_t* tree, myhtml_collection_t *collection, myhtml_tag_id_t tag_id, mystatus_t *status) { if(collection == NULL) { collection = myhtml_collection_create(1024, NULL); if(collection == NULL) return NULL; } myhtml_tree_node_t *node = tree->node_html; while(node) { if(node->tag_id == tag_id) { if(myhtml_collection_check_size(collection, 1, 1024) == MyHTML_STATUS_OK) { collection->list[ collection->length ] = node; collection->length++; } else { if(status) *status = MyHTML_STATUS_ERROR_MEMORY_ALLOCATION; return collection; } } if(node->child) node = node->child; else { while(node != tree->node_html && node->next == NULL) node = node->parent; if(node == tree->node_html) break; node = node->next; } } if(myhtml_collection_check_size(collection, 1, 1024) == MyHTML_STATUS_OK) { collection->list[ collection->length ] = NULL; } else if(status) { *status = MyHTML_STATUS_ERROR_MEMORY_ALLOCATION; } return collection; }
myhtml_collection_t * myhtml_get_nodes_by_tag_id(myhtml_tree_t* tree, myhtml_collection_t *collection, myhtml_tag_id_t tag_id, myhtml_status_t *status) { myhtml_tag_index_entry_t *index_tag = myhtml_tag_index_entry(tree->indexes->tags, tag_id); myhtml_tag_index_node_t *index_node = myhtml_tag_index_first(tree->indexes->tags, tag_id); if(index_tag->count == 0) { if(status) *status = MyHTML_STATUS_OK; return collection; } myhtml_status_t mystatus = MyHTML_STATUS_OK; size_t idx = 0; if(collection == NULL) { collection = myhtml_collection_create((index_tag->count + 128), &mystatus); collection->length += index_tag->count; } else { idx = collection->length; mystatus = myhtml_collection_check_size(collection, index_tag->count); } if(mystatus) { if(status) *status = mystatus; return collection; } while (index_node) { collection->list[idx] = index_node->node; idx++; index_node = index_node->next; } collection->list[idx] = NULL; if(status) *status = mystatus; return collection; }
myhtml_collection_t * myhtml_get_nodes_by_attribute_key(myhtml_tree_t *tree, myhtml_collection_t* collection, myhtml_tree_node_t* scope_node, const char* key, size_t key_len, mystatus_t* status) { if(collection == NULL) { collection = myhtml_collection_create(1024, status); if((status && *status) || collection == NULL) return NULL; } if(scope_node == NULL) scope_node = tree->node_html; mystatus_t rec_status = myhtml_get_nodes_by_attribute_key_recursion(scope_node, collection, key, key_len); if(rec_status && status) *status = rec_status; return collection; }