summaryrefslogtreecommitdiff
path: root/src/core/element.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/element.c')
-rw-r--r--src/core/element.c77
1 files changed, 48 insertions, 29 deletions
diff --git a/src/core/element.c b/src/core/element.c
index a86dc65..bbf4c2b 100644
--- a/src/core/element.c
+++ b/src/core/element.c
@@ -1515,51 +1515,70 @@ 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(e);
+ free(new_node);
return err;
}
- if (olde->attributes != NULL) {
+ *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;
+
+ 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]);
- } else {
- e->n_classes = 0;
- e->classes = NULL;
- }
-
- e->id_ns = NULL;
- e->id_name = NULL;
- /* TODO: deal with dom_type_info, it get no definition ! */
+ if (old->n_classes > 0) {
+ new->n_classes = old->n_classes;
+ new->classes = malloc(sizeof(lwc_string *) * new->n_classes);
+ if (new->classes == NULL) {
+ err = DOM_NO_MEM_ERR;
+ goto error;
+ }
+ for (classnr = 0; classnr < new->n_classes; ++classnr)
+ new->classes[classnr] =
+ lwc_string_ref(old->classes[classnr]);
+ } else {
+ new->n_classes = 0;
+ new->classes = NULL;
+ }
+
+ err = dom_node_copy_internal(old, new);
+ if (err != DOM_NO_ERR) {
+ goto error;
+ }
- *copy = (dom_node_internal *) e;
+ new->id_ns = NULL;
+ new->id_name = NULL;
+
+ /* TODO: deal with dom_type_info, it get no definition ! */
return DOM_NO_ERR;
+
+error:
+ free(new->classes);
+ return err;
}