Re: [PHP-DEV] Using OnUpdateUTF8String in PHP 6

2007-10-23 Thread Andrei Zmievski

Seems fine to me. Sara?

-Andrei
http://10fathoms.org/vu - daily photoblog

On Oct 16, 2007, at 1:33 PM, Christopher Jones wrote:



With thanks to Sara we looked at OnUpdateUTF8String to access a
php.ini value in OCI8 in PHP 6.

One of our engineers sent me a proposed patch for zend_ini.c in PHP6
to allow OnUpdateUTF8String to work as he thought it should.  Any
comments?

Chris



 The problems I faced when unicode.semantics=On were:

 1) Any OnUpdateUTF8String php.ini variable is seen as NULL in
 oci_globals.

 2) If the above is resolved, the memory of the variable is wiped  
out,

 by the time we come to execution of the script, after module inits.

 3) We still convert to UTF-16 when unicode.semantics=Off.

PS. Patch is attached - if it gets through.

--
Christopher Jones, Oracle
Email: [EMAIL PROTECTED]Tel:  +1 650 506 8630
Blog:  http://blogs.oracle.com/opal/   Free PHP Book: http:// 
tinyurl.com/f8jad

--- zend_ini.c  2007-10-02 11:07:32.0 -0700
+++ zend_ini.c.new  2007-10-16 13:20:03.0 -0700
@@ -640,7 +640,8 @@

 ZEND_API ZEND_INI_MH(OnUpdateUTF8String) /* {{{ */
 {
-   UChar **p;
+   UChar **up;
+   char **p;
UChar *ustr = NULL;
int32_t ustr_len, capacity;
UErrorCode status = U_ZERO_ERROR;
@@ -651,30 +652,37 @@

base = (char *) ts_resource(*((int *) mh_arg2));
 #endif
+	/* Convert only if unicode semantics is on. Otherwise, same as  
OnUpdateString */

+   if (UG(unicode)){
+   /* estimate capacity */
+		capacity = (new_value_length  2) ? ((new_value_length  1) +  
(new_value_length  3) + 2) : new_value_length;

+
+   while (1) {
+   ustr = peurealloc(ustr, capacity+1, 1);
+			u_strFromUTF8(ustr, capacity+1, ustr_len, new_value,  
new_value_length, status);
+			if (status == U_BUFFER_OVERFLOW_ERROR || status ==  
U_STRING_NOT_TERMINATED_WARNING) {

+   capacity = ustr_len;
+   status = U_ZERO_ERROR;
+   } else {
+   break;
+   }
+   }

-   /* estimate capacity */
-	capacity = (new_value_length  2) ? ((new_value_length  1) +  
(new_value_length  3) + 2) : new_value_length;

-
-   while (1) {
-   ustr = eurealloc(ustr, capacity+1);
-		u_strFromUTF8(ustr, capacity, ustr_len, new_value,  
new_value_length, status);

-   if (status == U_BUFFER_OVERFLOW_ERROR) {
-   capacity = ustr_len;
-   status = U_ZERO_ERROR;
-   } else {
-   break;
+   if (U_FAILURE(status)) {
+			zend_error(E_WARNING, Could not convert UTF-8 INI value to  
Unicode);

+   efree(ustr);
+   return FAILURE;
}
-   }

-   if (U_FAILURE(status)) {
-		zend_error(E_WARNING, Could not convert UTF-8 INI value to  
Unicode);

-   efree(ustr);
-   return FAILURE;
-   }
+   up = (UChar **) (base+(size_t) mh_arg1);

-   p = (UChar **) (base+(size_t) mh_arg1);
+   *up = ustr;
+   }
+   else {  /* Same as OnUpdateString */
+   p = (char **) (base+(size_t) mh_arg1);

-   *p = ustr;
+   *p = new_value;
+   }
return SUCCESS;
 }
 /* }}} */

--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php


--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php



[PHP-DEV] Using OnUpdateUTF8String in PHP 6

2007-10-16 Thread Christopher Jones


With thanks to Sara we looked at OnUpdateUTF8String to access a
php.ini value in OCI8 in PHP 6.

One of our engineers sent me a proposed patch for zend_ini.c in PHP6
to allow OnUpdateUTF8String to work as he thought it should.  Any
comments?

Chris



 The problems I faced when unicode.semantics=On were:

 1) Any OnUpdateUTF8String php.ini variable is seen as NULL in
 oci_globals.

 2) If the above is resolved, the memory of the variable is wiped out,
 by the time we come to execution of the script, after module inits.

 3) We still convert to UTF-16 when unicode.semantics=Off.

PS. Patch is attached - if it gets through.

--
Christopher Jones, Oracle
Email: [EMAIL PROTECTED]Tel:  +1 650 506 8630
Blog:  http://blogs.oracle.com/opal/   Free PHP Book: http://tinyurl.com/f8jad
--- zend_ini.c  2007-10-02 11:07:32.0 -0700
+++ zend_ini.c.new  2007-10-16 13:20:03.0 -0700
@@ -640,7 +640,8 @@
 
 ZEND_API ZEND_INI_MH(OnUpdateUTF8String) /* {{{ */
 {
-   UChar **p;
+   UChar **up;
+   char **p;
UChar *ustr = NULL;
int32_t ustr_len, capacity;
UErrorCode status = U_ZERO_ERROR;
@@ -651,30 +652,37 @@
 
base = (char *) ts_resource(*((int *) mh_arg2));
 #endif
+   /* Convert only if unicode semantics is on. Otherwise, same as 
OnUpdateString */
+   if (UG(unicode)){
+   /* estimate capacity */
+   capacity = (new_value_length  2) ? ((new_value_length  1) + 
(new_value_length  3) + 2) : new_value_length;
+
+   while (1) {
+   ustr = peurealloc(ustr, capacity+1, 1);
+   u_strFromUTF8(ustr, capacity+1, ustr_len, new_value, 
new_value_length, status);
+   if (status == U_BUFFER_OVERFLOW_ERROR || status == 
U_STRING_NOT_TERMINATED_WARNING) {
+   capacity = ustr_len;
+   status = U_ZERO_ERROR;
+   } else {
+   break;
+   }
+   }
 
-   /* estimate capacity */
-   capacity = (new_value_length  2) ? ((new_value_length  1) + 
(new_value_length  3) + 2) : new_value_length;
-
-   while (1) {
-   ustr = eurealloc(ustr, capacity+1);
-   u_strFromUTF8(ustr, capacity, ustr_len, new_value, 
new_value_length, status);
-   if (status == U_BUFFER_OVERFLOW_ERROR) {
-   capacity = ustr_len;
-   status = U_ZERO_ERROR;
-   } else {
-   break;
+   if (U_FAILURE(status)) {
+   zend_error(E_WARNING, Could not convert UTF-8 INI 
value to Unicode);
+   efree(ustr);
+   return FAILURE;
}
-   }
 
-   if (U_FAILURE(status)) {
-   zend_error(E_WARNING, Could not convert UTF-8 INI value to 
Unicode);
-   efree(ustr);
-   return FAILURE;
-   }
+   up = (UChar **) (base+(size_t) mh_arg1);
 
-   p = (UChar **) (base+(size_t) mh_arg1);
+   *up = ustr;
+   }
+   else {  /* Same as OnUpdateString */
+   p = (char **) (base+(size_t) mh_arg1);
 
-   *p = ustr;
+   *p = new_value;
+   }
return SUCCESS;
 }
 /* }}} */

-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php