From d501d762eab59cc4e3cd432b25a36a60bc9aec91 Mon Sep 17 00:00:00 2001 From: Witold Filipczyk Date: Sun, 25 Aug 2024 12:46:33 +0200 Subject: [PATCH] [libdom] find_offset similar to find_in_map Also with bsearch, but this time elements are explicitly sorted. --- src/document/document.c | 8 ++---- src/document/libdom/mapa.c | 45 +++++++++++++++++++++++++++++++-- src/document/libdom/mapa.h | 2 ++ src/document/libdom/renderer2.c | 3 ++- 4 files changed, 49 insertions(+), 9 deletions(-) diff --git a/src/document/document.c b/src/document/document.c index 59c3761e..ef4ef0f2 100644 --- a/src/document/document.c +++ b/src/document/document.c @@ -437,15 +437,11 @@ done_document(struct document *document) free_document(document->dom); if (document->element_map) { - void *mapa = document->element_map; - - delete_map(mapa); + delete_map(document->element_map); } if (document->element_map_rev) { - void *mapa = document->element_map_rev; - - delete_map_rev(&mapa); + delete_map(document->element_map_rev); } #endif free_list(document->tags); diff --git a/src/document/libdom/mapa.c b/src/document/libdom/mapa.c index 09bab694..4479738f 100644 --- a/src/document/libdom/mapa.c +++ b/src/document/libdom/mapa.c @@ -52,6 +52,12 @@ save_in_map2(void *m, void *node, int length) void save_offset_in_map(void *m, void *node, int offset) +{ + save_in_map(m, node, offset); +} + +void +save_offset_in_map2(void *m, void *node, int offset) { struct hash *mapa = (struct hash *)m; @@ -94,7 +100,7 @@ create_new_element_map2(void) void * create_new_element_map_rev(void) { - return (void *)init_hash8(); + return create_new_element_map(); } void @@ -121,7 +127,6 @@ delete_map2(void *m) free_hash(m); } - void delete_map_rev(void *m) { @@ -179,9 +184,45 @@ find_in_map2(void *m, int offset) return item->value; } +static int +compare_nodes(const void *a, const void *b) +{ + void *nodea = ((struct el_node_elem *)a)->node; + void *nodeb = ((struct el_node_elem *)b)->node; + + return nodea - nodeb; +} int find_offset(void *m, void *node) +{ + struct el_mapa *mapa = (struct el_mapa *)m; + + if (!mapa) { + return -1; + } + struct el_node_elem key = { .offset = -1, .node = node }; + struct el_node_elem *item = (struct el_node_elem *)bsearch(&key, mapa->table, mapa->size, sizeof(*item), compare_nodes); + + if (!item) { + return -1; + } + return item->offset; +} + +void +sort_nodes(void *m) +{ + struct el_mapa *mapa = (struct el_mapa *)m; + + if (!mapa) { + return; + } + qsort(mapa->table, mapa->size, sizeof(struct el_node_elem), compare_nodes); +} + +int +find_offset2(void *m, void *node) { struct hash *mapa = (struct hash *)m; struct hash_item *item; diff --git a/src/document/libdom/mapa.h b/src/document/libdom/mapa.h index 0463b6a7..e5ad1d75 100644 --- a/src/document/libdom/mapa.h +++ b/src/document/libdom/mapa.h @@ -31,6 +31,8 @@ void *find_in_map2(void *m, int offset); int find_offset(void *m, void *node); +void sort_nodes(void *m); + #ifdef __cplusplus } #endif diff --git a/src/document/libdom/renderer2.c b/src/document/libdom/renderer2.c index ddb5ba68..ae9209f4 100644 --- a/src/document/libdom/renderer2.c +++ b/src/document/libdom/renderer2.c @@ -564,7 +564,7 @@ dump_xhtml(struct cache_entry *cached, struct document *document, int parse) mapa_rev = document->element_map_rev; if (mapa_rev) { - delete_map_rev(&mapa_rev); + delete_map(mapa_rev); } mapa_rev = create_new_element_map_rev(); document->element_map_rev = (void *)mapa_rev; @@ -575,6 +575,7 @@ dump_xhtml(struct cache_entry *cached, struct document *document, int parse) //dom_node_unref(doc); return; } + sort_nodes(mapa_rev); dom_node_unref(root); if (parse) {