tmp_zv = *member;
zval_copy_ctor(&tmp_zv);
member = &tmp_zv;
- convert_to_string(member);
+ convert_to_string_with_converter(member, UG(utf8_conv));
}
name = Z_STRVAL_P(member);
}
zval_copy_ctor(&value_copy);
value = &value_copy;
}
- convert_to_string(value);
+ convert_to_string_with_converter(value, UG(utf8_conv));
/* break missing intentionally */
case IS_STRING:
xmlNodeSetContentLen(node, (xmlChar *)Z_STRVAL_P(value), Z_STRLEN_P(value));
if (Z_TYPE_P(member) != IS_STRING) {
trim_zv = *member;
zval_copy_ctor(&trim_zv);
- convert_to_string(&trim_zv);
+ convert_to_string_with_converter(&trim_zv, UG(utf8_conv));
php_trim(Z_STRVAL(trim_zv), Z_STRLEN(trim_zv), NULL, 0, IS_STRING, &tmp_zv, 3 TSRMLS_CC);
zval_dtor(&trim_zv);
member = &tmp_zv;
zval_copy_ctor(&value_copy);
value = &value_copy;
}
- convert_to_string(value);
+ convert_to_string_with_converter(value, UG(utf8_conv));
break;
case IS_STRING:
break;
sxe = php_sxe_fetch_object(object TSRMLS_CC);
GET_NODE(sxe, node);
- convert_to_string(member);
+ convert_to_string_with_converter(member, UG(utf8_conv));
+
name = Z_STRVAL_P(member);
node = sxe_get_element_by_name(sxe, node, &name, &type TSRMLS_CC);
if (!node) {
tmp_zv = *member;
zval_copy_ctor(&tmp_zv);
member = &tmp_zv;
- convert_to_string(member);
+ convert_to_string_with_converter(member, UG(utf8_conv));
}
sxe = php_sxe_fetch_object(object TSRMLS_CC);
tmp_zv = *member;
zval_copy_ctor(&tmp_zv);
member = &tmp_zv;
- convert_to_string(member);
+ convert_to_string_with_converter(member, UG(utf8_conv));
}
sxe = php_sxe_fetch_object(object TSRMLS_CC);
if (node->children && node->children->type == XML_TEXT_NODE && !xmlIsBlankNode(node->children)) {
contents = xmlNodeListGetString(node->doc, node->children, 1);
if (contents) {
- ZVAL_U_STRING(ZEND_U_CONVERTER(UG(runtime_encoding_conv)), *value, (char *)contents, 1);
+ ZVAL_XML_STRING(*value, (char *)contents, ZSTR_DUPLICATE);
xmlFree(contents);
}
} else {
xmlChar *tmp;
MAKE_STD_ZVAL(value);
- ZVAL_U_STRING(ZEND_U_CONVERTER(UG(runtime_encoding_conv)), value, tmp = xmlNodeListGetString((xmlDocPtr) sxe->document->ptr, attr->children, 1), 1);
+ tmp = xmlNodeListGetString((xmlDocPtr) sxe->document->ptr, attr->children, 1);
+ ZVAL_XML_STRING(value, (char *)tmp, ZSTR_DUPLICATE);
xmlFree(tmp);
namelen = xmlStrlen(attr->name) + 1;
if (!zattr) {
xmlChar *tmp;
MAKE_STD_ZVAL(value);
- ZVAL_U_STRING(ZEND_U_CONVERTER(UG(runtime_encoding_conv)), value, tmp = xmlNodeListGetString(node->doc, node->children, 1), 1);
+ tmp = xmlNodeListGetString(node->doc, node->children, 1);
+ ZVAL_XML_STRING(value, (char *)tmp, ZSTR_DUPLICATE);
xmlFree(tmp);
zend_hash_next_index_insert(rv, &value, sizeof(zval *), NULL);
node = NULL;
xmlChar *tmp;
MAKE_STD_ZVAL(value);
- ZVAL_U_STRING(ZEND_U_CONVERTER(UG(runtime_encoding_conv)), value, tmp = xmlNodeListGetString(node->doc, node, 1), 1);
+ tmp = xmlNodeListGetString(node->doc, node, 1);
+ ZVAL_XML_STRING(value, (char *)tmp, ZSTR_DUPLICATE);
xmlFree(tmp);
zend_hash_next_index_insert(rv, &value, sizeof(zval *), NULL);
goto next_iter;
}
/* }}} */
-/* {{{ proto array SimpleXMLElement::xpath(string path)
+/* {{{ proto array SimpleXMLElement::xpath(string path) U
Runs XPath query on the XML data */
SXE_METHOD(xpath)
{
xmlNodeSetPtr result;
xmlNodePtr nodeptr;
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &query, &query_len) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s&", &query, &query_len, UG(utf8_conv)) == FAILURE) {
return;
}
if (nodeptr->type == XML_TEXT_NODE) {
_node_as_zval(sxe, nodeptr->parent, value, SXE_ITER_NONE, NULL, NULL, 0 TSRMLS_CC);
} else if (nodeptr->type == XML_ATTRIBUTE_NODE) {
- _node_as_zval(sxe, nodeptr->parent, value, SXE_ITER_ATTRLIST, (char*)nodeptr->name, NULL, 0 TSRMLS_CC);
+ _node_as_zval(sxe, nodeptr->parent, value, SXE_ITER_ATTRLIST, (char *)nodeptr->name, NULL, 0 TSRMLS_CC);
} else {
_node_as_zval(sxe, nodeptr, value, SXE_ITER_NONE, NULL, NULL, 0 TSRMLS_CC);
}
xmlXPathFreeObject(retval);
}
-/* {{{ proto bool SimpleXMLElement::registerXPathNamespace(string prefix, string ns)
+/* {{{ proto bool SimpleXMLElement::registerXPathNamespace(string prefix, string ns) U
Creates a prefix/ns context for the next XPath query */
SXE_METHOD(registerXPathNamespace)
{
int prefix_len, ns_uri_len;
char *prefix, *ns_uri;
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &prefix, &prefix_len, &ns_uri, &ns_uri_len) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s&s&", &prefix, &prefix_len, UG(utf8_conv), &ns_uri, &ns_uri_len, UG(utf8_conv)) == FAILURE) {
return;
}
/* }}} */
-/* {{{ proto string SimpleXMLElement::asXML([string filename])
+/* {{{ proto string SimpleXMLElement::asXML([string filename]) U
Return a well-formed XML string based on SimpleXML element */
SXE_METHOD(asXML)
{
int strval_len;
char *filename;
int filename_len;
+ zend_uchar filename_type;
if (ZEND_NUM_ARGS() > 1) {
RETURN_FALSE;
}
if (ZEND_NUM_ARGS() == 1) {
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &filename, &filename_len) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "t", &filename, &filename_len, &filename_type) == FAILURE) {
RETURN_FALSE;
}
node = php_sxe_get_first_node(sxe, node TSRMLS_CC);
if (node) {
+ if (filename_type == IS_UNICODE) {
+ if (php_stream_path_encode(NULL, &filename, &filename_len, (UChar*)filename, filename_len, REPORT_ERRORS, NULL) == FAILURE) {
+ RETURN_FALSE;
+ }
+ }
+
if (XML_DOCUMENT_NODE == node->parent->type) {
int bytes;
bytes = xmlSaveFile(filename, (xmlDocPtr) sxe->document->ptr);
if (bytes == -1) {
- RETURN_FALSE;
+ RETVAL_FALSE;
} else {
- RETURN_TRUE;
+ RETVAL_TRUE;
}
} else {
outbuf = xmlOutputBufferCreateFilename(filename, NULL, 0);
if (outbuf == NULL) {
- RETURN_FALSE;
+ RETVAL_FALSE;
+ } else {
+ xmlNodeDumpOutput(outbuf, (xmlDocPtr) sxe->document->ptr, node, 0, 0, NULL);
+ xmlOutputBufferClose(outbuf);
+ RETVAL_TRUE;
}
-
- xmlNodeDumpOutput(outbuf, (xmlDocPtr) sxe->document->ptr, node, 0, 0, NULL);
- xmlOutputBufferClose(outbuf);
- RETURN_TRUE;
}
+ if (filename_type == IS_UNICODE) {
+ efree(filename);
+ }
+ return;
} else {
RETURN_FALSE;
}
#define SXE_NS_PREFIX(ns) (ns->prefix ? (char*)ns->prefix : "")
-static inline void sxe_add_namespace_name(zval *return_value, xmlNsPtr ns)
+static inline void sxe_add_namespace_name(zval *return_value, xmlNsPtr ns TSRMLS_DC)
{
+ uint prefix_len;
char *prefix = SXE_NS_PREFIX(ns);
- if (zend_hash_exists(Z_ARRVAL_P(return_value), prefix, strlen(prefix) + 1) == 0) {
- add_assoc_string(return_value, prefix, (char*)ns->href, 1);
+
+ prefix_len = strlen(prefix) + 1;
+
+ if (zend_hash_exists(Z_ARRVAL_P(return_value), prefix, prefix_len) == 0) {
+ if (UG(unicode)) {
+ UErrorCode status = U_ZERO_ERROR;
+ UChar *u_str;
+ int u_len;
+ int length = strlen((char*)ns->href);
+ zend_string_to_unicode_ex(UG(utf8_conv), &u_str, &u_len, (char*)ns->href, length, &status);
+ add_assoc_unicodel_ex(return_value, prefix, prefix_len, u_str, u_len, 0);
+ } else {
+ add_assoc_string_ex(return_value, prefix, prefix_len, (char*)ns->href, 1);
+ }
}
}
xmlAttrPtr attr;
if (node->ns) {
- sxe_add_namespace_name(return_value, node->ns);
+ sxe_add_namespace_name(return_value, node->ns TSRMLS_CC);
}
attr = node->properties;
while (attr) {
if (attr->ns) {
- sxe_add_namespace_name(return_value, attr->ns);
+ sxe_add_namespace_name(return_value, attr->ns TSRMLS_CC);
}
attr = attr->next;
}
if (node->type == XML_ELEMENT_NODE) {
sxe_add_namespaces(sxe, node, recursive, return_value TSRMLS_CC);
} else if (node->type == XML_ATTRIBUTE_NODE && node->ns) {
- sxe_add_namespace_name(return_value, node->ns);
+ sxe_add_namespace_name(return_value, node->ns TSRMLS_CC);
}
next_iter:
node = node->next;
if (node->type == XML_ELEMENT_NODE) {
ns = node->nsDef;
while (ns != NULL) {
- sxe_add_namespace_name(return_value, ns);
+ sxe_add_namespace_name(return_value, ns TSRMLS_CC);
ns = ns->next;
}
if (recursive) {
}
/* }}} */
-/* {{{ proto object SimpleXMLElement::children([string ns [, bool is_prefix]])
+/* {{{ proto object SimpleXMLElement::children([string ns [, bool is_prefix]]) U
Finds children of given node */
SXE_METHOD(children)
{
xmlNodePtr node;
zend_bool isprefix = 0;
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s!b", &nsprefix, &nsprefix_len, &isprefix) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s!&b", &nsprefix, &nsprefix_len, UG(utf8_conv), &isprefix) == FAILURE) {
return;
}
}
/* }}} */
-/* {{{ proto object SimpleXMLElement::getName()
+/* {{{ proto object SimpleXMLElement::getName() U
Finds children of given node */
SXE_METHOD(getName)
{
GET_NODE(sxe, node);
namelen = xmlStrlen(node->name);
- RETURN_ASCII_STRINGL((char*)node->name, namelen, 1);
+ RETVAL_XML_STRING_LEN((char *) node->name, namelen, ZSTR_DUPLICATE);
}
/* }}} */
-/* {{{ proto array SimpleXMLElement::attributes([string ns [, bool is_prefix]])
+/* {{{ proto array SimpleXMLElement::attributes([string ns [, bool is_prefix]]) U
Identifies an element's attributes */
SXE_METHOD(attributes)
{
xmlNodePtr node;
zend_bool isprefix = 0;
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s!b", &nsprefix, &nsprefix_len, &isprefix) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s!&b", &nsprefix, &nsprefix_len, UG(utf8_conv), &isprefix) == FAILURE) {
return;
}
}
/* }}} */
-/* {{{ proto void SimpleXMLElement::addChild(string qName [, string value [, string ns]])
+/* {{{ proto void SimpleXMLElement::addChild(string qName [, string value [, string ns]]) U
Add Element with optional namespace information */
SXE_METHOD(addChild)
{
xmlNsPtr nsptr = NULL;
xmlChar *localname, *prefix = NULL;
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|s!s!",
- &qname, &qname_len, &value, &value_len, &nsuri, &nsuri_len) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s&|s!&s!&",
+ &qname, &qname_len, UG(utf8_conv), &value, &value_len, UG(utf8_conv), &nsuri, &nsuri_len, UG(utf8_conv)) == FAILURE) {
return;
}
}
/* }}} */
-/* {{{ proto void SimpleXMLElement::addAttribute(string qName, string value [,string ns])
+/* {{{ proto void SimpleXMLElement::addAttribute(string qName, string value [,string ns]) U
Add Attribute with optional namespace information */
SXE_METHOD(addAttribute)
{
xmlNsPtr nsptr = NULL;
xmlChar *localname, *prefix = NULL;
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss|s!",
- &qname, &qname_len, &value, &value_len, &nsuri, &nsuri_len) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s&s&|s!&",
+ &qname, &qname_len, UG(utf8_conv), &value, &value_len, UG(utf8_conv), &nsuri, &nsuri_len, UG(utf8_conv)) == FAILURE) {
return;
}
static int cast_object(zval *object, int type, char *contents TSRMLS_DC)
{
if (contents) {
- if (UG(unicode)) {
- ZVAL_U_STRING(ZEND_U_CONVERTER(UG(runtime_encoding_conv)), object, contents, 1);
- } else {
- ZVAL_STRINGL(object, contents, strlen(contents), 1);
- }
+ ZVAL_XML_STRING(object, contents, ZSTR_DUPLICATE);
} else {
ZVAL_NULL(object);
}
}
/* }}} */
-/* {{{ proto simplemxml_element simplexml_load_file(string filename [, string class_name [, int options [, string ns [, bool is_prefix]]]])
+/* {{{ proto simplemxml_element simplexml_load_file(string filename [, string class_name [, int options [, string ns [, bool is_prefix]]]]) U
Load a filename and return a simplexml_element object to allow for processing */
PHP_FUNCTION(simplexml_load_file)
{
long options = 0;
zend_class_entry *ce= sxe_class_entry;
zend_bool isprefix = 0;
+ zend_uchar filename_type;
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|C!lsb", &filename, &filename_len, &ce, &options, &ns, &ns_len, &isprefix) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "t|C!ls&b", &filename, &filename_len, &filename_type, &ce, &options, &ns, &ns_len, UG(utf8_conv), &isprefix) == FAILURE) {
return;
}
+ if (filename_type == IS_UNICODE) {
+ if (php_stream_path_encode(NULL, &filename, &filename_len, (UChar*)filename, filename_len, REPORT_ERRORS, NULL) == FAILURE) {
+ zend_throw_exception(zend_exception_get_default(TSRMLS_C), "Could not encode filename", 0 TSRMLS_CC);
+ return;
+ }
+ }
+
docp = xmlReadFile(filename, NULL, options);
+ if (filename_type == IS_UNICODE) {
+ efree(filename);
+ }
+
if (! docp) {
RETURN_FALSE;
}
}
/* }}} */
-/* {{{ proto simplemxml_element simplexml_load_string(string data [, string class_name [, int options [, string ns [, bool is_prefix]]]])
+/* {{{ proto simplemxml_element simplexml_load_string(string data [, string class_name [, int options [, string ns [, bool is_prefix]]]]) U
Load a string and return a simplexml_element object to allow for processing */
PHP_FUNCTION(simplexml_load_string)
{
zend_class_entry *ce= sxe_class_entry;
zend_bool isprefix = 0;
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|C!lsb", &data, &data_len, &ce, &options, &ns, &ns_len, &isprefix) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "S|C!ls&b", &data, &data_len, &ce, &options, &ns, &ns_len, UG(utf8_conv), &isprefix) == FAILURE) {
return;
}
/* }}} */
-/* {{{ proto SimpleXMLElement::__construct(string data [, int options [, bool data_is_url [, string ns [, bool is_prefix]]]])
+/* {{{ proto SimpleXMLElement::__construct(string data [, int options [, bool data_is_url [, string ns [, bool is_prefix]]]]) U
SimpleXMLElement constructor */
SXE_METHOD(__construct)
{
xmlDocPtr docp;
long options = 0;
zend_bool is_url = 0, isprefix = 0;
+ zend_uchar data_type;
php_set_error_handling(EH_THROW, zend_exception_get_default(TSRMLS_C) TSRMLS_CC);
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|lbsb", &data, &data_len, &options, &is_url, &ns, &ns_len, &isprefix) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "t|lbs&b", &data, &data_len, &data_type, &options, &is_url, &ns, &ns_len, UG(utf8_conv), &isprefix) == FAILURE) {
php_std_error_handling();
return;
}
php_std_error_handling();
+ if (data_type == IS_UNICODE) {
+ if (is_url) {
+ if (php_stream_path_encode(NULL, &data, &data_len, (UChar*)data, data_len, REPORT_ERRORS, NULL) == FAILURE) {
+ zend_throw_exception(zend_exception_get_default(TSRMLS_C), "String could not be parsed as XML", 0 TSRMLS_CC);
+ return;
+ }
+ } else {
+ zend_throw_exception(zend_exception_get_default(TSRMLS_C), "SimpleXMLElement can only parse a binary string", 0 TSRMLS_CC);
+ return;
+ }
+ }
+
docp = is_url ? xmlReadFile(data, NULL, options) : xmlReadMemory(data, data_len, NULL, NULL, options);
+ if (is_url && data_type == IS_UNICODE) {
+ efree(data);
+ }
+
if (!docp) {
((php_libxml_node_object *)sxe)->document = NULL;
zend_throw_exception(zend_exception_get_default(TSRMLS_C), "String could not be parsed as XML", 0 TSRMLS_CC);
int u_len;
namelen = xmlStrlen(curnode->name);
- zend_string_to_unicode_ex(ZEND_U_CONVERTER(UG(runtime_encoding_conv)), &str_key->u, &u_len, (char*)curnode->name, namelen, &status);
+ zend_string_to_unicode_ex(UG(utf8_conv), &str_key->u, &u_len, (char*)curnode->name, namelen, &status);
*str_key_len = u_len + 1;
return HASH_KEY_IS_UNICODE;
} else {
namelen = xmlStrlen(curnode->name);
- str_key->s = estrndup(curnode->name, namelen);
+ str_key->s = estrndup((char *)curnode->name, namelen);
*str_key_len = namelen + 1;
return HASH_KEY_IS_STRING;
}
return php_sxe_get_first_node(sxe, node TSRMLS_CC);
}
-/* {{{ proto simplemxml_element simplexml_import_dom(domNode node [, string class_name])
+/* {{{ proto simplemxml_element simplexml_import_dom(domNode node [, string class_name]) U
Get a simplexml_element object from dom to allow for processing */
PHP_FUNCTION(simplexml_import_dom)
{