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_status_t myhtml_get_nodes_by_attribute_value_recursion_by_key(myhtml_tree_t *tree, myhtml_tree_node_t* node, myhtml_collection_t* collection, myhtml_attribute_value_find_f func_eq, const char* key, size_t key_len, const char* value, size_t value_len) { while(node) { if(node->token && node->token->attr_first) { myhtml_tree_attr_t* attr = node->token->attr_first; while(attr) { myhtml_string_t* str_key = &attr->key; myhtml_string_t* str = &attr->value; if(str_key->length == key_len && myhtml_strncasecmp(str_key->data, key, key_len) == 0) { if(func_eq(str, value, value_len)) { collection->list[ collection->length ] = node; collection->length++; if(collection->length >= collection->size) { myhtml_status_t status = myhtml_collection_check_size(collection, 1024, 0); if(status) return status; } } } attr = attr->next; } } if(node->child) { myhtml_status_t status = myhtml_get_nodes_by_attribute_value_recursion_by_key(tree, node->child, collection, func_eq, key, key_len, value, value_len); if(status) return status; } node = node->next; } return MyHTML_STATUS_OK; }