summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJohn Mark Bell <jmb@netsurf-browser.org>2007-09-27 23:30:54 +0000
committerJohn Mark Bell <jmb@netsurf-browser.org>2007-09-27 23:30:54 +0000
commit0e4ba844078a56e962a0de8af79b8c05503b2032 (patch)
tree013ecdb41e85fadf1e43becfb75c87e2833973da /src
parenta1fb942408ba786278da758dad42d44a7342f3b3 (diff)
downloadlibdom-0e4ba844078a56e962a0de8af79b8c05503b2032.tar.gz
libdom-0e4ba844078a56e962a0de8af79b8c05503b2032.tar.bz2
Implement dom_document_create_element_ns().
Implement dom_document_create_attribute_ns(). These need more sanity checking. svn path=/trunk/dom/; revision=3600
Diffstat (limited to 'src')
-rw-r--r--src/core/document.c126
1 files changed, 113 insertions, 13 deletions
diff --git a/src/core/document.c b/src/core/document.c
index e1fc32b..b456983 100644
--- a/src/core/document.c
+++ b/src/core/document.c
@@ -523,11 +523,11 @@ dom_exception dom_document_import_node(struct dom_document *doc,
* Create an element from the qualified name and namespace URI
*
* \param doc The document owning the element
- * \param namespace The namespace URI to use
+ * \param namespace The namespace URI to use, or NULL for none
* \param qname The qualified name of the element
* \param result Pointer to location to receive result
* \return DOM_NO_ERR on success,
- * DOM_INVALID_CHARACTER_ERR if ::tag_name is invalid,
+ * DOM_INVALID_CHARACTER_ERR if ::qname is invalid,
* DOM_NAMESPACE_ERR if ::qname is malformed, or it has a
* prefix and ::namespace is NULL, or
* ::qname has a prefix "xml" and
@@ -551,12 +551,62 @@ dom_exception dom_document_create_element_ns(struct dom_document *doc,
struct dom_string *namespace, struct dom_string *qname,
struct dom_element **result)
{
- UNUSED(doc);
- UNUSED(namespace);
- UNUSED(qname);
- UNUSED(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;
+ dom_exception err;
- return DOM_NOT_SUPPORTED_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;
+ }
+ }
+
+ err = dom_string_create_from_ptr(doc, ln, local_len, &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);
+
+ /* Tidy up */
+ dom_string_unref(localname);
+ if (prefix != NULL) {
+ dom_string_unref(prefix);
+ }
+
+ return err;
}
/**
@@ -567,7 +617,7 @@ dom_exception dom_document_create_element_ns(struct dom_document *doc,
* \param qname The qualified name of the attribute
* \param result Pointer to location to receive result
* \return DOM_NO_ERR on success,
- * DOM_INVALID_CHARACTER_ERR if ::tag_name is invalid,
+ * DOM_INVALID_CHARACTER_ERR if ::qname is invalid,
* DOM_NAMESPACE_ERR if ::qname is malformed, or it has a
* prefix and ::namespace is NULL, or
* ::qname has a prefix "xml" and
@@ -591,12 +641,62 @@ dom_exception dom_document_create_attribute_ns(struct dom_document *doc,
struct dom_string *namespace, struct dom_string *qname,
struct dom_attr **result)
{
- UNUSED(doc);
- UNUSED(namespace);
- UNUSED(qname);
- UNUSED(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;
+ dom_exception err;
- return DOM_NOT_SUPPORTED_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;
+ }
+ }
+
+ err = dom_string_create_from_ptr(doc, ln, local_len, &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);
+
+ /* Tidy up */
+ dom_string_unref(localname);
+ if (prefix != NULL) {
+ dom_string_unref(prefix);
+ }
+
+ return err;
}
/**