From d7a5427346460567042f11460c0ffd24ae50eb51 Mon Sep 17 00:00:00 2001 From: Bo Yang Date: Sun, 15 Mar 2009 13:38:51 +0000 Subject: Convert the dom_characterdata to use vtable. svn path=/trunk/dom/; revision=6787 --- include/dom/core/characterdata.h | 131 ++++++++++++++++++++++++++++++++++----- src/core/attr.h | 2 +- src/core/characterdata.c | 58 ++++++++++++----- src/core/characterdata.h | 37 ++++++++++- src/core/node.c | 2 +- src/core/node.h | 2 +- 6 files changed, 193 insertions(+), 39 deletions(-) diff --git a/include/dom/core/characterdata.h b/include/dom/core/characterdata.h index 2ed4ddc..e65cb96 100644 --- a/include/dom/core/characterdata.h +++ b/include/dom/core/characterdata.h @@ -9,27 +9,124 @@ #define dom_core_characterdata_h_ #include +#include struct dom_characterdata; struct dom_string; -dom_exception dom_characterdata_get_data(struct dom_characterdata *cdata, - struct dom_string **data); -dom_exception dom_characterdata_set_data(struct dom_characterdata *cdata, - struct dom_string *data); -dom_exception dom_characterdata_get_length(struct dom_characterdata *cdata, - unsigned long *length); -dom_exception dom_characterdata_substring_data( +/* The vtable for characterdata */ +typedef struct dom_characterdata_vtable { + struct dom_node_vtable base; + + dom_exception (*dom_characterdata_get_data)( + struct dom_characterdata *cdata, + struct dom_string **data); + dom_exception (*dom_characterdata_set_data)( + struct dom_characterdata *cdata, + struct dom_string *data); + dom_exception (*dom_characterdata_get_length)( + struct dom_characterdata *cdata, + unsigned long *length); + dom_exception (*dom_characterdata_substring_data)( + struct dom_characterdata *cdata, unsigned long offset, + unsigned long count, struct dom_string **data); + dom_exception (*dom_characterdata_append_data)( + struct dom_characterdata *cdata, + struct dom_string *data); + dom_exception (*dom_characterdata_insert_data)( + struct dom_characterdata *cdata, + unsigned long offset, struct dom_string *data); + dom_exception (*dom_characterdata_delete_data)( + struct dom_characterdata *cdata, + unsigned long offset, unsigned long count); + dom_exception (*dom_characterdata_replace_data)( + struct dom_characterdata *cdata, unsigned long offset, + unsigned long count, struct dom_string *data); +} dom_characterdata_vtable; + + +static inline dom_exception dom_characterdata_get_data( + struct dom_characterdata *cdata, struct dom_string **data) +{ + return ((dom_characterdata_vtable *) ((dom_node *) cdata)->vtable)-> + dom_characterdata_get_data(cdata, data); +} +#define dom_characterdata_get_data(c, d) dom_characterdata_get_data( \ + (struct dom_characterdata *) (c), (struct dom_string **) (d)) + +static inline dom_exception dom_characterdata_set_data( + struct dom_characterdata *cdata, struct dom_string *data) +{ + return ((dom_characterdata_vtable *) ((dom_node *) cdata)->vtable)-> + dom_characterdata_set_data(cdata, data); +} +#define dom_characterdata_set_data(c, d) dom_characterdata_set_data( \ + (struct dom_characterdata *) (c), (struct dom_string **) (d)) + +static inline dom_exception dom_characterdata_get_length( + struct dom_characterdata *cdata, unsigned long *length) +{ + return ((dom_characterdata_vtable *) ((dom_node *) cdata)->vtable)-> + dom_characterdata_get_length(cdata, length); +} +#define dom_characterdata_get_length(c, l) dom_characterdata_get_length( \ + (struct dom_characterdata *) (c), (unsigned long *) (l)) + +static inline dom_exception dom_characterdata_substring_data( struct dom_characterdata *cdata, unsigned long offset, - unsigned long count, struct dom_string **data); -dom_exception dom_characterdata_append_data(struct dom_characterdata *cdata, - struct dom_string *data); -dom_exception dom_characterdata_insert_data(struct dom_characterdata *cdata, - unsigned long offset, struct dom_string *data); -dom_exception dom_characterdata_delete_data(struct dom_characterdata *cdata, - unsigned long offset, unsigned long count); -dom_exception dom_characterdata_replace_data(struct dom_characterdata *cdata, - unsigned long offset, unsigned long count, - struct dom_string *data); + unsigned long count, struct dom_string **data) +{ + return ((dom_characterdata_vtable *) ((dom_node *) cdata)->vtable)-> + dom_characterdata_substring_data(cdata, offset, count, + data); +} +#define dom_characterdata_substring_data(c, o, ct, d) \ + dom_characterdata_substring_data( \ + (struct dom_characterdata *) (c), (unsigned long) (o), \ + (unsigned long) (ct), (struct dom_string **) (d)) + +static inline dom_exception dom_characterdata_append_data( + struct dom_characterdata *cdata, struct dom_string *data) +{ + return ((dom_characterdata_vtable *) ((dom_node *) cdata)->vtable)-> + dom_characterdata_append_data(cdata, data); +} +#define dom_characterdata_append_data(c, d) dom_characterdata_append_data( \ + (struct dom_characterdata *) (c), (struct dom_string **) (d)) + +static inline dom_exception dom_characterdata_insert_data( + struct dom_characterdata *cdata, unsigned long offset, + struct dom_string *data) +{ + return ((dom_characterdata_vtable *) ((dom_node *) cdata)->vtable)-> + dom_characterdata_insert_data(cdata, offset, data); +} +#define dom_characterdata_insert_data(c, o, d) dom_characterdata_insert_data( \ + (struct dom_characterdata *) (c), (unsigned long) (o), \ + (struct dom_string **) (d)) + +static inline dom_exception dom_characterdata_delete_data( + struct dom_characterdata *cdata, unsigned long offset, + unsigned long count) +{ + return ((dom_characterdata_vtable *) ((dom_node *) cdata)->vtable)-> + dom_characterdata_delete_data(cdata, offset, count); +} +#define dom_characterdata_delete_data(c, o, ct) dom_characterdata_delete_data( \ + (struct dom_characterdata *) (c), (unsigned long) (o), \ + (unsigned long) (ct)) + +static inline dom_exception dom_characterdata_replace_data( + struct dom_characterdata *cdata, unsigned long offset, + unsigned long count, struct dom_string *data) +{ + return ((dom_characterdata_vtable *) ((dom_node *) cdata)->vtable)-> + dom_characterdata_replace_data(cdata, offset, count, + data); +} +#define dom_characterdata_replace_data(c, o, ct, d) \ + dom_characterdata_replace_data((struct dom_characterdata *) (c),\ + (unsigned long) (o), (unsigned long) (ct), \ + (struct dom_string *) (d)) #endif diff --git a/src/core/attr.h b/src/core/attr.h index 4106dbe..11b2528 100644 --- a/src/core/attr.h +++ b/src/core/attr.h @@ -11,8 +11,8 @@ #include struct dom_document; -struct dom_attr; struct dom_string; +typedef struct dom_attr dom_attr; dom_exception dom_attr_create(struct dom_document *doc, struct dom_string *name, struct dom_string *namespace, diff --git a/src/core/characterdata.c b/src/core/characterdata.c index 317dfd2..558eb45 100644 --- a/src/core/characterdata.c +++ b/src/core/characterdata.c @@ -13,6 +13,32 @@ #include "core/node.h" #include "utils/utils.h" +/* The virtual functions for dom_characterdata */ +static struct dom_characterdata_vtable characterdata_vtable = { + { + DOM_NODE_VTABLE + }, + DOM_CHARACTERDATA_VTABLE +}; + +/** + * Create a DOM characterdata node and compose the vtable + * + * Return The new constructed DOM characterdata node of NULL if fail + */ +dom_characterdata *dom_characterdata_create(struct dom_document *doc) +{ + dom_characterdata *cdata = dom_document_alloc(doc, NULL, + sizeof(struct dom_characterdata)); + + if (cdata == NULL) + return NULL; + + /* Some unused variable will cause a failed compile */ + UNUSED(characterdata_vtable); + return cdata; +} + /** * Initialise a character data node * @@ -61,10 +87,10 @@ void dom_characterdata_finalise(struct dom_document *doc, * DOM3Core states that this can raise DOMSTRING_SIZE_ERR. It will not in * this implementation; dom_strings are unbounded. */ -dom_exception dom_characterdata_get_data(struct dom_characterdata *cdata, +dom_exception _dom_characterdata_get_data(struct dom_characterdata *cdata, struct dom_string **data) { - struct dom_node *c = (struct dom_node *) cdata; + struct dom_node_internal *c = (struct dom_node_internal *) cdata; if (c->value != NULL) { dom_string_ref(c->value); @@ -86,10 +112,10 @@ dom_exception dom_characterdata_get_data(struct dom_characterdata *cdata, * should unref it after the call (as the caller should have already claimed * a reference on the string). The node's existing content will be unrefed. */ -dom_exception dom_characterdata_set_data(struct dom_characterdata *cdata, +dom_exception _dom_characterdata_set_data(struct dom_characterdata *cdata, struct dom_string *data) { - struct dom_node *c = (struct dom_node *) cdata; + struct dom_node_internal *c = (struct dom_node_internal *) cdata; if (_dom_node_readonly(c)) { return DOM_NO_MODIFICATION_ALLOWED_ERR; @@ -112,10 +138,10 @@ dom_exception dom_characterdata_set_data(struct dom_characterdata *cdata, * \param length Pointer to location to receive character length of content * \return DOM_NO_ERR. */ -dom_exception dom_characterdata_get_length(struct dom_characterdata *cdata, +dom_exception _dom_characterdata_get_length(struct dom_characterdata *cdata, unsigned long *length) { - struct dom_node *c = (struct dom_node *) cdata; + struct dom_node_internal *c = (struct dom_node_internal *) cdata; if (c->value != NULL) { *length = dom_string_length(c->value); @@ -144,11 +170,11 @@ dom_exception dom_characterdata_get_length(struct dom_characterdata *cdata, * DOM3Core states that this can raise DOMSTRING_SIZE_ERR. It will not in * this implementation; dom_strings are unbounded. */ -dom_exception dom_characterdata_substring_data( +dom_exception _dom_characterdata_substring_data( struct dom_characterdata *cdata, unsigned long offset, unsigned long count, struct dom_string **data) { - struct dom_node *c = (struct dom_node *) cdata; + struct dom_node_internal *c = (struct dom_node_internal *) cdata; uint32_t len, end; if (c->value != NULL) { @@ -174,10 +200,10 @@ dom_exception dom_characterdata_substring_data( * \return DOM_NO_ERR on success, * DOM_NO_MODIFICATION_ALLOWED_ERR if ::cdata is readonly. */ -dom_exception dom_characterdata_append_data(struct dom_characterdata *cdata, +dom_exception _dom_characterdata_append_data(struct dom_characterdata *cdata, struct dom_string *data) { - struct dom_node *c = (struct dom_node *) cdata; + struct dom_node_internal *c = (struct dom_node_internal *) cdata; struct dom_string *temp; dom_exception err; @@ -212,10 +238,10 @@ dom_exception dom_characterdata_append_data(struct dom_characterdata *cdata, * number of characters in ::cdata, * DOM_NO_MODIFICATION_ALLOWED_ERR if ::cdata is readonly. */ -dom_exception dom_characterdata_insert_data(struct dom_characterdata *cdata, +dom_exception _dom_characterdata_insert_data(struct dom_characterdata *cdata, unsigned long offset, struct dom_string *data) { - struct dom_node *c = (struct dom_node *) cdata; + struct dom_node_internal *c = (struct dom_node_internal *) cdata; struct dom_string *temp; uint32_t len; dom_exception err; @@ -259,10 +285,10 @@ dom_exception dom_characterdata_insert_data(struct dom_characterdata *cdata, * number of characters in ::cdata, * DOM_NO_MODIFICATION_ALLOWED_ERR if ::cdata is readonly. */ -dom_exception dom_characterdata_delete_data(struct dom_characterdata *cdata, +dom_exception _dom_characterdata_delete_data(struct dom_characterdata *cdata, unsigned long offset, unsigned long count) { - struct dom_node *c = (struct dom_node *) cdata; + struct dom_node_internal *c = (struct dom_node_internal *) cdata; struct dom_string *temp; uint32_t len, end; dom_exception err; @@ -309,11 +335,11 @@ dom_exception dom_characterdata_delete_data(struct dom_characterdata *cdata, * number of characters in ::cdata, * DOM_NO_MODIFICATION_ALLOWED_ERR if ::cdata is readonly. */ -dom_exception dom_characterdata_replace_data(struct dom_characterdata *cdata, +dom_exception _dom_characterdata_replace_data(struct dom_characterdata *cdata, unsigned long offset, unsigned long count, struct dom_string *data) { - struct dom_node *c = (struct dom_node *) cdata; + struct dom_node_internal *c = (struct dom_node_internal *) cdata; struct dom_string *temp; uint32_t len, end; dom_exception err; diff --git a/src/core/characterdata.h b/src/core/characterdata.h index e8b45fd..901b110 100644 --- a/src/core/characterdata.h +++ b/src/core/characterdata.h @@ -15,10 +15,11 @@ /** * DOM character data node */ -struct dom_characterdata { - struct dom_node base; /**< Base node */ -}; +typedef struct dom_characterdata { + struct dom_node_internal base; /**< Base node */ +} dom_characterdata; +dom_characterdata *dom_characterdata_create(struct dom_document *doc); dom_exception dom_characterdata_initialise(struct dom_characterdata *cdata, struct dom_document *doc, dom_node_type type, struct dom_string *name, struct dom_string *value); @@ -26,4 +27,34 @@ dom_exception dom_characterdata_initialise(struct dom_characterdata *cdata, void dom_characterdata_finalise(struct dom_document *doc, struct dom_characterdata *cdata); +/* The virtual functions for characterdata */ +dom_exception _dom_characterdata_get_data(struct dom_characterdata *cdata, + struct dom_string **data); +dom_exception _dom_characterdata_set_data(struct dom_characterdata *cdata, + struct dom_string *data); +dom_exception _dom_characterdata_get_length(struct dom_characterdata *cdata, + unsigned long *length); +dom_exception _dom_characterdata_substring_data( + struct dom_characterdata *cdata, unsigned long offset, + unsigned long count, struct dom_string **data); +dom_exception _dom_characterdata_append_data(struct dom_characterdata *cdata, + struct dom_string *data); +dom_exception _dom_characterdata_insert_data(struct dom_characterdata *cdata, + unsigned long offset, struct dom_string *data); +dom_exception _dom_characterdata_delete_data(struct dom_characterdata *cdata, + unsigned long offset, unsigned long count); +dom_exception _dom_characterdata_replace_data(struct dom_characterdata *cdata, + unsigned long offset, unsigned long count, + struct dom_string *data); + +#define DOM_CHARACTERDATA_VTABLE \ + _dom_characterdata_get_data, \ + _dom_characterdata_set_data, \ + _dom_characterdata_get_length, \ + _dom_characterdata_substring_data, \ + _dom_characterdata_append_data, \ + _dom_characterdata_insert_data, \ + _dom_characterdata_delete_data, \ + _dom_characterdata_replace_data + #endif diff --git a/src/core/node.c b/src/core/node.c index 0b0c4a6..f40431e 100644 --- a/src/core/node.c +++ b/src/core/node.c @@ -53,7 +53,7 @@ static struct dom_node_vtable node_vtable = { * * Return The new constructed DOM node or NULL if fail. */ -dom_node_internal * dom_node_create() +dom_node_internal * dom_node_create(struct dom_document *doc) { dom_node_internal *node = dom_document_alloc(doc, NULL, sizeof(struct dom_node_internal)); diff --git a/src/core/node.h b/src/core/node.h index e37a012..27c9f35 100644 --- a/src/core/node.h +++ b/src/core/node.h @@ -56,7 +56,7 @@ struct dom_node_internal { uint32_t refcnt; /**< Reference count */ }; -dom_node_internal * dom_node_create(dom_alloc alloc, void *pw); +dom_node_internal * dom_node_create(struct dom_document *doc); dom_exception dom_node_initialise(struct dom_node_internal *node, struct dom_document *doc, dom_node_type type, -- cgit v1.2.3