diff options
-rw-r--r-- | ext/dom/characterdata.c | 41 | ||||
-rw-r--r-- | ext/dom/php_dom.c | 12 | ||||
-rw-r--r-- | ext/dom/xpath.c | 2 |
3 files changed, 27 insertions, 28 deletions
diff --git a/ext/dom/characterdata.c b/ext/dom/characterdata.c index 17b8faa5c7..6dd367bbed 100644 --- a/ext/dom/characterdata.c +++ b/ext/dom/characterdata.c @@ -80,20 +80,6 @@ int dom_characterdata_data_write(dom_object *obj, zval *newval TSRMLS_DC) /* }}} */ - -long dom_utf16Length (xmlChar *utf8str) { - long len = 0L, i; - char c; - - for (i = 0L; (c = utf8str[i]) != '\0'; i++) - if ((c & 0xf8) == 0xf0) - len += 2L; - else if ((c & 0xc0) != 0x80) - len++; - - return len; -} - /* {{{ proto length unsigned long readonly=yes URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-7D61178C @@ -110,7 +96,8 @@ int dom_characterdata_length_read(dom_object *obj, zval **retval TSRMLS_DC) ALLOC_ZVAL(*retval); content = xmlNodeGetContent(nodep); - length = dom_utf16Length(content); + length = xmlUTF8Strlen(content); + xmlFree(content); ZVAL_LONG(*retval, length); @@ -146,7 +133,7 @@ PHP_FUNCTION(dom_characterdata_substring_data) RETURN_FALSE; } - length = xmlStrlen(cur); + length = xmlUTF8Strlen(cur); if (offset < 0 || count < 0 || offset > length) { xmlFree(cur); @@ -158,7 +145,7 @@ PHP_FUNCTION(dom_characterdata_substring_data) count = length - offset; } - substring = xmlStrsub(cur, offset, count); + substring = xmlUTF8Strsub(cur, offset, count); xmlFree(cur); if (substring) { @@ -221,7 +208,7 @@ PHP_FUNCTION(dom_characterdata_insert_data) RETURN_FALSE; } - length = xmlStrlen(cur); + length = xmlUTF8Strlen(cur); if (offset < 0 || offset > length) { xmlFree(cur); @@ -229,8 +216,8 @@ PHP_FUNCTION(dom_characterdata_insert_data) RETURN_FALSE; } - first = xmlStrndup(cur, offset); - second = xmlStrdup(cur + offset); + first = xmlUTF8Strndup(cur, offset); + second = xmlUTF8Strsub(cur, offset, length - offset); xmlFree(cur); xmlNodeSetContent(node, first); @@ -268,7 +255,7 @@ PHP_FUNCTION(dom_characterdata_delete_data) RETURN_FALSE; } - length = xmlStrlen(cur); + length = xmlUTF8Strlen(cur); if (offset < 0 || count < 0 || offset > length) { xmlFree(cur); @@ -277,7 +264,7 @@ PHP_FUNCTION(dom_characterdata_delete_data) } if (offset > 0) { - substring = xmlStrsub(cur, 0, offset); + substring = xmlUTF8Strsub(cur, 0, offset); } else { substring = NULL; } @@ -286,7 +273,7 @@ PHP_FUNCTION(dom_characterdata_delete_data) count = length - offset; } - second = xmlStrdup(cur + offset + count); + second = xmlUTF8Strsub(cur, offset + count, length - offset); substring = xmlStrcat(substring, second); xmlNodeSetContent(node, substring); @@ -324,7 +311,7 @@ PHP_FUNCTION(dom_characterdata_replace_data) RETURN_FALSE; } - length = xmlStrlen(cur); + length = xmlUTF8Strlen(cur); if (offset < 0 || count < 0 || offset > length) { xmlFree(cur); @@ -333,17 +320,17 @@ PHP_FUNCTION(dom_characterdata_replace_data) } if (offset > 0) { - substring = xmlStrsub(cur, 0, offset); + substring = xmlUTF8Strsub(cur, 0, offset); } else { substring = NULL; } if ((offset + count) > length) { - count = 0; + count = length - offset; } if (offset < length) { - second = xmlStrdup(cur + offset + count); + second = xmlUTF8Strsub(cur, offset + count, length - offset); } substring = xmlStrcat(substring, arg); diff --git a/ext/dom/php_dom.c b/ext/dom/php_dom.c index 6654ac5946..a6bb8e4659 100644 --- a/ext/dom/php_dom.c +++ b/ext/dom/php_dom.c @@ -405,6 +405,17 @@ void dom_write_property(zval *object, zval *member, zval *value TSRMLS_DC) } /* }}} */ +static zval **dom_property_get_ptr(zval *object, zval *member TSRMLS_DC) +{ + zval **prop_ptr; + zval *property; + + property = dom_read_property(object, member, 0 TSRMLS_CC); + prop_ptr = &property; + + return prop_ptr; +} + zend_module_entry dom_module_entry = { STANDARD_MODULE_HEADER, "dom", @@ -430,6 +441,7 @@ PHP_MINIT_FUNCTION(dom) memcpy(&dom_object_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers)); dom_object_handlers.read_property = dom_read_property; dom_object_handlers.write_property = dom_write_property; + dom_object_handlers.get_property_ptr = dom_property_get_ptr; zend_hash_init(&classes, 0, NULL, NULL, 1); diff --git a/ext/dom/xpath.c b/ext/dom/xpath.c index 0709be3823..90fcda2e64 100644 --- a/ext/dom/xpath.c +++ b/ext/dom/xpath.c @@ -169,7 +169,7 @@ PHP_FUNCTION(dom_xpath_query) nodep = xmlDocGetRootElement(docp); } - if (docp != nodep->doc) { + if (nodep && docp != nodep->doc) { php_error(E_WARNING, "Node From Wrong Document"); RETURN_FALSE; } |