summaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
Diffstat (limited to 'src/core')
-rw-r--r--src/core/element.c61
-rw-r--r--src/core/element.h5
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;