rrichards               Wed Jul 19 18:32:19 2006 UTC

  Modified files:              
    /php-src/ext/xmlreader      php_xmlreader.c 
    /php-src/ext/xmlreader/tests        012.phpt 013.phpt 
  Log:
  unicode support
  update tests
  
http://cvs.php.net/viewvc.cgi/php-src/ext/xmlreader/php_xmlreader.c?r1=1.33&r2=1.34&diff_format=u
Index: php-src/ext/xmlreader/php_xmlreader.c
diff -u php-src/ext/xmlreader/php_xmlreader.c:1.33 
php-src/ext/xmlreader/php_xmlreader.c:1.34
--- php-src/ext/xmlreader/php_xmlreader.c:1.33  Wed May 10 11:58:56 2006
+++ php-src/ext/xmlreader/php_xmlreader.c       Wed Jul 19 18:32:19 2006
@@ -16,7 +16,7 @@
   +----------------------------------------------------------------------+
 */
 
-/* $Id: php_xmlreader.c,v 1.33 2006/05/10 11:58:56 rrichards Exp $ */
+/* $Id: php_xmlreader.c,v 1.34 2006/07/19 18:32:19 rrichards Exp $ */
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
@@ -92,9 +92,9 @@
        switch (hnd->type) {
                case IS_STRING:
                        if (retchar) {
-                               ZVAL_STRING(*retval, (xmlChar *) retchar, 1);
+                               ZVAL_XML_STRING(*retval, (char *) retchar, 
ZSTR_DUPLICATE);
                        } else {
-                               ZVAL_EMPTY_STRING(*retval);
+                               ZVAL_EMPTY_TEXT(*retval);
                        }
                        break;
                case IS_BOOL:
@@ -121,17 +121,17 @@
        zend_object_handlers *std_hnd;
        int ret = FAILURE;
 
-       if (member->type != IS_STRING) {
+       if (member->type != IS_STRING && member->type != IS_UNICODE) {
                tmp_member = *member;
                zval_copy_ctor(&tmp_member);
-               convert_to_string(&tmp_member);
+               convert_to_text(&tmp_member);
                member = &tmp_member;
        }
 
        obj = (xmlreader_object *)zend_objects_get_address(object TSRMLS_CC);
 
        if (obj->prop_handler != NULL) {
-               ret = zend_hash_find(obj->prop_handler, Z_STRVAL_P(member), 
Z_STRLEN_P(member)+1, (void **) &hnd);
+               ret = zend_u_hash_find(obj->prop_handler, Z_TYPE_P(member), 
Z_UNIVAL_P(member), Z_UNILEN_P(member)+1, (void **) &hnd);
        }
        if (ret == FAILURE) {
                std_hnd = zend_get_std_object_handlers();
@@ -155,10 +155,10 @@
        zend_object_handlers *std_hnd;
        int ret;
 
-       if (member->type != IS_STRING) {
+       if (member->type != IS_STRING && member->type != IS_UNICODE) {
                tmp_member = *member;
                zval_copy_ctor(&tmp_member);
-               convert_to_string(&tmp_member);
+               convert_to_text(&tmp_member);
                member = &tmp_member;
        }
 
@@ -166,7 +166,7 @@
        obj = (xmlreader_object *)zend_objects_get_address(object TSRMLS_CC);
 
        if (obj->prop_handler != NULL) {
-               ret = zend_hash_find(obj->prop_handler, Z_STRVAL_P(member), 
Z_STRLEN_P(member)+1, (void **) &hnd);
+               ret = zend_u_hash_find(obj->prop_handler, Z_TYPE_P(member), 
Z_UNIVAL_P(member), Z_UNILEN_P(member)+1, (void **) &hnd);
        }
        if (ret == SUCCESS) {
                ret = xmlreader_property_reader(obj, hnd, &retval TSRMLS_CC);
@@ -197,10 +197,10 @@
        zend_object_handlers *std_hnd;
        int ret;
 
-       if (member->type != IS_STRING) {
+       if (member->type != IS_STRING && member->type != IS_UNICODE) {
                tmp_member = *member;
                zval_copy_ctor(&tmp_member);
-               convert_to_string(&tmp_member);
+               convert_to_text(&tmp_member);
                member = &tmp_member;
        }
 
@@ -208,7 +208,7 @@
        obj = (xmlreader_object *)zend_objects_get_address(object TSRMLS_CC);
 
        if (obj->prop_handler != NULL) {
-               ret = zend_hash_find((HashTable *)obj->prop_handler, 
Z_STRVAL_P(member), Z_STRLEN_P(member)+1, (void **) &hnd);
+               ret = zend_u_hash_find(obj->prop_handler, Z_TYPE_P(member), 
Z_UNIVAL_P(member), Z_UNILEN_P(member)+1, (void **) &hnd);
        }
        if (ret == SUCCESS) {
                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot write to 
read-only property");
@@ -233,8 +233,8 @@
        int isFileUri = 0;
 
        uri = xmlCreateURI();
-       escsource = xmlURIEscapeStr(source, ":");
-       xmlParseURIReference(uri, escsource);
+       escsource = xmlURIEscapeStr((xmlChar *) source, (xmlChar *) ":");
+       xmlParseURIReference(uri, (char *)escsource);
        xmlFree(escsource);
 
        if (uri->scheme != NULL) {
@@ -420,13 +420,19 @@
 static void php_xmlreader_string_arg(INTERNAL_FUNCTION_PARAMETERS, 
xmlreader_read_one_char_t internal_function) {
        zval *id;
        int name_len = 0;
-       char *retchar = NULL;
+       xmlChar *retchar = NULL;
        xmlreader_object *intern;
        char *name;
+       UConverter *orig_runtime_conv;
+
+       orig_runtime_conv = ZEND_U_CONVERTER(UG(runtime_encoding_conv));
+       UG(runtime_encoding_conv) = UG(utf8_conv);
 
        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &name, 
&name_len) == FAILURE) {
+               UG(runtime_encoding_conv) = orig_runtime_conv;
                return;
        }
+       UG(runtime_encoding_conv) = orig_runtime_conv;
 
        if (!name_len) {
                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Argument cannot be 
an empty string");
@@ -437,10 +443,10 @@
 
        intern = (xmlreader_object *)zend_object_store_get_object(id TSRMLS_CC);
        if (intern && intern->ptr) {
-               retchar = internal_function(intern->ptr, name);
+               retchar = internal_function(intern->ptr, (xmlChar *)name);
        }
        if (retchar) {
-               RETVAL_STRING(retchar, 1);
+               RETVAL_XML_STRING((char *)retchar, ZSTR_DUPLICATE);
                xmlFree(retchar);
                return;
        } else {
@@ -472,7 +478,7 @@
 /* {{{ php_xmlreader_no_arg_string */
 static void php_xmlreader_no_arg_string(INTERNAL_FUNCTION_PARAMETERS, 
xmlreader_read_char_t internal_function) {
        zval *id;
-       char *retchar = NULL;
+       xmlChar *retchar = NULL;
        xmlreader_object *intern;
 
        id = getThis();
@@ -482,7 +488,7 @@
                retchar = internal_function(intern->ptr);
        }
        if (retchar) {
-               RETVAL_STRING(retchar, 1);
+               RETVAL_XML_STRING((char *)retchar, ZSTR_DUPLICATE);
                xmlFree(retchar);
                return;
        } else {
@@ -577,7 +583,7 @@
 {
        zval *id;
        long attr_pos;
-       char *retchar = NULL;
+       xmlChar *retchar = NULL;
        xmlreader_object *intern;
 
        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &attr_pos) == 
FAILURE) {
@@ -591,11 +597,11 @@
                retchar = xmlTextReaderGetAttributeNo(intern->ptr,attr_pos);
        }
        if (retchar) {
-               RETVAL_STRING(retchar, 1);
+               RETVAL_XML_STRING((char *)retchar, ZSTR_DUPLICATE);
                xmlFree(retchar);
                return;
        } else {
-               RETURN_EMPTY_STRING();
+               RETURN_EMPTY_TEXT();
        }
 }
 /* }}} */
@@ -607,11 +613,18 @@
        zval *id;
        int name_len = 0, ns_uri_len = 0;
        xmlreader_object *intern;
-       char *name, *ns_uri, *retchar = NULL;
+       xmlChar *retchar = NULL;
+       char *name, *ns_uri;
+       UConverter *orig_runtime_conv;
+
+       orig_runtime_conv = ZEND_U_CONVERTER(UG(runtime_encoding_conv));
+       UG(runtime_encoding_conv) = UG(utf8_conv);
 
        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &name, 
&name_len, &ns_uri, &ns_uri_len) == FAILURE) {
+               UG(runtime_encoding_conv) = orig_runtime_conv;
                return;
        }
+       UG(runtime_encoding_conv) = orig_runtime_conv;
 
        if (name_len == 0 || ns_uri_len == 0) {
                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Attribute Name and 
Namespace URI cannot be empty");
@@ -622,14 +635,14 @@
 
        intern = (xmlreader_object *)zend_object_store_get_object(id TSRMLS_CC);
        if (intern && intern->ptr) {
-               retchar = xmlTextReaderGetAttributeNs(intern->ptr, name, 
ns_uri);
+               retchar = xmlTextReaderGetAttributeNs(intern->ptr, (xmlChar 
*)name, (xmlChar *)ns_uri);
        }
        if (retchar) {
-               RETVAL_STRING(retchar, 1);
+               RETVAL_XML_STRING((char *)retchar, ZSTR_DUPLICATE);
                xmlFree(retchar);
                return;
        } else {
-               RETURN_EMPTY_STRING();
+               RETURN_EMPTY_TEXT();
        }
 }
 /* }}} */
@@ -688,10 +701,16 @@
        int name_len = 0, retval;
        xmlreader_object *intern;
        char *name;
+       UConverter *orig_runtime_conv;
+
+       orig_runtime_conv = ZEND_U_CONVERTER(UG(runtime_encoding_conv));
+       UG(runtime_encoding_conv) = UG(utf8_conv);
 
        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &name, 
&name_len) == FAILURE) {
+               UG(runtime_encoding_conv) = orig_runtime_conv;
                return;
        }
+       UG(runtime_encoding_conv) = orig_runtime_conv;
 
        if (name_len == 0) {
                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Attribute Name is 
required");
@@ -702,7 +721,7 @@
 
        intern = (xmlreader_object *)zend_object_store_get_object(id TSRMLS_CC);
        if (intern && intern->ptr) {
-               retval = xmlTextReaderMoveToAttribute(intern->ptr, name);
+               retval = xmlTextReaderMoveToAttribute(intern->ptr, (xmlChar 
*)name);
                if (retval == 1) {
                        RETURN_TRUE;
                }
@@ -749,11 +768,18 @@
        int name_len=0, ns_uri_len=0, retval;
        xmlreader_object *intern;
        char *name, *ns_uri;
+       UConverter *orig_runtime_conv;
+
+       orig_runtime_conv = ZEND_U_CONVERTER(UG(runtime_encoding_conv));
+       UG(runtime_encoding_conv) = UG(utf8_conv);
 
        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &name, 
&name_len, &ns_uri, &ns_uri_len) == FAILURE) {
+               UG(runtime_encoding_conv) = orig_runtime_conv;
                return;
        }
 
+       UG(runtime_encoding_conv) = orig_runtime_conv;
+
        if (name_len == 0 || ns_uri_len == 0) {
                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Attribute Name and 
Namespace URI cannot be empty");
                RETURN_FALSE;
@@ -763,7 +789,7 @@
 
        intern = (xmlreader_object *)zend_object_store_get_object(id TSRMLS_CC);
        if (intern && intern->ptr) {
-               retval = xmlTextReaderMoveToAttributeNs(intern->ptr, name, 
ns_uri);
+               retval = xmlTextReaderMoveToAttributeNs(intern->ptr, (xmlChar 
*)name, (xmlChar *)ns_uri);
                if (retval == 1) {
                        RETURN_TRUE;
                }
@@ -830,10 +856,16 @@
        int retval, name_len=0;
        xmlreader_object *intern;
        char *name = NULL;
+       UConverter *orig_runtime_conv;
+
+       orig_runtime_conv = ZEND_U_CONVERTER(UG(runtime_encoding_conv));
+       UG(runtime_encoding_conv) = UG(utf8_conv);
 
        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s", &name, 
&name_len) == FAILURE) {
+               UG(runtime_encoding_conv) = orig_runtime_conv;
                return;
        }
+       UG(runtime_encoding_conv) = orig_runtime_conv;
 
        id = getThis();
        intern = (xmlreader_object *)zend_object_store_get_object(id TSRMLS_CC);
@@ -846,7 +878,7 @@
 #endif
                retval = xmlTextReaderNext(intern->ptr);
                while (name != NULL && retval == 1) {
-                       if 
(xmlStrEqual(xmlTextReaderConstLocalName(intern->ptr), name)) {
+                       if 
(xmlStrEqual(xmlTextReaderConstLocalName(intern->ptr), (xmlChar *)name)) {
                                RETURN_TRUE;
                        }
                        retval = xmlTextReaderNext(intern->ptr); 
@@ -876,11 +908,18 @@
        char *encoding = NULL;
        char resolved_path[MAXPATHLEN + 1];
        xmlTextReaderPtr reader = NULL;
+       UConverter *orig_runtime_conv;
+
+       orig_runtime_conv = ZEND_U_CONVERTER(UG(runtime_encoding_conv));
+       UG(runtime_encoding_conv) = UG(utf8_conv);
 
        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|s!l", &source, 
&source_len, &encoding, &encoding_len, &options) == FAILURE) {
+               UG(runtime_encoding_conv) = orig_runtime_conv;
                return;
        }
 
+       UG(runtime_encoding_conv) = orig_runtime_conv;
+
        id = getThis();
        if (id != NULL) {
                if (! instanceof_function(Z_OBJCE_P(id), xmlreader_class_entry 
TSRMLS_CC)) {
@@ -1059,7 +1098,7 @@
        int resolved_path_len;
        char *directory=NULL, resolved_path[MAXPATHLEN];
        xmlParserInputBufferPtr inputbfr;
-       xmlTextReaderPtr reader;
+       xmlTextReaderPtr reader = NULL;
 
        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|s!l", &source, 
&source_len, &encoding, &encoding_len, &options) == FAILURE) {
                return;
@@ -1210,7 +1249,8 @@
        ce.create_object = xmlreader_objects_new;
        xmlreader_class_entry = zend_register_internal_class(&ce TSRMLS_CC);
 
-       zend_hash_init(&xmlreader_prop_handlers, 0, NULL, NULL, 1);
+       zend_u_hash_init(&xmlreader_prop_handlers, 0, NULL, NULL, 1, 
(zend_bool)zend_ini_long("unicode.semantics", sizeof("unicode.semantics"), 1));
+
        xmlreader_register_prop_handler(&xmlreader_prop_handlers, 
"attributeCount", xmlTextReaderAttributeCount, NULL, IS_LONG TSRMLS_CC);
        xmlreader_register_prop_handler(&xmlreader_prop_handlers, "baseURI", 
NULL, xmlTextReaderConstBaseUri, IS_STRING TSRMLS_CC);
        xmlreader_register_prop_handler(&xmlreader_prop_handlers, "depth", 
xmlTextReaderDepth, NULL, IS_LONG TSRMLS_CC);
http://cvs.php.net/viewvc.cgi/php-src/ext/xmlreader/tests/012.phpt?r1=1.1&r2=1.2&diff_format=u
Index: php-src/ext/xmlreader/tests/012.phpt
diff -u php-src/ext/xmlreader/tests/012.phpt:1.1 
php-src/ext/xmlreader/tests/012.phpt:1.2
--- php-src/ext/xmlreader/tests/012.phpt:1.1    Thu Mar 30 21:45:27 2006
+++ php-src/ext/xmlreader/tests/012.phpt        Wed Jul 19 18:32:19 2006
@@ -4,7 +4,7 @@
 <?php if (!extension_loaded("xmlreader")) print "skip"; ?>
 --FILE--
 <?php 
-/* $Id: 012.phpt,v 1.1 2006/03/30 21:45:27 helly Exp $ */
+/* $Id: 012.phpt,v 1.2 2006/07/19 18:32:19 rrichards Exp $ */
 
 $xmlstring =<<<EOF
 <?xml version="1.0" encoding="UTF-8"?>
@@ -67,3 +67,14 @@
 string(0) ""
 string(0) ""
 ===DONE===
+--UEXPECT--
+unicode(0) ""
+NULL
+unicode(0) ""
+unicode(0) ""
+===FILE===
+unicode(0) ""
+NULL
+unicode(0) ""
+unicode(0) ""
+===DONE===
http://cvs.php.net/viewvc.cgi/php-src/ext/xmlreader/tests/013.phpt?r1=1.1&r2=1.2&diff_format=u
Index: php-src/ext/xmlreader/tests/013.phpt
diff -u php-src/ext/xmlreader/tests/013.phpt:1.1 
php-src/ext/xmlreader/tests/013.phpt:1.2
--- php-src/ext/xmlreader/tests/013.phpt:1.1    Fri Mar 31 20:50:29 2006
+++ php-src/ext/xmlreader/tests/013.phpt        Wed Jul 19 18:32:19 2006
@@ -5,7 +5,7 @@
 <?php if (!method_exists('XMLReader','setSchema')) die('skip 
XMLReader::setSchema() not supported');?>
 --FILE--
 <?php 
-/* $Id: 013.phpt,v 1.1 2006/03/31 20:50:29 helly Exp $ */
+/* $Id: 013.phpt,v 1.2 2006/07/19 18:32:19 rrichards Exp $ */
 
 $xml =<<<EOF
 <?xml version="1.0" encoding="UTF-8" ?>
@@ -50,3 +50,10 @@
 
 Warning: XMLReader::read(): Element 'foo': %s
 ===DONE===
+--UEXPECTF--
+unicode(3) "123"
+unicode(3) "456"
+===FAIL===
+
+Warning: XMLReader::read(): Element 'foo': %s
+===DONE===

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to