diff options
author | Michael Drake <michael.drake@codethink.co.uk> | 2016-02-05 14:11:55 +0000 |
---|---|---|
committer | Michael Drake <michael.drake@codethink.co.uk> | 2016-02-05 14:11:55 +0000 |
commit | b38b01741aa82b7bbc81fc36d34952be5a422c21 (patch) | |
tree | 0ad3d68a8e2bfd13c0ad3baa387e0ba43537d2f4 | |
parent | 557678ebe19f65307d8b50d78dffffd01fcf907e (diff) | |
download | libdom-b38b01741aa82b7bbc81fc36d34952be5a422c21.tar.gz libdom-b38b01741aa82b7bbc81fc36d34952be5a422c21.tar.bz2 |
Split out element content copying from allocation in copy constructor.
This creates a new _dom_element_copy_internal() function, which does the
copying. The old _dom_element_copy() continues to do the allocation.
This follows the same pattern as in dom_node_internal class.
-rw-r--r-- | src/core/element.c | 61 | ||||
-rw-r--r-- | src/core/element.h | 5 |
2 files changed, 41 insertions, 25 deletions
diff --git a/src/core/element.c b/src/core/element.c index f360f3a..bde7e4e 100644 --- a/src/core/element.c +++ b/src/core/element.c @@ -1515,50 +1515,61 @@ void __dom_element_destroy(struct dom_node_internal *node) * are all specified. For the methods like importNode and adoptNode, * this will make _dom_element_copy can be used in them. */ -dom_exception _dom_element_copy(dom_node_internal *old, +dom_exception _dom_element_copy(dom_node_internal *old, dom_node_internal **copy) { - dom_element *olde = (dom_element *) old; - dom_element *e; + dom_element *new_node; dom_exception err; - uint32_t classnr; - - e = malloc(sizeof(dom_element)); - if (e == NULL) + + new_node = malloc(sizeof(dom_element)); + if (new_node == NULL) return DOM_NO_MEM_ERR; - err = dom_node_copy_internal(old, e); + err = dom_element_copy_internal(old, new_node); + if (err != DOM_NO_ERR) { + free(new_node); + return err; + } + + *copy = (dom_node_internal *) new_node; + + return DOM_NO_ERR; +} + +dom_exception _dom_element_copy_internal(dom_element *old, dom_element *new) +{ + dom_exception err; + uint32_t classnr; + + err = dom_node_copy_internal(old, new); if (err != DOM_NO_ERR) { - free(e); return err; } - if (olde->attributes != NULL) { + if (old->attributes != NULL) { /* Copy the attribute list */ - e->attributes = _dom_element_attr_list_clone(olde->attributes, - e); + new->attributes = _dom_element_attr_list_clone( + old->attributes, new); } else { - e->attributes = NULL; + new->attributes = NULL; } - if (olde->n_classes > 0) { - e->n_classes = olde->n_classes; - e->classes = malloc(sizeof(lwc_string *) * e->n_classes); - for (classnr = 0; classnr < e->n_classes; ++classnr) - e->classes[classnr] = - lwc_string_ref(olde->classes[classnr]); + if (old->n_classes > 0) { + new->n_classes = old->n_classes; + new->classes = malloc(sizeof(lwc_string *) * new->n_classes); + for (classnr = 0; classnr < new->n_classes; ++classnr) + new->classes[classnr] = + lwc_string_ref(old->classes[classnr]); } else { - e->n_classes = 0; - e->classes = NULL; + new->n_classes = 0; + new->classes = NULL; } - e->id_ns = NULL; - e->id_name = NULL; + new->id_ns = NULL; + new->id_name = NULL; /* TODO: deal with dom_type_info, it get no definition ! */ - *copy = (dom_node_internal *) e; - return DOM_NO_ERR; } diff --git a/src/core/element.h b/src/core/element.h index 5873396..c89ddc0 100644 --- a/src/core/element.h +++ b/src/core/element.h @@ -231,6 +231,11 @@ dom_exception _dom_element_copy(dom_node_internal *old, _dom_element_copy /* Helper functions*/ +dom_exception _dom_element_copy_internal(dom_element *old, + dom_element *new); +#define dom_element_copy_internal(o, n) _dom_element_copy_internal( \ + (dom_element *) (o), (dom_element *) (n)) + dom_exception _dom_element_get_id(struct dom_element *ele, dom_string **id); extern struct dom_element_vtable _dom_element_vtable; |