diff options
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/document.c | 87 |
1 files changed, 15 insertions, 72 deletions
diff --git a/src/core/document.c b/src/core/document.c index b456983..5148224 100644 --- a/src/core/document.c +++ b/src/core/document.c @@ -25,6 +25,7 @@ #include "core/nodelist.h" #include "core/pi.h" #include "core/text.h" +#include "utils/namespace.h" #include "utils/utils.h" struct dom_document_type; @@ -551,52 +552,23 @@ dom_exception dom_document_create_element_ns(struct dom_document *doc, struct dom_string *namespace, struct dom_string *qname, struct dom_element **result) { - const uint8_t *qd, *c, *ln; - size_t qlen; - size_t local_len; - size_t prefix_len; - struct dom_string *prefix = NULL; - struct dom_string *localname; + struct dom_string *prefix, *localname; dom_exception err; /** \todo ensure document supports XML feature */ - /** \todo validate qname */ - dom_string_get_data(qname, &qd, &qlen); - - /* Divide QName into prefix/localname pair */ - for (c = qd; c != qd + qlen; c++) { - if (*c == (const uint8_t) ':') - break; - } - - if (c == qd + qlen) { - ln = qd; - local_len = qlen; - prefix_len = 0; - } else { - ln = ++c; - local_len = qlen - (c - qd); - prefix_len = (c - qd - 1 /* ':' */); - } - - if (prefix_len > 0) { - err = dom_string_create_from_ptr(doc, qd, prefix_len, &prefix); - if (err != DOM_NO_ERR) { - return err; - } + /* Validate qname */ + err = _dom_namespace_validate_qname(qname, namespace); + if (err != DOM_NO_ERR) { + return err; } - err = dom_string_create_from_ptr(doc, ln, local_len, &localname); + /* Divide QName into prefix/localname pair */ + err = _dom_namespace_split_qname(qname, doc, &prefix, &localname); if (err != DOM_NO_ERR) { - if (prefix != NULL) { - dom_string_unref(prefix); - } return err; } - /** \todo validate namespace */ - /* Attempt to create element */ err = dom_element_create(doc, localname, namespace, prefix, result); @@ -641,52 +613,23 @@ dom_exception dom_document_create_attribute_ns(struct dom_document *doc, struct dom_string *namespace, struct dom_string *qname, struct dom_attr **result) { - const uint8_t *qd, *c, *ln; - size_t qlen; - size_t local_len; - size_t prefix_len; - struct dom_string *prefix = NULL; - struct dom_string *localname; + struct dom_string *prefix, *localname; dom_exception err; /** \todo ensure document supports XML feature */ - /** \todo validate qname */ - dom_string_get_data(qname, &qd, &qlen); - - /* Divide QName into prefix/localname pair */ - for (c = qd; c != qd + qlen; c++) { - if (*c == (const uint8_t) ':') - break; - } - - if (c == qd + qlen) { - ln = qd; - local_len = qlen; - prefix_len = 0; - } else { - ln = ++c; - local_len = qlen - (c - qd); - prefix_len = (c - qd - 1 /* ':' */); - } - - if (prefix_len > 0) { - err = dom_string_create_from_ptr(doc, qd, prefix_len, &prefix); - if (err != DOM_NO_ERR) { - return err; - } + /* Validate qname */ + err = _dom_namespace_validate_qname(qname, namespace); + if (err != DOM_NO_ERR) { + return err; } - err = dom_string_create_from_ptr(doc, ln, local_len, &localname); + /* Divide QName into prefix/localname pair */ + err = _dom_namespace_split_qname(qname, doc, &prefix, &localname); if (err != DOM_NO_ERR) { - if (prefix != NULL) { - dom_string_unref(prefix); - } return err; } - /** \todo validate namespace */ - /* Attempt to create attribute */ err = dom_attr_create(doc, localname, namespace, prefix, result); |