From ac42344d05ec326f0063133498ec1c040e924db2 Mon Sep 17 00:00:00 2001 From: John Mark Bell Date: Sun, 5 Dec 2010 23:52:56 +0000 Subject: Remove bootstrap infrastructure, and just make dom_implementation a stub. We only support a single implementation, so all the registry and implementation list stuff is totally unnecesary and overcomplex svn path=/trunk/dom/; revision=11017 --- src/Makefile | 1 + src/bootstrap/Makefile | 3 - src/bootstrap/implementation.c | 426 ----------------------------------------- src/bootstrap/implementation.h | 14 -- src/bootstrap/implregistry.c | 215 --------------------- src/bootstrap/init_fini.c | 83 -------- src/core/Makefile | 2 +- src/core/document.c | 29 +-- src/core/document.h | 10 +- src/core/document_type.c | 15 -- src/core/document_type.h | 3 - src/core/implementation.c | 147 ++++++++++---- src/core/impllist.c | 97 ---------- src/core/node.c | 20 +- src/dom.c | 69 +++++++ 15 files changed, 198 insertions(+), 936 deletions(-) delete mode 100644 src/bootstrap/Makefile delete mode 100644 src/bootstrap/implementation.c delete mode 100644 src/bootstrap/implementation.h delete mode 100644 src/bootstrap/implregistry.c delete mode 100644 src/bootstrap/init_fini.c delete mode 100644 src/core/impllist.c create mode 100644 src/dom.c (limited to 'src') diff --git a/src/Makefile b/src/Makefile index 3cbaf86..2940156 100644 --- a/src/Makefile +++ b/src/Makefile @@ -1,2 +1,3 @@ +DIR_SOURCES := dom.c include build/makefiles/Makefile.subdir diff --git a/src/bootstrap/Makefile b/src/bootstrap/Makefile deleted file mode 100644 index e969d87..0000000 --- a/src/bootstrap/Makefile +++ /dev/null @@ -1,3 +0,0 @@ -DIR_SOURCES := implregistry.c init_fini.c implementation.c - -include build/makefiles/Makefile.subdir diff --git a/src/bootstrap/implementation.c b/src/bootstrap/implementation.c deleted file mode 100644 index a27edfc..0000000 --- a/src/bootstrap/implementation.c +++ /dev/null @@ -1,426 +0,0 @@ -/* - * This file is part of libdom. - * Licensed under the MIT License, - * http://www.opensource.org/licenses/mit-license.php - * Copyright 2007 John-Mark Bell - * Copyright 2009 Bo Yang - */ - -/** - * Note: The DOMImplementation Object here is a singleton object. It is - * initialised when the libDOM is initialised, it registers itself into - * the implreg and clients of it can get it by calling: - * - * dom_implregistry_get_dom_implementation or - * dom_implregistry_get_dom_implementation_list - * - */ - -#include -#include -#include - -#include - -#include "core/node.h" -#include "core/document.h" -#include "core/document_type.h" - -#include "utils/utils.h" -#include "utils/validate.h" -#include "utils/namespace.h" - -#include "bootstrap/implementation.h" - -static dom_alloc _alloc; -static void *_pw; - -static dom_exception impl_get_dom_implementation( - struct dom_string *features, - struct dom_implementation **impl); -static dom_exception impl_get_dom_implementation_list( - struct dom_string *features, - struct dom_implementation_list **list); - -static dom_exception impl_implementation_has_feature( - struct dom_implementation *impl, - struct dom_string *feature, - struct dom_string *version, - bool *result); -static dom_exception impl_implementation_create_document_type( - struct dom_implementation *impl, - struct dom_string *qname, - struct dom_string *public_id, - struct dom_string *system_id, - dom_alloc alloc, void *pw, - struct dom_document_type **doctype); -static dom_exception impl_implementation_create_document( - struct dom_implementation *impl, - struct dom_string *namespace, - struct dom_string *qname, - struct dom_document_type *doctype, - dom_alloc alloc, void *pw, - dom_events_default_action_fetcher daf, - struct dom_document **doc); -static dom_exception impl_implementation_get_feature( - struct dom_implementation *impl, - struct dom_string *feature, - struct dom_string *version, - void **object); -static void dom_implementation_destroy(struct dom_implementation *impl); - - -static struct dom_implementation_source dom_impl_src = { - impl_get_dom_implementation, - impl_get_dom_implementation_list -}; - -static struct dom_implementation dom_impl = { - impl_implementation_has_feature, - impl_implementation_create_document_type, - impl_implementation_create_document, - impl_implementation_get_feature, - dom_implementation_destroy, - 0 -}; - -/** - * Get a DOM implementation that supports the requested features - * - * \param features String containing required features - * \param impl Pointer to location to receive implementation - * \return DOM_NO_ERR on success, DOM_NO_MEM_ERR on memory exhaustion - * - * Any memory allocated by this call should be allocated using - * the provided memory (de)allocation function. The implementation's - * destroy() method will be called once it is no longer used. - * - * The implementation will be referenced, so the client need not - * do this explicitly. The client must unref the implementation - * once it has finished with it. - */ -dom_exception impl_get_dom_implementation( - struct dom_string *features, - struct dom_implementation **impl) -{ - UNUSED(features); - - dom_impl.refcnt++; - - *impl = &dom_impl; - - return DOM_NO_ERR; -} - -/** - * Get a list of DOM implementations that support the requested - * features - * - * \param features String containing required features - * \param list Pointer to location to receive list - * \return DOM_NO_ERR on success, DOM_NO_MEM_ERR on memory exhaustion - * - * Any memory allocated by this call should be allocated using - * the provided memory (de)allocation function. The ::alloc/::pw - * pair must be stored on the list object, such that the list - * and its contents may be freed once they are no longer needed. - * - * List nodes reference the implementation objects they point to. - * - * The list will be referenced, so the client need not do this - * explicitly. The client must unref the list once it has finished - * with it. - */ -dom_exception impl_get_dom_implementation_list( - struct dom_string *features, - struct dom_implementation_list **list) -{ - struct dom_implementation_list *l; - struct dom_implementation_list_item *i; - - UNUSED(features); - - l = _alloc(NULL, sizeof(struct dom_implementation_list), _pw); - if (l == NULL) - return DOM_NO_MEM_ERR; - - i = _alloc(NULL, sizeof(struct dom_implementation_list_item), _pw); - if (i == NULL) { - _alloc(l, 0, _pw); - return DOM_NO_MEM_ERR; - } - - i->impl = &dom_impl; - i->next = NULL; - i->prev = NULL; - - l->head = i; - - l->refcnt = 1; - - *list = l; - - return DOM_NO_ERR; -} - -/** - * Test whether a DOM implementation implements a specific feature - * and version - * - * \param impl The DOM implementation to query - * \param feature The feature to test for - * \param version The version number of the feature to test for - * \param result Pointer to location to receive result - * \return DOM_NO_ERR. - */ -dom_exception impl_implementation_has_feature( - struct dom_implementation *impl, - struct dom_string *feature, - struct dom_string *version, - bool *result) -{ - UNUSED(impl); - UNUSED(feature); - UNUSED(version); - UNUSED(result); - - return DOM_NOT_SUPPORTED_ERR; -} - -/** - * Create a document type node - * - * \param impl The implementation to create the node - * \param qname The qualified name of the document type - * \param public_id The external subset public identifier - * \param system_id The external subset system identifier - * \param doctype Pointer to location to receive result - * \return DOM_NO_ERR on success, - * DOM_INVALID_CHARACTER_ERR if ::qname is invalid, - * DOM_NAMESPACE_ERR if ::qname is malformed. - * - * Any memory allocated by this call should be allocated using - * the provided memory (de)allocation function. - * - * The doctype will be referenced, so the client need not do this - * explicitly. The client must unref the doctype once it has - * finished with it. - */ -dom_exception impl_implementation_create_document_type( - struct dom_implementation *impl, - struct dom_string *qname, - struct dom_string *public_id, - struct dom_string *system_id, - dom_alloc alloc, void *pw, - struct dom_document_type **doctype) -{ - struct dom_document_type *d; - struct dom_string *prefix = NULL, *lname = NULL; - dom_exception err; - - UNUSED(impl); - - if (qname != NULL && _dom_validate_name(qname) == false) - return DOM_INVALID_CHARACTER_ERR; - - err = _dom_namespace_split_qname(qname, &prefix, &lname); - if (err != DOM_NO_ERR) - return err; - - if ((prefix != NULL && _dom_validate_ncname(prefix) == false) || - (lname != NULL && _dom_validate_ncname(lname) == false)) - return DOM_NAMESPACE_ERR; - - /* Create the doctype */ - err = _dom_document_type_create(qname, public_id, system_id, - alloc, pw, &d); - if (err != DOM_NO_ERR) - return err; - - *doctype = d; - if (prefix != NULL) - dom_string_unref(prefix); - if (lname != NULL) - dom_string_unref(lname); - - return DOM_NO_ERR; -} - -/** - * Create a document node - * - * \param impl The implementation to create the node - * \param namespace The namespace URI of the document element - * \param qname The qualified name of the document element - * \param doctype The type of document to create - * \param doc Pointer to location to receive result - * \return DOM_NO_ERR on success, - * DOM_INVALID_CHARACTER_ERR if ::qname is invalid, - * DOM_NAMESPACE_ERR if ::qname is malformed, or if - * ::qname has a prefix and - * ::namespace is NULL, or if - * ::qname is NULL and ::namespace - * is non-NULL, or if ::qname has - * a prefix "xml" and ::namespace - * is not - * "http://www.w3.org/XML/1998/namespace", - * or if ::impl does not support - * the "XML" feature and - * ::namespace is non-NULL, - * DOM_WRONG_DOCUMENT_ERR if ::doctype is already being - * used by a document, or if it - * was not created by ::impl, - * DOM_NOT_SUPPORTED_ERR if ::impl does not support the - * feature "XML" and the language - * exposed through Document does - * not support XML namespaces. - * - * Any memory allocated by this call should be allocated using - * the provided memory (de)allocation function. - * - * The document will be referenced, so the client need not do this - * explicitly. The client must unref the document once it has - * finished with it. - */ -dom_exception impl_implementation_create_document( - struct dom_implementation *impl, - struct dom_string *namespace, - struct dom_string *qname, - struct dom_document_type *doctype, - dom_alloc alloc, void *pw, - dom_events_default_action_fetcher daf, - struct dom_document **doc) -{ - struct dom_document *d; - dom_exception err; - - if (qname != NULL && _dom_validate_name(qname) == false) - return DOM_INVALID_CHARACTER_ERR; - - err = _dom_namespace_validate_qname(qname, namespace); - if (err != DOM_NO_ERR) - return DOM_NAMESPACE_ERR; - - if (doctype != NULL) { - if (dom_node_get_parent(doctype) != NULL || - _dom_document_type_get_impl(doctype) != - impl) - return DOM_WRONG_DOCUMENT_ERR; - } - - /* Create document object */ - err = _dom_document_create(impl, alloc, pw, daf, &d); - if (err != DOM_NO_ERR) - return err; - - /* Set its doctype, if necessary */ - if (doctype != NULL) { - struct dom_node *ins_doctype = NULL; - - err = dom_node_append_child((struct dom_node *) d, - (struct dom_node *) doctype, &ins_doctype); - if (err != DOM_NO_ERR) { - dom_node_unref((struct dom_node *) d); - return err; - } - - /* Not interested in inserted doctype */ - if (ins_doctype != NULL) - dom_node_unref(ins_doctype); - } - - /* Create root element and attach it to document */ - if (qname != NULL) { - struct dom_element *e; - struct dom_node *inserted; - - err = dom_document_create_element_ns(d, namespace, qname, &e); - if (err != DOM_NO_ERR) { - dom_node_unref((struct dom_node *) d); - return err; - } - - err = dom_node_append_child((struct dom_node *) d, - (struct dom_node *) e, &inserted); - if (err != DOM_NO_ERR) { - dom_node_unref((struct dom_node *) e); - dom_node_unref((struct dom_node *) d); - return err; - } - - /* No longer interested in inserted node */ - dom_node_unref(inserted); - - /* Done with element */ - dom_node_unref((struct dom_node *) e); - } - - *doc = d; - - return DOM_NO_ERR; -} - -/** - * Retrieve a specialized object which implements the specified - * feature and version - * - * \param impl The implementation to create the object - * \param feature The requested feature - * \param version The version number of the feature - * \param object Pointer to location to receive object - * \return DOM_NO_ERR. - * - * Any memory allocated by this call should be allocated using - * the provided memory (de)allocation function. - */ -dom_exception impl_implementation_get_feature( - struct dom_implementation *impl, - struct dom_string *feature, - struct dom_string *version, - void **object) -{ - UNUSED(impl); - UNUSED(feature); - UNUSED(version); - UNUSED(object); - - return DOM_NOT_SUPPORTED_ERR; -} - -/** - * Destroy a DOM implementation instance - * - * \param impl The instance to destroy - */ -void dom_implementation_destroy(struct dom_implementation *impl) -{ - UNUSED(impl); - - /* Nothing to do -- we're statically allocated */ -} - -/** - * Initialise the DOM implementation - * - * \param alloc Pointer to memory (de)allocation function - * \param pw Pointer to client-specific private data - * \return DOM_NO_ERR on success - */ -dom_exception _dom_implementation_initialise(dom_alloc alloc, void *pw) -{ - _alloc = alloc; - _pw = pw; - - return dom_register_source(&dom_impl_src); -} - -/** - * Finalise the DOM implementation - */ -void _dom_implementation_finalise(void) -{ - _alloc = NULL; - _pw = NULL; -} - - diff --git a/src/bootstrap/implementation.h b/src/bootstrap/implementation.h deleted file mode 100644 index f62077c..0000000 --- a/src/bootstrap/implementation.h +++ /dev/null @@ -1,14 +0,0 @@ -/* - * This file is part of libdom. - * Licensed under the MIT License, - * http://www.opensource.org/licenses/mit-license.php - * Copyright 2009 Bo Yang - */ - -#ifndef dom_bootstrap_implementation_h_ -#define dom_bootstrap_implementation_h_ - -dom_exception _dom_implementation_initialise(dom_alloc alloc, void *pw); -void _dom_implementation_finalise(void); - -#endif diff --git a/src/bootstrap/implregistry.c b/src/bootstrap/implregistry.c deleted file mode 100644 index 91e4068..0000000 --- a/src/bootstrap/implregistry.c +++ /dev/null @@ -1,215 +0,0 @@ -/* - * This file is part of libdom. - * Licensed under the MIT License, - * http://www.opensource.org/licenses/mit-license.php - * Copyright 2007 John-Mark Bell - */ - -#include - -#include -#include - -#include -#include - -void dom_implementation_list_destroy(struct dom_implementation_list *list); - -/** - * Item in list of registered DOM implementation sources - */ -struct dom_impl_src_item { - struct dom_implementation_source *source; /**< Source */ - - struct dom_impl_src_item *next; /**< Next in list */ - struct dom_impl_src_item *prev; /**< Previous in list */ -}; - -static struct dom_impl_src_item *sources; /**< List of registered sources */ -static dom_alloc alloc; -static void *pw; - -/** - * Initialise the implementation registry - * - * \param allocator The memory allocator - * \param ptr Private data pointer of allocator - * \return DOM_NO_ERR on success - */ -dom_exception dom_implregistry_initialise( - dom_alloc allocator, void *ptr) -{ - alloc = allocator; - pw = ptr; - - return DOM_NO_ERR; -} - -/** - * Retrieve a DOM implementation from the registry - * - * \param features String containing required features - * \param impl Pointer to location to receive implementation - * \return DOM_NO_ERR on success, DOM_NO_MEM_ERR on memory exhaustion - * - * Any memory allocated by this call should be allocated using - * the provided memory (de)allocation function. The implementation's - * destroy() method will be called once it is no longer used. - * - * The implementation will be referenced, so the client need not - * do this explicitly. The client must unref the implementation - * once it has finished with it. - */ -dom_exception dom_implregistry_get_dom_implementation( - struct dom_string *features, - struct dom_implementation **impl) -{ - struct dom_impl_src_item *item; - struct dom_implementation *found = NULL; - dom_exception err; - - for (item = sources; item; item = item->next) { - err = item->source->get_dom_implementation(features, &found); - if (err != DOM_NO_ERR) - return err; - - if (found != NULL) - break; - } - - *impl = found; - - return DOM_NO_ERR; -} - -/** - * Get a list of DOM implementations that support the requested - * features - * - * \param features String containing required features - * \param list Pointer to location to receive list - * \return DOM_NO_ERR on success, DOM_NO_MEM_ERR on memory exhaustion - * - * Any memory allocated by this call should be allocated using - * the provided memory (de)allocation function. - * - * List nodes reference the implementation objects they point to. - * - * The list will be referenced, so the client need not do this - * explicitly. The client must unref the list once it has finished - * with it. - */ -dom_exception dom_implregistry_get_dom_implementation_list( - struct dom_string *features, - struct dom_implementation_list **list) -{ - struct dom_implementation_list *l; - struct dom_impl_src_item *item; - dom_exception err; - - l = alloc(NULL, sizeof(struct dom_implementation_list), pw); - if (l == NULL) - return DOM_NO_MEM_ERR; - - l->head = NULL; - l->refcnt = 1; - l->destroy = dom_implementation_list_destroy; - - for (item = sources; item; item = item->next) { - struct dom_implementation_list *plist = NULL; - struct dom_implementation_list_item *plast = NULL; - - err = item->source->get_dom_implementation_list(features, - &plist); - if (err != DOM_NO_ERR) { - dom_implementation_list_unref(l); - return err; - } - - if (plist == NULL) - continue; - - if (plist->head == NULL) { - dom_implementation_list_unref(plist); - continue; - } - - /* Get last item in list for this source */ - for (plast = plist->head; plast; plast = plast->next) { - if (plast->next == NULL) - break; - } - - /* Prepend list for this source onto result list */ - plast->next = l->head; - if (l->head != NULL) - l->head->prev = plast; - l->head = plist->head; - - /* Invalidate entire content of list for this source */ - plist->head = NULL; - - /* And unref it */ - dom_implementation_list_unref(plist); - } - - if (l->head == NULL) { - *list = NULL; - dom_implementation_list_unref(l); - } else { - *list = l; - } - - return DOM_NO_ERR; -} - -/** - * Register a DOM implementation source with the DOM library - * - * \param source The implementation source to register - * \return DOM_NO_ERR on success, DOM_NO_MEM_ERR on memory exhaustion. - */ -dom_exception dom_register_source(struct dom_implementation_source *source) -{ - struct dom_impl_src_item *item; - - item = alloc(NULL, sizeof(struct dom_impl_src_item), pw); - if (item == NULL) - return DOM_NO_MEM_ERR; - - item->source = source; - - item->next = sources; - item->prev = NULL; - - if (sources != NULL) - sources->prev = item; - - sources = item; - - return DOM_NO_ERR; -} - -/** - * Destroy a dom_implementation_list - * - * \param list The list to destory - */ -void dom_implementation_list_destroy(struct dom_implementation_list *list) -{ - struct dom_implementation_list_item *i, *j; - - /* Destroy all list entries */ - for (i = list->head; i; i = j) { - j = i->next; - - /* Unreference the implementation */ - dom_implementation_unref(i->impl); - - /* And free the entry */ - alloc(i, 0, pw); - } - - /* Free the list object */ - alloc(list, 0, pw); -} diff --git a/src/bootstrap/init_fini.c b/src/bootstrap/init_fini.c deleted file mode 100644 index f3c7290..0000000 --- a/src/bootstrap/init_fini.c +++ /dev/null @@ -1,83 +0,0 @@ -/* - * This file is part of libdom. - * Licensed under the MIT License, - * http://www.opensource.org/licenses/mit-license.php - * Copyright 2007 John-Mark Bell - */ - -#include - -#include -#include - -#include "utils/namespace.h" -#include "bootstrap/implementation.h" - -static bool __initialised; - -/** - * Initialise the dom library - * - * \param alloc Pointer to memory (de)allocation function - * \param pw Pointer to client-specific private data - * \return DOM_NO_ERR on success. - * - * This must be the first DOM library method called. - */ -dom_exception dom_initialise(dom_alloc alloc, void *pw) -{ - dom_exception err; - - /* Ensure we only initialise once */ - if (__initialised) { - return DOM_NO_ERR; - } - - err = _dom_namespace_initialise(alloc, pw); - if (err != DOM_NO_ERR) { - return err; - } - - err = dom_implregistry_initialise(alloc, pw); - if (err != DOM_NO_ERR) { - return err; - } - - err = _dom_implementation_initialise(alloc, pw); - if (err != DOM_NO_ERR) { - return err; - } - - __initialised = true; - - return DOM_NO_ERR; -} - -/** - * Finalise the dom library - * - * \return DOM_NO_ERR on success. - * - * This must be the last DOM library method called. - */ -dom_exception dom_finalise(void) -{ - dom_exception err; - - /* Ensure we only finalise once */ - if (__initialised == false) { - return DOM_NO_ERR; - } - - _dom_implementation_finalise(); - - err = _dom_namespace_finalise(); - if (err != DOM_NO_ERR) { - return err; - } - - __initialised = false; - - return DOM_NO_ERR; -} - diff --git a/src/core/Makefile b/src/core/Makefile index 46cb48d..c9da9c1 100644 --- a/src/core/Makefile +++ b/src/core/Makefile @@ -2,7 +2,7 @@ DIR_SOURCES := \ string.c node.c \ attr.c characterdata.c element.c \ - implementation.c impllist.c \ + implementation.c \ text.c typeinfo.c comment.c \ namednodemap.c nodelist.c \ cdatasection.c document_type.c entity_ref.c pi.c \ diff --git a/src/core/document.c b/src/core/document.c index ad25bd7..20ad789 100644 --- a/src/core/document.c +++ b/src/core/document.c @@ -11,7 +11,6 @@ #include #include -#include #include #include #include @@ -71,7 +70,6 @@ static dom_exception dom_document_dup_node(dom_document *doc, /** * Create a Document * - * \param impl The DOM implementation owning the document * \param alloc Memory (de)allocation function * \param pw Pointer to client-specific private data * \param doc Pointer to location to receive created document @@ -83,8 +81,7 @@ static dom_exception dom_document_dup_node(dom_document *doc, * * The returned document will already be referenced. */ -dom_exception _dom_document_create(struct dom_implementation *impl, - dom_alloc alloc, void *pw, +dom_exception _dom_document_create(dom_alloc alloc, void *pw, dom_events_default_action_fetcher daf, struct dom_document **doc) { @@ -105,7 +102,7 @@ dom_exception _dom_document_create(struct dom_implementation *impl, * reaches zero. Documents own themselves (this simplifies the * rest of the code, as it doesn't need to special case Documents) */ - err = _dom_document_initialise(d, impl, alloc, pw, daf); + err = _dom_document_initialise(d, alloc, pw, daf); if (err != DOM_NO_ERR) { /* Clean up document */ alloc(d, 0, pw); @@ -119,23 +116,19 @@ dom_exception _dom_document_create(struct dom_implementation *impl, /* Initialise the document */ dom_exception _dom_document_initialise(struct dom_document *doc, - struct dom_implementation *impl, dom_alloc alloc, void *pw, + dom_alloc alloc, void *pw, dom_events_default_action_fetcher daf) { - assert(alloc != NULL); - assert(impl != NULL); - dom_exception err; lwc_string *name; lwc_error lerr; - + + assert(alloc != NULL); + lerr = lwc_intern_string("#document", SLEN("#document"), &name); if (lerr != lwc_error_ok) return _dom_exception_from_lwc_error(lerr); - dom_implementation_ref(impl); - doc->impl = impl; - doc->nodelists = NULL; /* Set up document allocation context - must be first */ @@ -173,9 +166,6 @@ bool _dom_document_finalise(struct dom_document *doc) /* Ok, the document tree is empty, as is the list of nodes pending * deletion. Therefore, it is safe to destroy the document. */ - if (doc->impl != NULL) - dom_implementation_unref(doc->impl); - doc->impl = NULL; /* This is paranoia -- if there are any remaining nodelists, * then the document's reference count will be @@ -240,12 +230,11 @@ dom_exception _dom_document_get_doctype(struct dom_document *doc, * it has finished with it. */ dom_exception _dom_document_get_implementation(struct dom_document *doc, - struct dom_implementation **result) + dom_implementation **result) { - if (doc->impl != NULL) - dom_implementation_ref(doc->impl); + UNUSED(doc); - *result = doc->impl; + *result = (dom_implementation *) "libdom"; return DOM_NO_ERR; } diff --git a/src/core/document.h b/src/core/document.h index e657530..3939f9a 100644 --- a/src/core/document.h +++ b/src/core/document.h @@ -13,6 +13,7 @@ #include #include +#include #include "core/string.h" #include "core/node.h" @@ -49,8 +50,6 @@ struct dom_doc_nl; 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_string *uri; /**< The uri of this document */ @@ -68,14 +67,13 @@ struct dom_document { }; /* Create a DOM document */ -dom_exception _dom_document_create(struct dom_implementation *impl, - dom_alloc alloc, void *pw, +dom_exception _dom_document_create(dom_alloc alloc, void *pw, dom_events_default_action_fetcher daf, struct dom_document **doc); /* Initialise the document */ dom_exception _dom_document_initialise(struct dom_document *doc, - struct dom_implementation *impl, dom_alloc alloc, void *pw, + dom_alloc alloc, void *pw, dom_events_default_action_fetcher daf); /* Finalise the document */ @@ -100,7 +98,7 @@ dom_exception _dom_document_create_string_from_lwcstring( 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_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, diff --git a/src/core/document_type.c b/src/core/document_type.c index 1c9d0cb..7788b1d 100644 --- a/src/core/document_type.c +++ b/src/core/document_type.c @@ -10,7 +10,6 @@ #include #include -#include #include "core/string.h" #include "core/document_type.h" @@ -25,8 +24,6 @@ struct dom_document_type { struct dom_node_internal base; /**< Base node */ - struct dom_implementation *impl; /**< Owning implementation */ - struct dom_string *public_id; /**< Doctype public ID */ struct dom_string *system_id; /**< Doctype system ID */ @@ -379,15 +376,3 @@ void _dom_document_type_get_resource_mgr( rm->pw = dt->res.pw; } -/** - * Get the implementation which created this dom_document_type - * - * \param dt The document type object - * \return the dom_implementation instance which creates this node. - */ -struct dom_implementation *_dom_document_type_get_impl( - struct dom_document_type *dt) -{ - return dt->impl; -} - diff --git a/src/core/document_type.h b/src/core/document_type.h index 93db617..4fd1c83 100644 --- a/src/core/document_type.h +++ b/src/core/document_type.h @@ -10,7 +10,6 @@ struct dom_document_type; struct dom_resource_mgr; -struct dom_implementation; /* Create a DOM document type */ dom_exception _dom_document_type_create(struct dom_string *qname, @@ -67,7 +66,5 @@ dom_exception _dom_dt_copy(struct dom_node_internal *new, /* Helper functions */ void _dom_document_type_get_resource_mgr( struct dom_document_type *dt, struct dom_resource_mgr *rm); -struct dom_implementation *_dom_document_type_get_impl( - struct dom_document_type *dt); #endif diff --git a/src/core/implementation.c b/src/core/implementation.c index 6713060..4dc8cf3 100644 --- a/src/core/implementation.c +++ b/src/core/implementation.c @@ -5,56 +5,38 @@ * Copyright 2007 John-Mark Bell */ -#include #include -/** - * Claim a reference on a DOM implementation - * - * \param impl The implementation to claim a reference on - */ -void dom_implementation_ref(struct dom_implementation *impl) -{ - impl->refcnt++; -} +#include "core/document.h" +#include "core/document_type.h" -/** - * Release a reference from a DOM implementation - * - * \param impl The implementation to release the reference from - * - * If the reference count reaches zero, any memory claimed by the - * implementation will be released - */ -void dom_implementation_unref(struct dom_implementation *impl) -{ - if (--impl->refcnt == 0) { - impl->destroy(impl); - } -} +#include "utils/namespace.h" +#include "utils/utils.h" +#include "utils/validate.h" /** * Test whether a DOM implementation implements a specific feature * and version * - * \param impl The DOM implementation to query * \param feature The feature to test for * \param version The version number of the feature to test for * \param result Pointer to location to receive result * \return DOM_NO_ERR. */ dom_exception dom_implementation_has_feature( - struct dom_implementation *impl, struct dom_string *feature, struct dom_string *version, bool *result) { - return impl->has_feature(impl, feature, version, result); + UNUSED(feature); + UNUSED(version); + UNUSED(result); + + return DOM_NOT_SUPPORTED_ERR; } /** * Create a document type node * - * \param impl The implementation to create the node * \param qname The qualified name of the document type * \param public_id The external subset public identifier * \param system_id The external subset system identifier @@ -75,19 +57,44 @@ dom_exception dom_implementation_has_feature( * finished with it. */ dom_exception dom_implementation_create_document_type( - struct dom_implementation *impl, struct dom_string *qname, - struct dom_string *public_id, struct dom_string *system_id, + struct dom_string *qname, struct dom_string *public_id, + struct dom_string *system_id, dom_alloc alloc, void *pw, struct dom_document_type **doctype) { - return impl->create_document_type(impl, qname, public_id, system_id, - alloc, pw, doctype); + struct dom_document_type *d; + struct dom_string *prefix = NULL, *lname = NULL; + dom_exception err; + + if (qname != NULL && _dom_validate_name(qname) == false) + return DOM_INVALID_CHARACTER_ERR; + + err = _dom_namespace_split_qname(qname, &prefix, &lname); + if (err != DOM_NO_ERR) + return err; + + if ((prefix != NULL && _dom_validate_ncname(prefix) == false) || + (lname != NULL && _dom_validate_ncname(lname) == false)) + return DOM_NAMESPACE_ERR; + + /* Create the doctype */ + err = _dom_document_type_create(qname, public_id, system_id, + alloc, pw, &d); + if (err != DOM_NO_ERR) + return err; + + *doctype = d; + if (prefix != NULL) + dom_string_unref(prefix); + if (lname != NULL) + dom_string_unref(lname); + + return DOM_NO_ERR; } /** * Create a document node * - * \param impl The implementation to create the node * \param namespace The namespace URI of the document element * \param qname The qualified name of the document element * \param doctype The type of document to create @@ -118,22 +125,81 @@ dom_exception dom_implementation_create_document_type( * finished with it. */ dom_exception dom_implementation_create_document( - struct dom_implementation *impl, struct dom_string *namespace, struct dom_string *qname, struct dom_document_type *doctype, dom_alloc alloc, void *pw, dom_events_default_action_fetcher daf, struct dom_document **doc) { - return impl->create_document(impl, namespace, qname, doctype, alloc, - pw, daf, doc); + struct dom_document *d; + dom_exception err; + + if (qname != NULL && _dom_validate_name(qname) == false) + return DOM_INVALID_CHARACTER_ERR; + + err = _dom_namespace_validate_qname(qname, namespace); + if (err != DOM_NO_ERR) + return DOM_NAMESPACE_ERR; + + if (doctype != NULL && dom_node_get_parent(doctype) != NULL) + return DOM_WRONG_DOCUMENT_ERR; + + /* Create document object */ + err = _dom_document_create(alloc, pw, daf, &d); + if (err != DOM_NO_ERR) + return err; + + /* Set its doctype, if necessary */ + if (doctype != NULL) { + struct dom_node *ins_doctype = NULL; + + err = dom_node_append_child((struct dom_node *) d, + (struct dom_node *) doctype, &ins_doctype); + if (err != DOM_NO_ERR) { + dom_node_unref((struct dom_node *) d); + return err; + } + + /* Not interested in inserted doctype */ + if (ins_doctype != NULL) + dom_node_unref(ins_doctype); + } + + /* Create root element and attach it to document */ + if (qname != NULL) { + struct dom_element *e; + struct dom_node *inserted; + + err = dom_document_create_element_ns(d, namespace, qname, &e); + if (err != DOM_NO_ERR) { + dom_node_unref((struct dom_node *) d); + return err; + } + + err = dom_node_append_child((struct dom_node *) d, + (struct dom_node *) e, &inserted); + if (err != DOM_NO_ERR) { + dom_node_unref((struct dom_node *) e); + dom_node_unref((struct dom_node *) d); + return err; + } + + /* No longer interested in inserted node */ + dom_node_unref(inserted); + + /* Done with element */ + dom_node_unref((struct dom_node *) e); + } + + *doc = d; + + return DOM_NO_ERR; } /** * Retrieve a specialized object which implements the specified * feature and version * - * \param impl The implementation to create the object * \param feature The requested feature * \param version The version number of the feature * \param object Pointer to location to receive object @@ -143,9 +209,12 @@ dom_exception dom_implementation_create_document( * the provided memory (de)allocation function. */ dom_exception dom_implementation_get_feature( - struct dom_implementation *impl, struct dom_string *feature, struct dom_string *version, void **object) { - return impl->get_feature(impl, feature, version, object); + UNUSED(feature); + UNUSED(version); + UNUSED(object); + + return DOM_NOT_SUPPORTED_ERR; } diff --git a/src/core/impllist.c b/src/core/impllist.c deleted file mode 100644 index 2f25926..0000000 --- a/src/core/impllist.c +++ /dev/null @@ -1,97 +0,0 @@ -/* - * This file is part of libdom. - * Licensed under the MIT License, - * http://www.opensource.org/licenses/mit-license.php - * Copyright 2007 John-Mark Bell - */ - -#include -#include -#include - -extern void dom_implementation_list_destroy( - struct dom_implementation_list *list); - -/** - * Claim a reference on a DOM implementation list - * - * \param list The list to claim a reference on - */ -void dom_implementation_list_ref(struct dom_implementation_list *list) -{ - list->refcnt++; -} - -/** - * Release a reference from a DOM implementation list - * - * \param list The list to release the reference from - * - * If the reference count reaches zero, any memory claimed by the - * list will be released - */ -void dom_implementation_list_unref(struct dom_implementation_list *list) -{ - if (--list->refcnt == 0) { - dom_implementation_list_destroy(list); - } -} - -/** - * Retrieve the length of a DOM implementation list - * - * \param list The list to retrieve the length of - * \param length Pointer to location to receive result - * \return DOM_NO_ERR. - */ -dom_exception dom_implementation_list_get_length( - struct dom_implementation_list *list, unsigned long *length) -{ - unsigned long count = 0; - struct dom_implementation_list_item *i; - - for (i = list->head; i; i = i->next) - count++; - - *length = count; - - return DOM_NO_ERR; -} - -/** - * Retrieve an item by index from a DOM implementation list - * - * \param list The list to retrieve the item from - * \param index The list index to retrieve - * \param impl Pointer to location to receive result - * \return DOM_NO_ERR. - * - * ::index is a zero-based index into ::list. - * ::index lies in the range [0, length-1] - * - * The returned implementation will have had its reference count increased. - * The client should unref the implementation once it has finished with it. - */ -dom_exception dom_implementation_list_item( - struct dom_implementation_list *list, unsigned long index, - struct dom_implementation **impl) -{ - unsigned long idx = 0; - struct dom_implementation_list_item *i; - - for (i = list->head; i; i = i->next) { - if (idx == index) - break; - - idx++; - } - - if (i == NULL) { - *impl = NULL; - } else { - dom_implementation_ref(i->impl); - *impl = i->impl; - } - - return DOM_NO_ERR; -} diff --git a/src/core/node.c b/src/core/node.c index ef2baf2..d4007df 100644 --- a/src/core/node.c +++ b/src/core/node.c @@ -1295,15 +1295,11 @@ dom_exception _dom_node_is_supported(dom_node_internal *node, struct dom_string *feature, struct dom_string *version, bool *result) { - dom_document *doc; - dom_implementation *impl; bool has; - doc = node->owner; - assert(doc != NULL); - dom_document_get_implementation(doc, &impl); - assert(impl != NULL); - dom_implementation_has_feature(impl, feature, version, &has); + UNUSED(node); + + dom_implementation_has_feature(feature, version, &has); *result = has; @@ -1792,15 +1788,11 @@ dom_exception _dom_node_get_feature(dom_node_internal *node, struct dom_string *feature, struct dom_string *version, void **result) { - dom_document *doc; - dom_implementation *impl; bool has; - doc = node->owner; - assert(doc != NULL); - dom_document_get_implementation(doc, &impl); - assert(impl != NULL); - dom_implementation_has_feature(impl, feature, version, &has); + UNUSED(node); + + dom_implementation_has_feature(feature, version, &has); if (has) { *result = node; diff --git a/src/dom.c b/src/dom.c new file mode 100644 index 0000000..b163d28 --- /dev/null +++ b/src/dom.c @@ -0,0 +1,69 @@ +/* + * This file is part of libdom. + * Licensed under the MIT License, + * http://www.opensource.org/licenses/mit-license.php + * Copyright 2007 John-Mark Bell + */ + +#include + +#include + +#include "utils/namespace.h" + +static bool __initialised; + +/** + * Initialise the dom library + * + * \param alloc Pointer to memory (de)allocation function + * \param pw Pointer to client-specific private data + * \return DOM_NO_ERR on success. + * + * This must be the first DOM library method called. + */ +dom_exception dom_initialise(dom_alloc alloc, void *pw) +{ + dom_exception err; + + /* Ensure we only initialise once */ + if (__initialised) { + return DOM_NO_ERR; + } + + err = _dom_namespace_initialise(alloc, pw); + if (err != DOM_NO_ERR) { + return err; + } + + __initialised = true; + + return DOM_NO_ERR; +} + +/** + * Finalise the dom library + * + * \return DOM_NO_ERR on success. + * + * This must be the last DOM library method called. + */ +dom_exception dom_finalise(void) +{ + dom_exception err; + + /* Ensure we only finalise once */ + if (__initialised == false) { + return DOM_NO_ERR; + } + + err = _dom_namespace_finalise(); + if (err != DOM_NO_ERR) { + return err; + } + + __initialised = false; + + return DOM_NO_ERR; +} + -- cgit v1.2.3