diff options
author | Michael Drake <tlsa@netsurf-browser.org> | 2014-03-31 22:08:54 +0100 |
---|---|---|
committer | Michael Drake <tlsa@netsurf-browser.org> | 2014-03-31 22:09:45 +0100 |
commit | 9c60417f73868e2cd8e0db951020110ee8c295fc (patch) | |
tree | 8ef1f177448a7855a83757ed3fd5c8c8f8de3baf /utils | |
parent | 0adbfe125e288c59588be87f7cd8493b0c8c0351 (diff) | |
download | netsurf-9c60417f73868e2cd8e0db951020110ee8c295fc.tar.gz netsurf-9c60417f73868e2cd8e0db951020110ee8c295fc.tar.bz2 |
Simplify DOM node walker.
Diffstat (limited to 'utils')
-rw-r--r-- | utils/libdom.c | 56 |
1 files changed, 20 insertions, 36 deletions
diff --git a/utils/libdom.c b/utils/libdom.c index a1465af19..245c9b229 100644 --- a/utils/libdom.c +++ b/utils/libdom.c @@ -50,58 +50,42 @@ bool libdom_treewalk(dom_node *root, break; } - if (next != NULL) { /* 1. children */ + if (next != NULL) { + /* 1. Got children */ dom_node_unref(node); node = next; } else { - exc = dom_node_get_next_sibling(node, &next); - if (exc != DOM_NO_ERR) { - dom_node_unref(node); - break; - } - - if (next != NULL) { /* 2. siblings */ - dom_node_unref(node); - node = next; - } else { /* 3. ancestor siblings */ - while (node != NULL) { - exc = dom_node_get_next_sibling(node, - &next); - if (exc != DOM_NO_ERR) { - dom_node_unref(node); - node = NULL; - break; - } - - if (next != NULL) { - dom_node_unref(next); - break; - } - - exc = dom_node_get_parent_node(node, - &next); - if (exc != DOM_NO_ERR) { - dom_node_unref(node); - node = NULL; - break; - } - + /* No children; siblings & ancestor's siblings */ + while (node != NULL) { + exc = dom_node_get_next_sibling(node, &next); + if (exc != DOM_NO_ERR) { dom_node_unref(node); - node = next; + node = NULL; + break; } - if (node == NULL) + if (next != NULL) { + /* 2. Got sibling */ break; + } - exc = dom_node_get_next_sibling(node, &next); + exc = dom_node_get_parent_node(node, &next); if (exc != DOM_NO_ERR) { dom_node_unref(node); + node = NULL; break; } + /* 3. Try parent */ dom_node_unref(node); node = next; } + + if (node == NULL) + break; + + dom_node_unref(node); + node = next; } assert(node != NULL); |