diff options
author | Bo Yang <struggleyb.nku@gmail.com> | 2009-03-19 07:54:45 +0000 |
---|---|---|
committer | Bo Yang <struggleyb.nku@gmail.com> | 2009-03-19 07:54:45 +0000 |
commit | f05c3c710a443641aab66cb46a4333cdc2683d03 (patch) | |
tree | f917ac74d7dcc789431bac7228d07a0f9695d3ea | |
parent | e2e04178aca01d3102b53531b283556bb379a499 (diff) | |
download | libdom-f05c3c710a443641aab66cb46a4333cdc2683d03.tar.gz libdom-f05c3c710a443641aab66cb46a4333cdc2683d03.tar.bz2 |
Convert DOM document interface to use vtable structure.
svn path=/trunk/dom/; revision=6802
-rw-r--r-- | include/dom/core/attr.h | 2 | ||||
-rw-r--r-- | include/dom/core/document.h | 469 | ||||
-rw-r--r-- | src/core/attr.c | 1 | ||||
-rw-r--r-- | src/core/attr.h | 2 | ||||
-rw-r--r-- | src/core/document.c | 107 | ||||
-rw-r--r-- | src/core/document.h | 141 |
6 files changed, 598 insertions, 124 deletions
diff --git a/include/dom/core/attr.h b/include/dom/core/attr.h index 89bf8a2..ad9917a 100644 --- a/include/dom/core/attr.h +++ b/include/dom/core/attr.h @@ -19,6 +19,8 @@ struct dom_node; struct dom_attr; struct dom_string; +typedef struct dom_attr dom_attr; + /* DOM Attr vtable */ typedef struct dom_attr_vtable { struct dom_node_vtable base; diff --git a/include/dom/core/document.h b/include/dom/core/document.h index 6a5fd9f..08b46db 100644 --- a/include/dom/core/document.h +++ b/include/dom/core/document.h @@ -12,13 +12,13 @@ #include <stdint.h> #include <dom/core/exceptions.h> +#include <dom/core/node.h> struct dom_attr; struct dom_cdata_section; struct dom_characterdata; struct dom_comment; struct dom_configuration; -struct dom_document; struct dom_document_fragment; struct dom_document_type; struct dom_element; @@ -30,75 +30,414 @@ struct dom_processing_instruction; struct dom_string; struct dom_text; -dom_exception dom_document_get_doctype(struct dom_document *doc, - struct dom_document_type **result); -dom_exception dom_document_get_implementation(struct dom_document *doc, - struct dom_implementation **result); -dom_exception dom_document_get_document_element(struct dom_document *doc, - struct dom_element **result); -dom_exception dom_document_create_element(struct dom_document *doc, - struct dom_string *tag_name, struct dom_element **result); -dom_exception dom_document_create_document_fragment(struct dom_document *doc, - struct dom_document_fragment **result); -dom_exception dom_document_create_text_node(struct dom_document *doc, - struct dom_string *data, struct dom_text **result); -dom_exception dom_document_create_comment(struct dom_document *doc, - struct dom_string *data, struct dom_comment **result); -dom_exception dom_document_create_cdata_section(struct dom_document *doc, - struct dom_string *data, struct dom_cdata_section **result); -dom_exception dom_document_create_processing_instruction( +typedef struct dom_document dom_document; + +/* DOM Document vtable */ +typedef struct dom_document_vtable { + struct dom_node_vtable base; + + dom_exception (*dom_document_get_doctype)(struct dom_document *doc, + struct dom_document_type **result); + dom_exception (*dom_document_get_implementation)( + struct dom_document *doc, + struct dom_implementation **result); + dom_exception (*dom_document_get_document_element)( + struct dom_document *doc, struct dom_element **result); + dom_exception (*dom_document_create_element)(struct dom_document *doc, + struct dom_string *tag_name, + struct dom_element **result); + dom_exception (*dom_document_create_document_fragment)( + struct dom_document *doc, + struct dom_document_fragment **result); + dom_exception (*dom_document_create_text_node)(struct dom_document *doc, + struct dom_string *data, struct dom_text **result); + dom_exception (*dom_document_create_comment)(struct dom_document *doc, + struct dom_string *data, struct dom_comment **result); + dom_exception (*dom_document_create_cdata_section)( + struct dom_document *doc, struct dom_string *data, + struct dom_cdata_section **result); + dom_exception (*dom_document_create_processing_instruction)( + struct dom_document *doc, struct dom_string *target, + struct dom_string *data, + struct dom_processing_instruction **result); + dom_exception (*dom_document_create_attribute)(struct dom_document *doc, + struct dom_string *name, struct dom_attr **result); + dom_exception (*dom_document_create_entity_reference)( + struct dom_document *doc, struct dom_string *name, + struct dom_entity_reference **result); + dom_exception (*dom_document_get_elements_by_tag_name)( + struct dom_document *doc, struct dom_string *tagname, + struct dom_nodelist **result); + dom_exception (*dom_document_import_node)(struct dom_document *doc, + struct dom_node *node, bool deep, + struct dom_node **result); + dom_exception (*dom_document_create_element_ns)( + struct dom_document *doc, struct dom_string *namespace, + struct dom_string *qname, struct dom_element **result); + dom_exception (*dom_document_create_attribute_ns)( + struct dom_document *doc, struct dom_string *namespace, + struct dom_string *qname, struct dom_attr **result); + dom_exception (*dom_document_get_elements_by_tag_name_ns)( + struct dom_document *doc, struct dom_string *namespace, + struct dom_string *localname, + struct dom_nodelist **result); + dom_exception (*dom_document_get_element_by_id)( + struct dom_document *doc, struct dom_string *id, + struct dom_element **result); + dom_exception (*dom_document_get_input_encoding)( + struct dom_document *doc, struct dom_string **result); + dom_exception (*dom_document_get_xml_encoding)(struct dom_document *doc, + struct dom_string **result); + dom_exception (*dom_document_get_xml_standalone)( + struct dom_document *doc, bool *result); + dom_exception (*dom_document_set_xml_standalone)( + struct dom_document *doc, bool standalone); + dom_exception (*dom_document_get_xml_version)(struct dom_document *doc, + struct dom_string **result); + dom_exception (*dom_document_set_xml_version)(struct dom_document *doc, + struct dom_string *version); + dom_exception (*dom_document_get_strict_error_checking)( + struct dom_document *doc, bool *result); + dom_exception (*dom_document_set_strict_error_checking)( + struct dom_document *doc, bool strict); + dom_exception (*dom_document_get_uri)(struct dom_document *doc, + struct dom_string **result); + dom_exception (*dom_document_set_uri)(struct dom_document *doc, + struct dom_string *uri); + dom_exception (*dom_document_adopt_node)(struct dom_document *doc, + struct dom_node *node, struct dom_node **result); + dom_exception (*dom_document_get_dom_config)(struct dom_document *doc, + struct dom_configuration **result); + dom_exception (*dom_document_normalize)(struct dom_document *doc); + dom_exception (*dom_document_rename_node)(struct dom_document *doc, + struct dom_node *node, struct dom_string *namespace, + struct dom_string *qname, struct dom_node **result); +} dom_document_vtable; + +static inline dom_exception dom_document_get_doctype(struct dom_document *doc, + struct dom_document_type **result) +{ + return ((dom_document_vtable *) ((dom_node *) doc)->vtable)-> + dom_document_get_doctype(doc, result); +} +#define dom_document_get_doctype(d, r) dom_document_get_doctype( \ + (dom_document *) (d), (struct dom_document_type **) (r)) + +static inline dom_exception dom_document_get_implementation( + struct dom_document *doc, struct dom_implementation **result) +{ + return ((dom_document_vtable *) ((dom_node *) doc)->vtable)-> + dom_document_get_implementation(doc, result); +} +#define dom_document_get_implementation(d, r) dom_document_get_implementation(\ + (dom_document *) (d), (struct dom_implementation **) (r)) + +static inline dom_exception dom_document_get_document_element( + struct dom_document *doc, struct dom_element **result) +{ + return ((dom_document_vtable *) ((dom_node *) doc)->vtable)-> + dom_document_get_document_element(doc, result); +} +#define dom_document_get_document_element(d, r) \ + dom_document_get_document_element((dom_document *) (d), \ + (struct dom_element **) (r)) + +static inline dom_exception dom_document_create_element( + struct dom_document *doc, struct dom_string *tag_name, + struct dom_element **result) +{ + return ((dom_document_vtable *) ((dom_node *) doc)->vtable)-> + dom_document_create_element(doc, tag_name, result); +} +#define dom_document_create_element(d, t, r) dom_document_create_element( \ + (dom_document *) (d), (struct dom_string *) (t), \ + (struct dom_element **) (r)) + +static inline dom_exception dom_document_create_document_fragment( + struct dom_document *doc, + struct dom_document_fragment **result) +{ + return ((dom_document_vtable *) ((dom_node *) doc)->vtable)-> + dom_document_create_document_fragment(doc, result); +} +#define dom_document_create_document_fragment(d, r) \ + dom_document_create_document_fragment((dom_document *) (d), \ + (struct dom_document_fragment **) (r)) + +static inline dom_exception dom_document_create_text_node( + struct dom_document *doc, struct dom_string *data, + struct dom_text **result) +{ + return ((dom_document_vtable *) ((dom_node *) doc)->vtable)-> + dom_document_create_text_node(doc, data, result); +} +#define dom_document_create_text_node(d, data, r) \ + dom_document_create_text_node((dom_document *) (d), \ + (struct dom_string *) (data), (struct dom_text **) (r)) + +static inline dom_exception dom_document_create_comment( + struct dom_document *doc, struct dom_string *data, + struct dom_comment **result) +{ + return ((dom_document_vtable *) ((dom_node *) doc)->vtable)-> + dom_document_create_comment(doc, data, result); +} +#define dom_document_create_comment(d, data, r) dom_document_create_comment( \ + (dom_document *) (d), (struct dom_string *) (data), \ + (struct dom_comment **) (r)) + +static inline dom_exception dom_document_create_cdata_section( + struct dom_document *doc, struct dom_string *data, + struct dom_cdata_section **result) +{ + return ((dom_document_vtable *) ((dom_node *) doc)->vtable)-> + dom_document_create_cdata_section(doc, data, result); +} +#define dom_document_create_cdata_section(d, data, r) \ + dom_document_create_cdata_section((dom_document *) (d), \ + (struct dom_string *) (data), \ + (struct dom_cdata_section **) (r)) + +static inline dom_exception dom_document_create_processing_instruction( struct dom_document *doc, struct dom_string *target, struct dom_string *data, - struct dom_processing_instruction **result); -dom_exception dom_document_create_attribute(struct dom_document *doc, - struct dom_string *name, struct dom_attr **result); -dom_exception dom_document_create_entity_reference(struct dom_document *doc, - struct dom_string *name, - struct dom_entity_reference **result); -dom_exception dom_document_get_elements_by_tag_name(struct dom_document *doc, - struct dom_string *tagname, struct dom_nodelist **result); -dom_exception dom_document_import_node(struct dom_document *doc, - struct dom_node *node, bool deep, struct dom_node **result); -dom_exception dom_document_create_element_ns(struct dom_document *doc, - struct dom_string *namespace, struct dom_string *qname, - struct dom_element **result); -dom_exception dom_document_create_attribute_ns(struct dom_document *doc, - struct dom_string *namespace, struct dom_string *qname, - struct dom_attr **result); -dom_exception dom_document_get_elements_by_tag_name_ns( + struct dom_processing_instruction **result) +{ + return ((dom_document_vtable *) ((dom_node *) doc)->vtable)-> + dom_document_create_processing_instruction(doc, target, + data, result); +} +#define dom_document_create_processing_instruction(d, t, data, r) \ + dom_document_create_processing_instruction( \ + (dom_document *) (d), (struct dom_string *) (t), \ + (struct dom_string *) (data), \ + (struct dom_processing_instruction **) (r)) + +static inline dom_exception dom_document_create_attribute( + struct dom_document *doc, struct dom_string *name, + struct dom_attr **result) +{ + return ((dom_document_vtable *) ((dom_node *) doc)->vtable)-> + dom_document_create_attribute(doc, name, result); +} +#define dom_document_create_attribute(d, n, r) dom_document_create_attribute( \ + (dom_document *) (d), (struct dom_string *) (n), \ + (struct dom_attr **) (r)) + +static inline dom_exception dom_document_create_entity_reference( + struct dom_document *doc, struct dom_string *name, + struct dom_entity_reference **result) +{ + return ((dom_document_vtable *) ((dom_node *) doc)->vtable)-> + dom_document_create_entity_reference(doc, name, + result); +} +#define dom_document_create_entity_reference(d, n, r) \ + dom_document_create_entity_reference((dom_document *) (d), \ + (struct dom_string *) (n), (struct dom_entity_reference **) (r)) + +static inline dom_exception dom_document_get_elements_by_tag_name( + struct dom_document *doc, struct dom_string *tagname, + struct dom_nodelist **result) +{ + return ((dom_document_vtable *) ((dom_node *) doc)->vtable)-> + dom_document_get_elements_by_tag_name(doc, tagname, + result); +} +#define dom_document_get_elements_by_tag_name(d, t, r) \ + dom_document_get_elements_by_tag_name((dom_document *) (d), \ + (struct dom_string *) (t), (struct dom_nodelist **) (r)) + +static inline dom_exception dom_document_import_node(struct dom_document *doc, + struct dom_node *node, bool deep, struct dom_node **result) +{ + return ((dom_document_vtable *) ((dom_node *) doc)->vtable)-> + dom_document_import_node(doc, node, deep, result); +} +#define dom_document_import_node(d, n, deep, r) dom_document_import_node( \ + (dom_document *) (d), (dom_node *) (n), (bool) deep, \ + (dom_node **) (r)) + +static inline dom_exception dom_document_create_element_ns( + struct dom_document *doc, struct dom_string *namespace, + struct dom_string *qname, struct dom_element **result) +{ + return ((dom_document_vtable *) ((dom_node *) doc)->vtable)-> + dom_document_create_element_ns(doc, namespace, + qname, result); +} +#define dom_document_create_element_ns(d, n, q, r) \ + dom_document_create_element_ns((dom_document *) (d), \ + (struct dom_string *) (n), (struct dom_string *) (q), \ + (struct dom_element **) (r)) + +static inline dom_exception dom_document_create_attribute_ns + (struct dom_document *doc, struct dom_string *namespace, + struct dom_string *qname, struct dom_attr **result) +{ + return ((dom_document_vtable *) ((dom_node *) doc)->vtable)-> + dom_document_create_attribute_ns(doc, namespace, + qname, result); +} +#define dom_document_create_attribute_ns(d, n, q, r) \ + dom_document_create_attribute_ns((dom_document *) (d), \ + (struct dom_string *) (n), (struct dom_string *) (q), \ + (struct dom_attr **) (r)) + +static inline dom_exception dom_document_get_elements_by_tag_name_ns( struct dom_document *doc, struct dom_string *namespace, - struct dom_string *localname, struct dom_nodelist **result); -dom_exception dom_document_get_element_by_id(struct dom_document *doc, - struct dom_string *id, struct dom_element **result); -dom_exception dom_document_get_input_encoding(struct dom_document *doc, - struct dom_string **result); -dom_exception dom_document_get_xml_encoding(struct dom_document *doc, - struct dom_string **result); -dom_exception dom_document_get_xml_standalone(struct dom_document *doc, - bool *result); -dom_exception dom_document_set_xml_standalone(struct dom_document *doc, - bool standalone); -dom_exception dom_document_get_xml_version(struct dom_document *doc, - struct dom_string **result); -dom_exception dom_document_set_xml_version(struct dom_document *doc, - struct dom_string *version); -dom_exception dom_document_get_strict_error_checking( - struct dom_document *doc, bool *result); -dom_exception dom_document_set_strict_error_checking( - struct dom_document *doc, bool strict); -dom_exception dom_document_get_uri(struct dom_document *doc, - struct dom_string **result); -dom_exception dom_document_set_uri(struct dom_document *doc, - struct dom_string *uri); -dom_exception dom_document_adopt_node(struct dom_document *doc, - struct dom_node *node, struct dom_node **result); -dom_exception dom_document_get_dom_config(struct dom_document *doc, - struct dom_configuration **result); -dom_exception dom_document_normalize(struct dom_document *doc); -dom_exception dom_document_rename_node(struct dom_document *doc, + struct dom_string *localname, struct dom_nodelist **result) +{ + return ((dom_document_vtable *) ((dom_node *) doc)->vtable)-> + dom_document_get_elements_by_tag_name_ns(doc, + namespace, localname, result); +} +#define dom_document_get_elements_by_tag_name_ns(d, n, l, r) \ + dom_document_get_elements_by_tag_name_ns((dom_document *) (d),\ + (struct dom_string *) (n), (struct dom_string *) (l), \ + (struct dom_nodelist **) (r)) + +static inline dom_exception dom_document_get_element_by_id( + struct dom_document *doc, struct dom_string *id, + struct dom_element **result) +{ + return ((dom_document_vtable *) ((dom_node *) doc)->vtable)-> + dom_document_get_element_by_id(doc, id, result); +} +#define dom_document_get_element_by_id(d, i, r) \ + dom_document_get_element_by_id((dom_document *) (d), \ + (struct dom_string *) (i), (struct dom_element **) (r)) + +static inline dom_exception dom_document_get_input_encoding( + struct dom_document *doc, struct dom_string **result) +{ + return ((dom_document_vtable *) ((dom_node *) doc)->vtable)-> + dom_document_get_input_encoding(doc, result); +} +#define dom_document_get_input_encoding(d, r) dom_document_get_input_encoding(\ + (dom_document *) (d), (struct dom_string **) (r)) + +static inline dom_exception dom_document_get_xml_encoding( + struct dom_document *doc, struct dom_string **result) +{ + return ((dom_document_vtable *) ((dom_node *) doc)->vtable)-> + dom_document_get_xml_encoding(doc, result); +} +#define dom_document_get_xml_encoding(d, r) dom_document_get_xml_encoding( \ + (dom_document *) (d), (struct dom_string **) (r)) + +static inline dom_exception dom_document_get_xml_standalone( + struct dom_document *doc, bool *result) +{ + return ((dom_document_vtable *) ((dom_node *) doc)->vtable)-> + dom_document_get_xml_standalone(doc, result); +} +#define dom_document_get_xml_standalone(d, r) dom_document_get_xml_standalone(\ + (dom_document *) (d), (bool *) (r)) + +static inline dom_exception dom_document_set_xml_standalone( + struct dom_document *doc, bool standalone) +{ + return ((dom_document_vtable *) ((dom_node *) doc)->vtable)-> + dom_document_set_xml_standalone(doc, standalone); +} +#define dom_document_set_xml_standalone(d, s) dom_document_set_xml_standalone(\ + (dom_document *) (d), (bool) (s)) + +static inline dom_exception dom_document_get_xml_version( + struct dom_document *doc, struct dom_string **result) +{ + return ((dom_document_vtable *) ((dom_node *) doc)->vtable)-> + dom_document_get_xml_version(doc, result); +} +#define dom_document_get_xml_version(d, r) dom_document_get_xml_version( \ + (dom_document *) (d), (struct dom_string **) (r)) + +static inline dom_exception dom_document_set_xml_version( + struct dom_document *doc, struct dom_string *version) +{ + return ((dom_document_vtable *) ((dom_node *) doc)->vtable)-> + dom_document_set_xml_version(doc, version); +} +#define dom_document_set_xml_version(d, v) dom_document_set_xml_version( \ + (dom_document *) (d), (struct dom_string *) (v)) + +static inline dom_exception dom_document_get_strict_error_checking( + struct dom_document *doc, bool *result) +{ + return ((dom_document_vtable *) ((dom_node *) doc)->vtable)-> + dom_document_get_strict_error_checking(doc, result); +} +#define dom_document_get_strict_error_checking(d, r) \ + dom_document_get_strict_error_checking((dom_document *) (d), \ + (bool *) (r)) + +static inline dom_exception dom_document_set_strict_error_checking( + struct dom_document *doc, bool strict) +{ + return ((dom_document_vtable *) ((dom_node *) doc)->vtable)-> + dom_document_set_strict_error_checking(doc, strict); +} +#define dom_document_set_strict_error_checking(d, s) \ + dom_document_set_strict_error_checking((dom_document *) (d), \ + (bool) (s)) + +static inline dom_exception dom_document_get_uri(struct dom_document *doc, + struct dom_string **result) +{ + return ((dom_document_vtable *) ((dom_node *) doc)->vtable)-> + dom_document_get_uri(doc, result); +} +#define dom_document_get_uri(d, r) dom_document_get_uri((dom_document *) (d), \ + (struct dom_string **) (r)) + +static inline dom_exception dom_document_set_uri(struct dom_document *doc, + struct dom_string *uri) +{ + return ((dom_document_vtable *) ((dom_node *) doc)->vtable)-> + dom_document_set_uri(doc, uri); +} +#define dom_document_set_uri(d, u) dom_document_set_uri((dom_document *) (d), \ + (struct dom_string *) (u)) + +static inline dom_exception dom_document_adopt_node(struct dom_document *doc, + struct dom_node *node, struct dom_node **result) +{ + return ((dom_document_vtable *) ((dom_node *) doc)->vtable)-> + dom_document_adopt_node(doc, node, result); +} +#define dom_document_adopt_node(d, n, r) dom_document_adopt_node( \ + (dom_document *) (d), (dom_node *) (n), (dom_node **) (r)) + +static inline dom_exception dom_document_get_dom_config( + struct dom_document *doc, struct dom_configuration **result) +{ + return ((dom_document_vtable *) ((dom_node *) doc)->vtable)-> + dom_document_get_dom_config(doc, result); +} +#define dom_document_get_dom_config(d, r) dom_document_get_dom_config( \ + (dom_document *) (d), (struct dom_configuration **) (r)) + +static inline dom_exception dom_document_normalize(struct dom_document *doc) +{ + return ((dom_document_vtable *) ((dom_node *) doc)->vtable)-> + dom_document_normalize(doc); +} +#define dom_document_normalize(d) dom_document_normalize((dom_document *) (d)) + +static inline dom_exception dom_document_rename_node(struct dom_document *doc, struct dom_node *node, struct dom_string *namespace, struct dom_string *qname, - struct dom_node **result); + struct dom_node **result) +{ + return ((dom_document_vtable *) ((dom_node *) doc)->vtable)-> + dom_document_rename_node(doc, node, namespace, qname, + result); +} +#define dom_document_rename_node(d, n, ns, q, r) dom_document_rename_node( \ + (dom_document *) (d), (struct dom_string *) (ns), \ + (struct dom_string *) (q), (dom_node **) (r)) + dom_exception dom_document_create_string(struct dom_document *doc, const uint8_t *data, size_t len, struct dom_string **result); diff --git a/src/core/attr.c b/src/core/attr.c index 0c3a129..5cb00ad 100644 --- a/src/core/attr.c +++ b/src/core/attr.c @@ -20,7 +20,6 @@ #include "utils/utils.h" struct dom_element; -struct dom_type_info; /** * DOM node attribute diff --git a/src/core/attr.h b/src/core/attr.h index 11b2528..2a3cd67 100644 --- a/src/core/attr.h +++ b/src/core/attr.h @@ -12,7 +12,7 @@ struct dom_document; struct dom_string; -typedef struct dom_attr dom_attr; +struct dom_type_info; dom_exception dom_attr_create(struct dom_document *doc, struct dom_string *name, struct dom_string *namespace, diff --git a/src/core/document.c b/src/core/document.c index 74283f9..0f96908 100644 --- a/src/core/document.c +++ b/src/core/document.c @@ -21,15 +21,12 @@ #include "core/element.h" #include "core/entity_ref.h" #include "core/namednodemap.h" -#include "core/node.h" #include "core/nodelist.h" #include "core/pi.h" #include "core/text.h" #include "utils/namespace.h" #include "utils/utils.h" -struct dom_document_type; - /** * Item in list of active nodelists */ @@ -50,28 +47,19 @@ struct dom_doc_nnm { struct dom_doc_nnm *prev; /**< Previous map */ }; -/** - * DOM document - */ -struct dom_document { - struct dom_node base; /**< Base node */ - - struct dom_implementation *impl; /**< Owning implementation */ - - struct dom_doc_nl *nodelists; /**< List of active nodelists */ - - struct dom_doc_nnm *maps; /**< List of active namednodemaps */ - - struct dom_string **nodenames; /**< Interned nodenames */ - - dom_alloc alloc; /**< Memory (de)allocation function */ - void *pw; /**< Pointer to client data */ -}; /** Interned node name strings, indexed by node type */ /* Index 0 is unused */ static struct dom_string *__nodenames_utf8[DOM_NODE_TYPE_COUNT + 1]; +/* The virtual functions of this dom_document */ +static struct dom_document_vtable document_vtable = { + { + DOM_NODE_VTABLE + }, + DOM_DOCUMENT_VTABLE +}; + /** * Initialise the document module * @@ -171,6 +159,10 @@ dom_exception dom_document_create(struct dom_implementation *impl, d->alloc = alloc; d->pw = pw; + /* Initialize the virtual table */ + d->base.base.vtable = &document_vtable; + d->base.destroy = &dom_document_destroy; + /* Initialise base class -- the Document has no parent, so * destruction will be attempted as soon as its reference count * reaches zero. Documents own themselves (this simplifies the @@ -202,13 +194,16 @@ dom_exception dom_document_create(struct dom_implementation *impl, /** * Destroy a document * - * \param doc The document to destroy + * \param doc The document to destroy, which is passed in as a + * + * dom_node_internl * * The contents of ::doc will be destroyed and ::doc will be freed. */ -void dom_document_destroy(struct dom_document *doc) +void dom_document_destroy(struct dom_node_internal *dnode) { - struct dom_node *c, *d; + struct dom_document *doc = (struct dom_document *) dnode; + struct dom_node_internal *c, *d; /* Destroy children of this node */ for (c = doc->base.first_child; c != NULL; c = d) { @@ -268,10 +263,10 @@ void dom_document_destroy(struct dom_document *doc) * the responsibility of the caller to unref the node once it has * finished with it. */ -dom_exception dom_document_get_doctype(struct dom_document *doc, +dom_exception _dom_document_get_doctype(struct dom_document *doc, struct dom_document_type **result) { - struct dom_node *c; + struct dom_node_internal *c; for (c = doc->base.first_child; c != NULL; c = c->next) { if (c->type == DOM_DOCUMENT_TYPE_NODE) @@ -297,7 +292,7 @@ dom_exception dom_document_get_doctype(struct dom_document *doc, * It is the responsibility of the caller to unref the implementation once * it has finished with it. */ -dom_exception dom_document_get_implementation(struct dom_document *doc, +dom_exception _dom_document_get_implementation(struct dom_document *doc, struct dom_implementation **result) { if (doc->impl != NULL) @@ -319,10 +314,10 @@ dom_exception dom_document_get_implementation(struct dom_document *doc, * the responsibility of the caller to unref the node once it has * finished with it. */ -dom_exception dom_document_get_document_element(struct dom_document *doc, +dom_exception _dom_document_get_document_element(struct dom_document *doc, struct dom_element **result) { - struct dom_node *root; + struct dom_node_internal *root; /* Find first element node in child list */ for (root = doc->base.first_child; root != NULL; root = root->next) { @@ -353,7 +348,7 @@ dom_exception dom_document_get_document_element(struct dom_document *doc, * the responsibility of the caller to unref the node once it has * finished with it. */ -dom_exception dom_document_create_element(struct dom_document *doc, +dom_exception _dom_document_create_element(struct dom_document *doc, struct dom_string *tag_name, struct dom_element **result) { return dom_element_create(doc, tag_name, NULL, NULL, result); @@ -370,7 +365,7 @@ dom_exception dom_document_create_element(struct dom_document *doc, * the responsibility of the caller to unref the node once it has * finished with it. */ -dom_exception dom_document_create_document_fragment(struct dom_document *doc, +dom_exception _dom_document_create_document_fragment(struct dom_document *doc, struct dom_document_fragment **result) { return dom_document_fragment_create(doc, @@ -390,7 +385,7 @@ dom_exception dom_document_create_document_fragment(struct dom_document *doc, * the responsibility of the caller to unref the node once it has * finished with it. */ -dom_exception dom_document_create_text_node(struct dom_document *doc, +dom_exception _dom_document_create_text_node(struct dom_document *doc, struct dom_string *data, struct dom_text **result) { return dom_text_create(doc, doc->nodenames[DOM_TEXT_NODE], @@ -409,7 +404,7 @@ dom_exception dom_document_create_text_node(struct dom_document *doc, * the responsibility of the caller to unref the node once it has * finished with it. */ -dom_exception dom_document_create_comment(struct dom_document *doc, +dom_exception _dom_document_create_comment(struct dom_document *doc, struct dom_string *data, struct dom_comment **result) { return dom_comment_create(doc, doc->nodenames[DOM_COMMENT_NODE], @@ -429,7 +424,7 @@ dom_exception dom_document_create_comment(struct dom_document *doc, * the responsibility of the caller to unref the node once it has * finished with it. */ -dom_exception dom_document_create_cdata_section(struct dom_document *doc, +dom_exception _dom_document_create_cdata_section(struct dom_document *doc, struct dom_string *data, struct dom_cdata_section **result) { return dom_cdata_section_create(doc, @@ -452,7 +447,7 @@ dom_exception dom_document_create_cdata_section(struct dom_document *doc, * the responsibility of the caller to unref the node once it has * finished with it. */ -dom_exception dom_document_create_processing_instruction( +dom_exception _dom_document_create_processing_instruction( struct dom_document *doc, struct dom_string *target, struct dom_string *data, struct dom_processing_instruction **result) @@ -473,7 +468,7 @@ dom_exception dom_document_create_processing_instruction( * the responsibility of the caller to unref the node once it has * finished with it. */ -dom_exception dom_document_create_attribute(struct dom_document *doc, +dom_exception _dom_document_create_attribute(struct dom_document *doc, struct dom_string *name, struct dom_attr **result) { return dom_attr_create(doc, name, NULL, NULL, result); @@ -493,7 +488,7 @@ dom_exception dom_document_create_attribute(struct dom_document *doc, * the responsibility of the caller to unref the node once it has * finished with it. */ -dom_exception dom_document_create_entity_reference(struct dom_document *doc, +dom_exception _dom_document_create_entity_reference(struct dom_document *doc, struct dom_string *name, struct dom_entity_reference **result) { @@ -512,7 +507,7 @@ dom_exception dom_document_create_entity_reference(struct dom_document *doc, * the responsibility of the caller to unref the list once it has * finished with it. */ -dom_exception dom_document_get_elements_by_tag_name(struct dom_document *doc, +dom_exception _dom_document_get_elements_by_tag_name(struct dom_document *doc, struct dom_string *tagname, struct dom_nodelist **result) { return dom_document_get_nodelist(doc, (struct dom_node *) doc, @@ -534,7 +529,7 @@ dom_exception dom_document_get_elements_by_tag_name(struct dom_document *doc, * the responsibility of the caller to unref the node once it has * finished with it. */ -dom_exception dom_document_import_node(struct dom_document *doc, +dom_exception _dom_document_import_node(struct dom_document *doc, struct dom_node *node, bool deep, struct dom_node **result) { UNUSED(doc); @@ -573,7 +568,7 @@ dom_exception dom_document_import_node(struct dom_document *doc, * the responsibility of the caller to unref the node once it has * finished with it. */ -dom_exception dom_document_create_element_ns(struct dom_document *doc, +dom_exception _dom_document_create_element_ns(struct dom_document *doc, struct dom_string *namespace, struct dom_string *qname, struct dom_element **result) { @@ -634,7 +629,7 @@ dom_exception dom_document_create_element_ns(struct dom_document *doc, * the responsibility of the caller to unref the node once it has * finished with it. */ -dom_exception dom_document_create_attribute_ns(struct dom_document *doc, +dom_exception _dom_document_create_attribute_ns(struct dom_document *doc, struct dom_string *namespace, struct dom_string *qname, struct dom_attr **result) { @@ -680,7 +675,7 @@ dom_exception dom_document_create_attribute_ns(struct dom_document *doc, * the responsibility of the caller to unref the list once it has * finished with it. */ -dom_exception dom_document_get_elements_by_tag_name_ns( +dom_exception _dom_document_get_elements_by_tag_name_ns( struct dom_document *doc, struct dom_string *namespace, struct dom_string *localname, struct dom_nodelist **result) { @@ -700,7 +695,7 @@ dom_exception dom_document_get_elements_by_tag_name_ns( * the responsibility of the caller to unref the node once it has * finished with it. */ -dom_exception dom_document_get_element_by_id(struct dom_document *doc, +dom_exception _dom_document_get_element_by_id(struct dom_document *doc, struct dom_string *id, struct dom_element **result) { UNUSED(doc); @@ -721,7 +716,7 @@ dom_exception dom_document_get_element_by_id(struct dom_document *doc, * the responsibility of the caller to unref the string once it has * finished with it. */ -dom_exception dom_document_get_input_encoding(struct dom_document *doc, +dom_exception _dom_document_get_input_encoding(struct dom_document *doc, struct dom_string **result) { UNUSED(doc); @@ -741,7 +736,7 @@ dom_exception dom_document_get_input_encoding(struct dom_document *doc, * the responsibility of the caller to unref the string once it has * finished with it. */ -dom_exception dom_document_get_xml_encoding(struct dom_document *doc, +dom_exception _dom_document_get_xml_encoding(struct dom_document *doc, struct dom_string **result) { UNUSED(doc); @@ -757,7 +752,7 @@ dom_exception dom_document_get_xml_encoding(struct dom_document *doc, * \param result Pointer to location to receive result * \return DOM_NO_ERR. */ -dom_exception dom_document_get_xml_standalone(struct dom_document *doc, +dom_exception _dom_document_get_xml_standalone(struct dom_document *doc, bool *result) { UNUSED(doc); @@ -775,7 +770,7 @@ dom_exception dom_document_get_xml_standalone(struct dom_document *doc, * DOM_NOT_SUPPORTED_ERR if the document does not support the "XML" * feature. */ -dom_exception dom_document_set_xml_standalone(struct dom_document *doc, +dom_exception _dom_document_set_xml_standalone(struct dom_document *doc, bool standalone) { UNUSED(doc); @@ -795,7 +790,7 @@ dom_exception dom_document_set_xml_standalone(struct dom_document *doc, * the responsibility of the caller to unref the string once it has * finished with it. */ -dom_exception dom_document_get_xml_version(struct dom_document *doc, +dom_exception _dom_document_get_xml_version(struct dom_document *doc, struct dom_string **result) { UNUSED(doc); @@ -813,7 +808,7 @@ dom_exception dom_document_get_xml_version(struct dom_document *doc, * DOM_NOT_SUPPORTED_ERR if the document does not support the "XML" * feature. */ -dom_exception dom_document_set_xml_version(struct dom_document *doc, +dom_exception _dom_document_set_xml_version(struct dom_document *doc, struct dom_string *version) { UNUSED(doc); @@ -829,7 +824,7 @@ dom_exception dom_document_set_xml_version(struct dom_document *doc, * \param result Pointer to location to receive result * \return DOM_NO_ERR. */ -dom_exception dom_document_get_strict_error_checking( +dom_exception _dom_document_get_strict_error_checking( struct dom_document *doc, bool *result) { UNUSED(doc); @@ -845,7 +840,7 @@ dom_exception dom_document_get_strict_error_checking( * \param strict Whether to use strict error checking * \return DOM_NO_ERR. */ -dom_exception dom_document_set_strict_error_checking( +dom_exception _dom_document_set_strict_error_checking( struct dom_document *doc, bool strict) { UNUSED(doc); @@ -865,7 +860,7 @@ dom_exception dom_document_set_strict_error_checking( * the responsibility of the caller to unref the string once it has * finished with it. */ -dom_exception dom_document_get_uri(struct dom_document *doc, +dom_exception _dom_document_get_uri(struct dom_document *doc, struct dom_string **result) { UNUSED(doc); @@ -885,7 +880,7 @@ dom_exception dom_document_get_uri(struct dom_document *doc, * the responsibility of the caller to unref the string once it has * finished with it. */ -dom_exception dom_document_set_uri(struct dom_document *doc, +dom_exception _dom_document_set_uri(struct dom_document *doc, struct dom_string *uri) { UNUSED(doc); @@ -909,7 +904,7 @@ dom_exception dom_document_set_uri(struct dom_document *doc, * the responsibility of the caller to unref the node once it has * finished with it. */ -dom_exception dom_document_adopt_node(struct dom_document *doc, +dom_exception _dom_document_adopt_node(struct dom_document *doc, struct dom_node *node, struct dom_node **result) { UNUSED(doc); @@ -930,7 +925,7 @@ dom_exception dom_document_adopt_node(struct dom_document *doc, * the responsibility of the caller to unref the object once it has * finished with it. */ -dom_exception dom_document_get_dom_config(struct dom_document *doc, +dom_exception _dom_document_get_dom_config(struct dom_document *doc, struct dom_configuration **result) { UNUSED(doc); @@ -945,7 +940,7 @@ dom_exception dom_document_get_dom_config(struct dom_document *doc, * \param doc The document to normalize * \return DOM_NO_ERR. */ -dom_exception dom_document_normalize(struct dom_document *doc) +dom_exception _dom_document_normalize(struct dom_document *doc) { UNUSED(doc); @@ -983,7 +978,7 @@ dom_exception dom_document_normalize(struct dom_document *doc) * the responsibility of the caller to unref the node once it has * finished with it. */ -dom_exception dom_document_rename_node(struct dom_document *doc, +dom_exception _dom_document_rename_node(struct dom_document *doc, struct dom_node *node, struct dom_string *namespace, struct dom_string *qname, struct dom_node **result) diff --git a/src/core/document.h b/src/core/document.h index c5c13ac..874bc22 100644 --- a/src/core/document.h +++ b/src/core/document.h @@ -14,10 +14,149 @@ #include <dom/core/node.h> #include <dom/core/string.h> +#include "core/node.h" + struct dom_document; struct dom_namednodemap; struct dom_node; struct dom_nodelist; +struct dom_document_type; +struct dom_element; +struct dom_document_fragment; +struct dom_text; +struct dom_comment; +struct dom_cdata_section; +struct dom_processing_instruction; +struct dom_attr; +struct dom_entity_reference; +struct dom_configuration; + +struct dom_doc_nl; +struct dom_doc_nnm; + +/** + * DOM document + * This should be protected, because later the HTMLDocument will inherit from + * this. + */ +struct dom_document { + struct dom_node_internal base; /**< Base node */ + + struct dom_implementation *impl; /**< Owning implementation */ + + struct dom_doc_nl *nodelists; /**< List of active nodelists */ + + struct dom_doc_nnm *maps; /**< List of active namednodemaps */ + + struct dom_string **nodenames; /**< Interned nodenames */ + + dom_alloc alloc; /**< Memory (de)allocation function */ + void *pw; /**< Pointer to client data */ +}; + +dom_exception _dom_document_get_doctype(struct dom_document *doc, + struct dom_document_type **result); +dom_exception _dom_document_get_implementation(struct dom_document *doc, + struct dom_implementation **result); +dom_exception _dom_document_get_document_element(struct dom_document *doc, + struct dom_element **result); +dom_exception _dom_document_create_element(struct dom_document *doc, + struct dom_string *tag_name, struct dom_element **result); +dom_exception _dom_document_create_document_fragment(struct dom_document *doc, + struct dom_document_fragment **result); +dom_exception _dom_document_create_text_node(struct dom_document *doc, + struct dom_string *data, struct dom_text **result); +dom_exception _dom_document_create_comment(struct dom_document *doc, + struct dom_string *data, struct dom_comment **result); +dom_exception _dom_document_create_cdata_section(struct dom_document *doc, + struct dom_string *data, struct dom_cdata_section **result); +dom_exception _dom_document_create_processing_instruction( + struct dom_document *doc, struct dom_string *target, + struct dom_string *data, + struct dom_processing_instruction **result); +dom_exception _dom_document_create_attribute(struct dom_document *doc, + struct dom_string *name, struct dom_attr **result); +dom_exception _dom_document_create_entity_reference(struct dom_document *doc, + struct dom_string *name, + struct dom_entity_reference **result); +dom_exception _dom_document_get_elements_by_tag_name(struct dom_document *doc, + struct dom_string *tagname, struct dom_nodelist **result); +dom_exception _dom_document_import_node(struct dom_document *doc, + struct dom_node *node, bool deep, struct dom_node **result); +dom_exception _dom_document_create_element_ns(struct dom_document *doc, + struct dom_string *namespace, struct dom_string *qname, + struct dom_element **result); +dom_exception _dom_document_create_attribute_ns(struct dom_document *doc, + struct dom_string *namespace, struct dom_string *qname, + struct dom_attr **result); +dom_exception _dom_document_get_elements_by_tag_name_ns( + struct dom_document *doc, struct dom_string *namespace, + struct dom_string *localname, struct dom_nodelist **result); +dom_exception _dom_document_get_element_by_id(struct dom_document *doc, + struct dom_string *id, struct dom_element **result); +dom_exception _dom_document_get_input_encoding(struct dom_document *doc, + struct dom_string **result); +dom_exception _dom_document_get_xml_encoding(struct dom_document *doc, + struct dom_string **result); +dom_exception _dom_document_get_xml_standalone(struct dom_document *doc, + bool *result); +dom_exception _dom_document_set_xml_standalone(struct dom_document *doc, + bool standalone); +dom_exception _dom_document_get_xml_version(struct dom_document *doc, + struct dom_string **result); +dom_exception _dom_document_set_xml_version(struct dom_document *doc, + struct dom_string *version); +dom_exception _dom_document_get_strict_error_checking( + struct dom_document *doc, bool *result); +dom_exception _dom_document_set_strict_error_checking( + struct dom_document *doc, bool strict); +dom_exception _dom_document_get_uri(struct dom_document *doc, + struct dom_string **result); +dom_exception _dom_document_set_uri(struct dom_document *doc, + struct dom_string *uri); +dom_exception _dom_document_adopt_node(struct dom_document *doc, + struct dom_node *node, struct dom_node **result); +dom_exception _dom_document_get_dom_config(struct dom_document *doc, + struct dom_configuration **result); +dom_exception _dom_document_normalize(struct dom_document *doc); +dom_exception _dom_document_rename_node(struct dom_document *doc, + struct dom_node *node, + struct dom_string *namespace, struct dom_string *qname, + struct dom_node **result); + +#define DOM_DOCUMENT_VTABLE \ + _dom_document_get_doctype, \ + _dom_document_get_implementation, \ + _dom_document_get_document_element, \ + _dom_document_create_element, \ + _dom_document_create_document_fragment, \ + _dom_document_create_text_node, \ + _dom_document_create_comment, \ + _dom_document_create_cdata_section, \ + _dom_document_create_processing_instruction, \ + _dom_document_create_attribute, \ + _dom_document_create_entity_reference, \ + _dom_document_get_elements_by_tag_name, \ + _dom_document_import_node, \ + _dom_document_create_element_ns, \ + _dom_document_create_attribute_ns, \ + _dom_document_get_elements_by_tag_name_ns, \ + _dom_document_get_element_by_id, \ + _dom_document_get_input_encoding, \ + _dom_document_get_xml_encoding, \ + _dom_document_get_xml_standalone, \ + _dom_document_set_xml_standalone, \ + _dom_document_get_xml_version, \ + _dom_document_set_xml_version, \ + _dom_document_get_strict_error_checking, \ + _dom_document_set_strict_error_checking, \ + _dom_document_get_uri, \ + _dom_document_set_uri, \ + _dom_document_adopt_node, \ + _dom_document_get_dom_config, \ + _dom_document_normalize, \ + _dom_document_rename_node + /* Initialise the document module */ dom_exception _dom_document_initialise(dom_alloc alloc, void *pw); @@ -25,7 +164,7 @@ dom_exception _dom_document_initialise(dom_alloc alloc, void *pw); dom_exception _dom_document_finalise(void); /* Destroy a document */ -void dom_document_destroy(struct dom_document *doc); +void dom_document_destroy(struct dom_node_internal *dnode); /* (De)allocate memory */ void *dom_document_alloc(struct dom_document *doc, void *ptr, size_t size); |