summaryrefslogtreecommitdiff
path: root/src/core/characterdata.c
diff options
context:
space:
mode:
authorJohn Mark Bell <jmb@netsurf-browser.org>2007-11-03 21:18:02 +0000
committerJohn Mark Bell <jmb@netsurf-browser.org>2007-11-03 21:18:02 +0000
commitd4d0364f52a658469fea937e87c6317ec21644c0 (patch)
treeb1790306d273670edcddcf7cad0afd29e6b81354 /src/core/characterdata.c
parente41d0a993986cf63ea3b3129effd62d2afade6b1 (diff)
downloadlibdom-d4d0364f52a658469fea937e87c6317ec21644c0.tar.gz
libdom-d4d0364f52a658469fea937e87c6317ec21644c0.tar.bz2
Add, and implement, dom_string_insert() and dom_string_replace() API
Fix dom_string_substr() to have correct length limits when calling _dom_utf{8,16}_next() Fix dom_string_substr() to calculate correct length of output string when creating from ptr Implement dom_characterdata_get_length() Implement dom_characterdata_substring_data() Implement dom_characterdata_append_data() Implement dom_characterdata_insert_data() Implement dom_characterdata_delete_data() Implement dom_characterdata_replace_data() svn path=/trunk/dom/; revision=3641
Diffstat (limited to 'src/core/characterdata.c')
-rw-r--r--src/core/characterdata.c162
1 files changed, 138 insertions, 24 deletions
diff --git a/src/core/characterdata.c b/src/core/characterdata.c
index 88aaff2..317dfd2 100644
--- a/src/core/characterdata.c
+++ b/src/core/characterdata.c
@@ -115,10 +115,15 @@ dom_exception dom_characterdata_set_data(struct dom_characterdata *cdata,
dom_exception dom_characterdata_get_length(struct dom_characterdata *cdata,
unsigned long *length)
{
- UNUSED(cdata);
- UNUSED(length);
+ struct dom_node *c = (struct dom_node *) cdata;
+
+ if (c->value != NULL) {
+ *length = dom_string_length(c->value);
+ } else {
+ *length = 0;
+ }
- return DOM_NOT_SUPPORTED_ERR;
+ return DOM_NO_ERR;
}
/**
@@ -143,12 +148,22 @@ dom_exception dom_characterdata_substring_data(
struct dom_characterdata *cdata, unsigned long offset,
unsigned long count, struct dom_string **data)
{
- UNUSED(cdata);
- UNUSED(offset);
- UNUSED(count);
- UNUSED(data);
+ struct dom_node *c = (struct dom_node *) cdata;
+ uint32_t len, end;
+
+ if (c->value != NULL) {
+ len = dom_string_length(c->value);
+ } else {
+ len = 0;
+ }
+
+ if (offset >= len) {
+ return DOM_INDEX_SIZE_ERR;
+ }
- return DOM_NOT_SUPPORTED_ERR;
+ end = (offset + count) >= len ? len : offset + count;
+
+ return dom_string_substr(c->value, offset, end, data);
}
/**
@@ -162,10 +177,28 @@ dom_exception dom_characterdata_substring_data(
dom_exception dom_characterdata_append_data(struct dom_characterdata *cdata,
struct dom_string *data)
{
- UNUSED(cdata);
- UNUSED(data);
+ struct dom_node *c = (struct dom_node *) cdata;
+ struct dom_string *temp;
+ dom_exception err;
+
+ if (_dom_node_readonly(c)) {
+ return DOM_NO_MODIFICATION_ALLOWED_ERR;
+ }
+
+ err = dom_string_insert(c->value, data,
+ c->value != NULL ? dom_string_length(c->value) : 0,
+ &temp);
+ if (err != DOM_NO_ERR) {
+ return err;
+ }
- return DOM_NOT_SUPPORTED_ERR;
+ if (c->value != NULL) {
+ dom_string_unref(c->value);
+ }
+
+ c->value = temp;
+
+ return DOM_NO_ERR;
}
/**
@@ -182,11 +215,37 @@ dom_exception dom_characterdata_append_data(struct dom_characterdata *cdata,
dom_exception dom_characterdata_insert_data(struct dom_characterdata *cdata,
unsigned long offset, struct dom_string *data)
{
- UNUSED(cdata);
- UNUSED(offset);
- UNUSED(data);
+ struct dom_node *c = (struct dom_node *) cdata;
+ struct dom_string *temp;
+ uint32_t len;
+ dom_exception err;
+
+ if (_dom_node_readonly(c)) {
+ return DOM_NO_MODIFICATION_ALLOWED_ERR;
+ }
+
+ if (c->value != NULL) {
+ len = dom_string_length(c->value);
+ } else {
+ len = 0;
+ }
+
+ if (offset >= len) {
+ return DOM_INDEX_SIZE_ERR;
+ }
+
+ err = dom_string_insert(c->value, data, offset, &temp);
+ if (err != DOM_NO_ERR) {
+ return err;
+ }
+
+ if (c->value != NULL) {
+ dom_string_unref(c->value);
+ }
- return DOM_NOT_SUPPORTED_ERR;
+ c->value = temp;
+
+ return DOM_NO_ERR;
}
/**
@@ -203,11 +262,39 @@ dom_exception dom_characterdata_insert_data(struct dom_characterdata *cdata,
dom_exception dom_characterdata_delete_data(struct dom_characterdata *cdata,
unsigned long offset, unsigned long count)
{
- UNUSED(cdata);
- UNUSED(offset);
- UNUSED(count);
+ struct dom_node *c = (struct dom_node *) cdata;
+ struct dom_string *temp;
+ uint32_t len, end;
+ dom_exception err;
+
+ if (_dom_node_readonly(c)) {
+ return DOM_NO_MODIFICATION_ALLOWED_ERR;
+ }
+
+ if (c->value != NULL) {
+ len = dom_string_length(c->value);
+ } else {
+ len = 0;
+ }
+
+ if (offset >= len) {
+ return DOM_INDEX_SIZE_ERR;
+ }
+
+ end = (offset + count) >= len ? len : offset + count;
+
+ err = dom_string_replace(c->value, NULL, offset, end, &temp);
+ if (err != DOM_NO_ERR) {
+ return err;
+ }
+
+ if (c->value != NULL) {
+ dom_string_unref(c->value);
+ }
+
+ c->value = temp;
- return DOM_NOT_SUPPORTED_ERR;
+ return DOM_NO_ERR;
}
/**
@@ -226,11 +313,38 @@ dom_exception dom_characterdata_replace_data(struct dom_characterdata *cdata,
unsigned long offset, unsigned long count,
struct dom_string *data)
{
- UNUSED(cdata);
- UNUSED(offset);
- UNUSED(count);
- UNUSED(data);
+ struct dom_node *c = (struct dom_node *) cdata;
+ struct dom_string *temp;
+ uint32_t len, end;
+ dom_exception err;
+
+ if (_dom_node_readonly(c)) {
+ return DOM_NO_MODIFICATION_ALLOWED_ERR;
+ }
+
+ if (c->value != NULL) {
+ len = dom_string_length(c->value);
+ } else {
+ len = 0;
+ }
+
+ if (offset >= len) {
+ return DOM_INDEX_SIZE_ERR;
+ }
+
+ end = (offset + count) >= len ? len : offset + count;
+
+ err = dom_string_replace(c->value, data, offset, end, &temp);
+ if (err != DOM_NO_ERR) {
+ return err;
+ }
+
+ if (c->value != NULL) {
+ dom_string_unref(c->value);
+ }
- return DOM_NOT_SUPPORTED_ERR;
+ c->value = temp;
+
+ return DOM_NO_ERR;
}