andrei          Sun Mar 26 06:19:25 2006 UTC

  Modified files:              
    /ZendEngine2        zend.c zend_globals.h zend_operators.c zend_unicode.c 
                        zend_unicode.h 
    /php-src/ext/unicode        unicode.c 
    /php-src/main       main.c 
    /php-src/main/streams       filter.c streams.c 
  Log:
  Implement to-Unicode conversion error behavior. Note the adjusted APIs.
  
  
http://cvs.php.net/viewcvs.cgi/ZendEngine2/zend.c?r1=1.346&r2=1.347&diff_format=u
Index: ZendEngine2/zend.c
diff -u ZendEngine2/zend.c:1.346 ZendEngine2/zend.c:1.347
--- ZendEngine2/zend.c:1.346    Sun Mar 26 01:48:33 2006
+++ ZendEngine2/zend.c  Sun Mar 26 06:19:24 2006
@@ -17,7 +17,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: zend.c,v 1.346 2006/03/26 01:48:33 andrei Exp $ */
+/* $Id: zend.c,v 1.347 2006/03/26 06:19:24 andrei Exp $ */
 
 #include "zend.h"
 #include "zend_extensions.h"
@@ -110,7 +110,8 @@
                *converter = NULL;
        }
        if (*converter) {
-               zend_set_converter_error_mode(*converter, UG(from_error_mode));
+               zend_set_converter_error_mode(*converter, ZEND_FROM_UNICODE, 
UG(from_error_mode));
+               zend_set_converter_error_mode(*converter, ZEND_TO_UNICODE, 
UG(to_error_mode));
                zend_set_converter_subst_char(*converter, UG(from_subst_char));
        }
 
@@ -153,15 +154,17 @@
 void zend_update_converters_error_behavior(TSRMLS_D)
 {
        if (UG(fallback_encoding_conv)) {
-               zend_set_converter_error_mode(UG(fallback_encoding_conv), 
UG(from_error_mode));
+               zend_set_converter_error_mode(UG(fallback_encoding_conv), 
ZEND_FROM_UNICODE, UG(from_error_mode));
+               zend_set_converter_error_mode(UG(fallback_encoding_conv), 
ZEND_TO_UNICODE, UG(to_error_mode));
                zend_set_converter_subst_char(UG(fallback_encoding_conv), 
UG(from_subst_char));
        }
        if (UG(runtime_encoding_conv)) {
-               zend_set_converter_error_mode(UG(runtime_encoding_conv), 
UG(from_error_mode));
+               zend_set_converter_error_mode(UG(runtime_encoding_conv), 
ZEND_FROM_UNICODE, UG(from_error_mode));
+               zend_set_converter_error_mode(UG(runtime_encoding_conv), 
ZEND_TO_UNICODE, UG(to_error_mode));
                zend_set_converter_subst_char(UG(runtime_encoding_conv), 
UG(from_subst_char));
        }
        if (UG(output_encoding_conv)) {
-               zend_set_converter_error_mode(UG(output_encoding_conv), 
UG(from_error_mode));
+               zend_set_converter_error_mode(UG(output_encoding_conv), 
ZEND_FROM_UNICODE, UG(from_error_mode));
                zend_set_converter_subst_char(UG(output_encoding_conv), 
UG(from_subst_char));
        }
 }
@@ -911,6 +914,7 @@
        unicode_globals->from_error_mode = ZEND_CONV_ERROR_SUBST;
        memset(unicode_globals->from_subst_char, 0, 3 * sizeof(UChar));
        zend_codepoint_to_uchar(0x3f, unicode_globals->from_subst_char);
+       unicode_globals->to_error_mode = ZEND_CONV_ERROR_STOP;
 
        zend_hash_init_ex(&unicode_globals->flex_compatible, 0, NULL, NULL, 1, 
0);
 }
http://cvs.php.net/viewcvs.cgi/ZendEngine2/zend_globals.h?r1=1.153&r2=1.154&diff_format=u
Index: ZendEngine2/zend_globals.h
diff -u ZendEngine2/zend_globals.h:1.153 ZendEngine2/zend_globals.h:1.154
--- ZendEngine2/zend_globals.h:1.153    Sun Mar 26 01:48:33 2006
+++ ZendEngine2/zend_globals.h  Sun Mar 26 06:19:24 2006
@@ -17,7 +17,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: zend_globals.h,v 1.153 2006/03/26 01:48:33 andrei Exp $ */
+/* $Id: zend_globals.h,v 1.154 2006/03/26 06:19:24 andrei Exp $ */
 
 #ifndef ZEND_GLOBALS_H
 #define ZEND_GLOBALS_H
@@ -304,7 +304,6 @@
        uint16_t from_error_mode;
        UChar from_subst_char[3];
        uint16_t to_error_mode;
-       UChar to_subst_char[3];
 
        char *default_locale;
        UCollator *default_collator;
http://cvs.php.net/viewcvs.cgi/ZendEngine2/zend_operators.c?r1=1.238&r2=1.239&diff_format=u
Index: ZendEngine2/zend_operators.c
diff -u ZendEngine2/zend_operators.c:1.238 ZendEngine2/zend_operators.c:1.239
--- ZendEngine2/zend_operators.c:1.238  Fri Mar 24 07:38:07 2006
+++ ZendEngine2/zend_operators.c        Sun Mar 26 06:19:24 2006
@@ -17,7 +17,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: zend_operators.c,v 1.238 2006/03/24 07:38:07 andrei Exp $ */
+/* $Id: zend_operators.c,v 1.239 2006/03/26 06:19:24 andrei Exp $ */
 
 #include <ctype.h>
 
@@ -588,9 +588,7 @@
                case IS_UNICODE:
                        break;
                case IS_STRING:
-                       if (zval_string_to_unicode(op TSRMLS_CC) == FAILURE) {
-                               zend_error(E_WARNING, "Could not convert binary 
string to Unicode string");
-                       }
+                       zval_string_to_unicode(op TSRMLS_CC);
                        return;
                case IS_BOOL:
                        if (Z_LVAL_P(op)) {
http://cvs.php.net/viewcvs.cgi/ZendEngine2/zend_unicode.c?r1=1.15&r2=1.16&diff_format=u
Index: ZendEngine2/zend_unicode.c
diff -u ZendEngine2/zend_unicode.c:1.15 ZendEngine2/zend_unicode.c:1.16
--- ZendEngine2/zend_unicode.c:1.15     Sun Mar 26 01:48:33 2006
+++ ZendEngine2/zend_unicode.c  Sun Mar 26 06:19:24 2006
@@ -33,41 +33,69 @@
 ZEND_API zend_class_entry *unicodeConversionException;
 
 /* {{{ zend_set_converter_error_mode */
-void zend_set_converter_error_mode(UConverter *conv, uint8_t error_mode)
+void zend_set_converter_error_mode(UConverter *conv, zend_conv_direction 
direction, uint16_t error_mode)
 {
        UErrorCode status = U_ZERO_ERROR;
 
-       switch (error_mode) {
+       switch (error_mode & 0xff) {
                case ZEND_CONV_ERROR_STOP:
-                       ucnv_setFromUCallBack(conv, UCNV_FROM_U_CALLBACK_STOP, 
NULL, NULL, NULL, &status);
+                       if (direction == ZEND_FROM_UNICODE)
+                               ucnv_setFromUCallBack(conv, 
UCNV_FROM_U_CALLBACK_STOP, NULL, NULL, NULL, &status);
+                       else
+                               ucnv_setToUCallBack(conv, 
UCNV_TO_U_CALLBACK_STOP, NULL, NULL, NULL, &status);
                        break;
 
                case ZEND_CONV_ERROR_SKIP:
-                       ucnv_setFromUCallBack(conv, UCNV_FROM_U_CALLBACK_SKIP, 
UCNV_SKIP_STOP_ON_ILLEGAL, NULL, NULL, &status);
+                       if (direction == ZEND_FROM_UNICODE)
+                               ucnv_setFromUCallBack(conv, 
UCNV_FROM_U_CALLBACK_SKIP, UCNV_SKIP_STOP_ON_ILLEGAL, NULL, NULL, &status);
+                       else
+                               ucnv_setToUCallBack(conv, 
UCNV_TO_U_CALLBACK_SKIP, UCNV_SKIP_STOP_ON_ILLEGAL, NULL, NULL, &status);
                        break;
 
                case ZEND_CONV_ERROR_SUBST:
-                       ucnv_setFromUCallBack(conv, 
UCNV_FROM_U_CALLBACK_SUBSTITUTE, UCNV_SUB_STOP_ON_ILLEGAL, NULL, NULL, &status);
+                       if (direction == ZEND_FROM_UNICODE)
+                               ucnv_setFromUCallBack(conv, 
UCNV_FROM_U_CALLBACK_SUBSTITUTE, UCNV_SUB_STOP_ON_ILLEGAL, NULL, NULL, &status);
+                       else
+                               ucnv_setToUCallBack(conv, 
UCNV_TO_U_CALLBACK_SUBSTITUTE, UCNV_SUB_STOP_ON_ILLEGAL, NULL, NULL, &status);
                        break;
 
                case ZEND_CONV_ERROR_ESCAPE_UNICODE:
-                       ucnv_setFromUCallBack(conv, 
UCNV_FROM_U_CALLBACK_ESCAPE, UCNV_ESCAPE_UNICODE, NULL, NULL, &status);
+                       if (direction == ZEND_FROM_UNICODE)
+                               ucnv_setFromUCallBack(conv, 
UCNV_FROM_U_CALLBACK_ESCAPE, UCNV_ESCAPE_UNICODE, NULL, NULL, &status);
+                       else
+                               ucnv_setToUCallBack(conv, 
UCNV_TO_U_CALLBACK_ESCAPE, UCNV_ESCAPE_UNICODE, NULL, NULL, &status);
                        break;
 
                case ZEND_CONV_ERROR_ESCAPE_ICU:
-                       ucnv_setFromUCallBack(conv, 
UCNV_FROM_U_CALLBACK_ESCAPE, UCNV_ESCAPE_ICU, NULL, NULL, &status);
+                       if (direction == ZEND_FROM_UNICODE)
+                               ucnv_setFromUCallBack(conv, 
UCNV_FROM_U_CALLBACK_ESCAPE, UCNV_ESCAPE_ICU, NULL, NULL, &status);
+                       else
+                               ucnv_setToUCallBack(conv, 
UCNV_TO_U_CALLBACK_ESCAPE, UCNV_ESCAPE_ICU, NULL, NULL, &status);
                        break;
 
                case ZEND_CONV_ERROR_ESCAPE_JAVA:
-                       ucnv_setFromUCallBack(conv, 
UCNV_FROM_U_CALLBACK_ESCAPE, UCNV_ESCAPE_JAVA, NULL, NULL, &status);
+                       if (direction == ZEND_FROM_UNICODE)
+                               ucnv_setFromUCallBack(conv, 
UCNV_FROM_U_CALLBACK_ESCAPE, UCNV_ESCAPE_JAVA, NULL, NULL, &status);
+                       else
+                               /*
+                                * use C escape, even though JAVA is requested, 
so that we don't
+                                * have to expose another constant
+                                */
+                               ucnv_setToUCallBack(conv, 
UCNV_TO_U_CALLBACK_ESCAPE, UCNV_ESCAPE_C, NULL, NULL, &status);
                        break;
 
                case ZEND_CONV_ERROR_ESCAPE_XML_DEC:
-                       ucnv_setFromUCallBack(conv, 
UCNV_FROM_U_CALLBACK_ESCAPE, UCNV_ESCAPE_XML_DEC, NULL, NULL, &status);
+                       if (direction == ZEND_FROM_UNICODE)
+                               ucnv_setFromUCallBack(conv, 
UCNV_FROM_U_CALLBACK_ESCAPE, UCNV_ESCAPE_XML_DEC, NULL, NULL, &status);
+                       else
+                               ucnv_setToUCallBack(conv, 
UCNV_TO_U_CALLBACK_ESCAPE, UCNV_ESCAPE_XML_DEC, NULL, NULL, &status);
                        break;
 
                case ZEND_CONV_ERROR_ESCAPE_XML_HEX:
-                       ucnv_setFromUCallBack(conv, 
UCNV_FROM_U_CALLBACK_ESCAPE, UCNV_ESCAPE_XML_HEX, NULL, NULL, &status);
+                       if (direction == ZEND_FROM_UNICODE)
+                               ucnv_setFromUCallBack(conv, 
UCNV_FROM_U_CALLBACK_ESCAPE, UCNV_ESCAPE_XML_HEX, NULL, NULL, &status);
+                       else
+                               ucnv_setToUCallBack(conv, 
UCNV_TO_U_CALLBACK_ESCAPE, UCNV_ESCAPE_XML_HEX, NULL, NULL, &status);
                        break;
 
                default:
@@ -164,7 +192,7 @@
 /* }}} */
 
 /* {{{ zend_convert_to_unicode */
-ZEND_API void zend_convert_to_unicode(UConverter *conv, UChar **target, int 
*target_len, const char *source, int source_len, UErrorCode *status)
+ZEND_API int zend_convert_to_unicode(UConverter *conv, UChar **target, int 
*target_len, const char *source, int source_len, UErrorCode *status)
 {
        UChar *buffer = NULL;
        UChar *output;
@@ -174,7 +202,7 @@
        UConverterType conv_type;
 
        if (U_FAILURE(*status)) {
-               return;
+               return 0;
        }
 
        ucnv_resetToUnicode(conv);
@@ -230,6 +258,8 @@
        buffer[converted] = 0;
        *target = buffer;
        *target_len = converted;
+
+       return input - source;
 }
 /* }}} */
 
@@ -326,21 +356,23 @@
 /* }}} */
 
 /* {{{ zend_raise_conversion_error_ex */
-ZEND_API void zend_raise_conversion_error_ex(char *message, UConverter *conv, 
int error_char_offset, int use_exception TSRMLS_DC)
+ZEND_API void zend_raise_conversion_error_ex(char *message, UConverter *conv, 
zend_conv_direction dir, int error_char_offset, int use_exception TSRMLS_DC)
 {
-       UChar err_char[U16_MAX_LENGTH];
-       int8_t err_char_len = sizeof(err_char);
-       UChar32 codepoint;
        const char *conv_name;
        UErrorCode status = U_ZERO_ERROR;
-       char *reason_fmt = "%s (converter %s failed on character {U+%04X} at 
offset %d)";
-       char *no_reason_fmt = "%s";
-       char *message_fmt;
 
        if (!message)
                return;
 
-       ucnv_getInvalidUChars(conv, err_char, &err_char_len, &status);
+       if (!conv) {
+               if (use_exception) {
+                       zend_throw_exception_ex(unicodeConversionException, 0 
TSRMLS_CC, "%s", message);
+               } else {
+                       zend_error(E_WARNING, "%s", message);
+               }
+               return;
+       }
+
        conv_name = ucnv_getName(conv, &status);
        /*
         * UTODO
@@ -348,15 +380,42 @@
         * internal converter name? ponder
         */
        conv_name = ucnv_getStandardName(conv_name, "MIME", &status);
-       codepoint = (err_char_len < 2) ? err_char[0] : 
U16_GET_SUPPLEMENTARY(err_char[0], err_char[1]);
-       ;
+       status = U_ZERO_ERROR;
+
+       if (dir == ZEND_FROM_UNICODE) {
+               UChar err_char[U16_MAX_LENGTH];
+               int8_t err_char_len = sizeof(err_char);
+               UChar32 codepoint;
+               char *message_fmt = "%s (converter %s failed on character 
{U+%04X} at offset %d)";
 
-       message_fmt = conv ? reason_fmt : no_reason_fmt;
+               ucnv_getInvalidUChars(conv, err_char, &err_char_len, &status);
+               codepoint = (err_char_len < 2) ? err_char[0] : 
U16_GET_SUPPLEMENTARY(err_char[0], err_char[1]);
 
-       if (use_exception) {
-               zend_throw_exception_ex(unicodeConversionException, 0 
TSRMLS_CC, message_fmt, message, conv_name?conv_name:"<unknown>", codepoint, 
error_char_offset);
+               if (use_exception) {
+                       zend_throw_exception_ex(unicodeConversionException, 0 
TSRMLS_CC, message_fmt, message, conv_name?conv_name:"<unknown>", codepoint, 
error_char_offset-1);
+               } else {
+                       zend_error(E_WARNING, message_fmt, message, 
conv_name?conv_name:"", codepoint, error_char_offset-1);
+               }
        } else {
-               zend_error(E_WARNING, message_fmt, message, 
conv_name?conv_name:"", codepoint, error_char_offset);
+               char err_char[8]; /* UTF-8 uses up to 8 bytes */
+               char buf[32];     /* 4x number of error bytes */
+               int8_t err_char_len = sizeof(err_char);
+               char *message_fmt = "%s (converter %s failed on bytes (%s) at 
offset %d)";
+               char *p;
+               int i;
+
+               ucnv_getInvalidChars(conv, err_char, &err_char_len, &status);
+               p = buf;
+               for (i = 0; i < err_char_len; i++) {
+                       sprintf(p, "0x%02X%s", (unsigned char)err_char[i], 
(i+1<err_char_len)?",":"");
+                       p += 5;
+               }
+
+               if (use_exception) {
+                       zend_throw_exception_ex(unicodeConversionException, 0 
TSRMLS_CC, message_fmt, message, conv_name?conv_name:"<unknown>", buf, 
error_char_offset-err_char_len);
+               } else {
+                       zend_error(E_WARNING, message_fmt, message, 
conv_name?conv_name:"", buf, error_char_offset-err_char_len);
+               }
        }
 }
 /* }}} */
@@ -376,14 +435,14 @@
        num_conv = zend_convert_from_unicode(conv, &s, &s_len, u, u_len, 
&status);
 
        if (U_FAILURE(status)) {
-               int32_t offset = u_countChar32(u, num_conv)-1;
+               int32_t offset = u_countChar32(u, num_conv);
 
                /* XXX needs to be fixed, but a leak is better than invalid 
memory
                if (s) {
                        efree(s);
                }
                */
-               zend_raise_conversion_error_ex("Could not convert Unicode 
string to binary string", conv, offset, (UG(from_error_mode) & 
ZEND_CONV_ERROR_EXCEPTION) TSRMLS_CC);
+               zend_raise_conversion_error_ex("Could not convert Unicode 
string to binary string", conv, ZEND_FROM_UNICODE, offset, (UG(from_error_mode) 
& ZEND_CONV_ERROR_EXCEPTION) TSRMLS_CC);
                retval = FAILURE;
        }
 
@@ -400,19 +459,20 @@
        UErrorCode status = U_ZERO_ERROR;
        int retval = TRUE;
        UChar *u = NULL;
-       int u_len;
+       int u_len, num_conv;
 
        char *s = Z_STRVAL_P(string);
        int s_len = Z_STRLEN_P(string);
 
-       Z_TYPE_P(string) = IS_UNICODE;
-       zend_convert_to_unicode(conv, &u, &u_len, s, s_len, &status);
-       ZVAL_UNICODEL(string, u, u_len, 0);
+       num_conv = zend_convert_to_unicode(conv, &u, &u_len, s, s_len, &status);
 
        if (U_FAILURE(status)) {
+               zend_raise_conversion_error_ex("Could not convert binary string 
to Unicode string", conv, ZEND_TO_UNICODE, num_conv, (UG(to_error_mode) & 
ZEND_CONV_ERROR_EXCEPTION) TSRMLS_CC);
                retval = FALSE;
        }
 
+       ZVAL_UNICODEL(string, u, u_len, 0);
+
        efree(s);
        return retval;
 }
http://cvs.php.net/viewcvs.cgi/ZendEngine2/zend_unicode.h?r1=1.12&r2=1.13&diff_format=u
Index: ZendEngine2/zend_unicode.h
diff -u ZendEngine2/zend_unicode.h:1.12 ZendEngine2/zend_unicode.h:1.13
--- ZendEngine2/zend_unicode.h:1.12     Sun Mar 26 01:48:33 2006
+++ ZendEngine2/zend_unicode.h  Sun Mar 26 06:19:24 2006
@@ -54,15 +54,15 @@
 /* internal functions */
 
 int zend_set_converter_encoding(UConverter **converter, const char *encoding);
+void zend_set_converter_error_mode(UConverter *conv, zend_conv_direction dir, 
uint16_t error_mode);
 void zend_set_converter_subst_char(UConverter *conv, UChar *subst_char);
-void zend_set_converter_error_mode(UConverter *conv, uint8_t error_mode);
 void zend_register_unicode_exceptions(TSRMLS_D);
 void zend_update_converters_error_behavior(TSRMLS_D);
 
 
 /* API functions */
 
-ZEND_API void zend_convert_to_unicode(UConverter *conv, UChar **target, int 
*target_len, const char *source, int source_len, UErrorCode *status);
+ZEND_API int zend_convert_to_unicode(UConverter *conv, UChar **target, int 
*target_len, const char *source, int source_len, UErrorCode *status);
 ZEND_API int zend_convert_from_unicode(UConverter *conv, char **target, int 
*target_len, const UChar *source, int source_len, UErrorCode *status);
 ZEND_API void zend_convert_encodings(UConverter *target_conv, UConverter 
*source_conv, char **target, int *target_len, const char *source, int 
source_len, UErrorCode *status);
 ZEND_API int zval_string_to_unicode_ex(zval *string, UConverter *conv);
@@ -78,8 +78,8 @@
 ZEND_API int zend_normalize_identifier(UChar **dest, int *dest_len, UChar 
*ident, int ident_len, zend_bool fold_case);
 
 #define zend_raise_conversion_error(message, exception) \
-       zend_raise_conversion_error_ex(message, NULL, 0, exception TSRMLS_CC)
-ZEND_API void zend_raise_conversion_error_ex(char *message, UConverter *conv, 
int error_char_offset, int use_exception TSRMLS_DC);
+       zend_raise_conversion_error_ex(message, NULL, 0, 0, exception TSRMLS_CC)
+ZEND_API void zend_raise_conversion_error_ex(char *message, UConverter *conv, 
zend_conv_direction dir, int error_char_offset, int use_exception TSRMLS_DC);
 
 /*
  * Function to get a codepoint at position n. Iterates over codepoints 
starting from the
http://cvs.php.net/viewcvs.cgi/php-src/ext/unicode/unicode.c?r1=1.14&r2=1.15&diff_format=u
Index: php-src/ext/unicode/unicode.c
diff -u php-src/ext/unicode/unicode.c:1.14 php-src/ext/unicode/unicode.c:1.15
--- php-src/ext/unicode/unicode.c:1.14  Sun Mar 26 03:33:10 2006
+++ php-src/ext/unicode/unicode.c       Sun Mar 26 06:19:24 2006
@@ -15,7 +15,7 @@
   +----------------------------------------------------------------------+
 */
 
-/* $Id: unicode.c,v 1.14 2006/03/26 03:33:10 andrei Exp $ */ 
+/* $Id: unicode.c,v 1.15 2006/03/26 06:19:24 andrei Exp $ */ 
 
 #include "php_unicode.h"
 #if HAVE_UNICODE
@@ -136,6 +136,8 @@
 
        if (direction == ZEND_FROM_UNICODE) {
                UG(from_error_mode) = mode;
+       } else {
+               UG(to_error_mode)   = mode;
        }
 
        zend_update_converters_error_behavior(TSRMLS_C);
@@ -143,25 +145,17 @@
 }
 /* }}} */
 
-/* {{{ proto bool unicode_set_subst_char(int direction, string character) U
-   Sets global substitution character for the specified conversion direction */
+/* {{{ proto bool unicode_set_subst_char(string character) U
+   Sets global substitution character for conversion from Unicode to codepage 
*/
 PHP_FUNCTION(unicode_set_subst_char)
 {
-       zend_conv_direction direction;
        UChar *subst_char;
        UChar32 cp;
-       int subst_char_len;
-       long tmp;
+       int subst_char_len, len;
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "lu", &tmp, 
&subst_char, &subst_char_len) == FAILURE) {
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "u", &subst_char, 
&subst_char_len) == FAILURE) {
                return;
        }
-       direction = (zend_conv_direction) tmp;
-
-       if (direction != ZEND_FROM_UNICODE && direction != ZEND_TO_UNICODE) {
-               php_error(E_WARNING, "Invalid conversion direction value");
-               RETURN_FALSE;
-       }
 
        if (subst_char_len < 1 ) {
                php_error(E_WARNING, "Empty substitution character");
@@ -175,12 +169,8 @@
                RETURN_FALSE;
        }
 
-       if (direction == ZEND_FROM_UNICODE) {
-               int len;
-               len = zend_codepoint_to_uchar(cp, UG(from_subst_char));
-               UG(from_subst_char)[len] = 0;
-       }
-
+       len = zend_codepoint_to_uchar(cp, UG(from_subst_char));
+       UG(from_subst_char)[len] = 0;
        zend_update_converters_error_behavior(TSRMLS_C);
        RETURN_TRUE;
 }
http://cvs.php.net/viewcvs.cgi/php-src/main/main.c?r1=1.682&r2=1.683&diff_format=u
Index: php-src/main/main.c
diff -u php-src/main/main.c:1.682 php-src/main/main.c:1.683
--- php-src/main/main.c:1.682   Sun Mar 26 01:48:33 2006
+++ php-src/main/main.c Sun Mar 26 06:19:24 2006
@@ -18,7 +18,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: main.c,v 1.682 2006/03/26 01:48:33 andrei Exp $ */
+/* $Id: main.c,v 1.683 2006/03/26 06:19:24 andrei Exp $ */
 
 /* {{{ includes
  */
@@ -220,7 +220,7 @@
                UG(output_encoding_conv) = NULL;
        }
        if (UG(output_encoding_conv)) {
-               zend_set_converter_error_mode(UG(output_encoding_conv), 
UG(from_error_mode));
+               zend_set_converter_error_mode(UG(output_encoding_conv), 
ZEND_FROM_UNICODE, UG(from_error_mode));
                zend_set_converter_subst_char(UG(output_encoding_conv), 
UG(from_subst_char));
                if (stage == ZEND_INI_STAGE_RUNTIME) {
                        sapi_update_default_charset(TSRMLS_C);
http://cvs.php.net/viewcvs.cgi/php-src/main/streams/filter.c?r1=1.26&r2=1.27&diff_format=u
Index: php-src/main/streams/filter.c
diff -u php-src/main/streams/filter.c:1.26 php-src/main/streams/filter.c:1.27
--- php-src/main/streams/filter.c:1.26  Sun Mar 26 01:48:33 2006
+++ php-src/main/streams/filter.c       Sun Mar 26 06:19:24 2006
@@ -16,7 +16,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: filter.c,v 1.26 2006/03/26 01:48:33 andrei Exp $ */
+/* $Id: filter.c,v 1.27 2006/03/26 06:19:24 andrei Exp $ */
 
 #include "php.h"
 #include "php_globals.h"
@@ -710,9 +710,9 @@
 
                        num_conv = zend_convert_from_unicode(conv, &dest, 
&destlen, bucket->buf.u, bucket->buflen, &status);
                        if (U_FAILURE(status)) {
-                               int32_t offset = u_countChar32(bucket->buf.u, 
num_conv)-1;
+                               int32_t offset = u_countChar32(bucket->buf.u, 
num_conv);
 
-                               zend_raise_conversion_error_ex("Could not 
convert Unicode string to binary string", conv, offset, (UG(from_error_mode) & 
ZEND_CONV_ERROR_EXCEPTION) TSRMLS_CC);
+                               zend_raise_conversion_error_ex("Could not 
convert Unicode string to binary string", conv, ZEND_FROM_UNICODE, offset, 
(UG(from_error_mode) & ZEND_CONV_ERROR_EXCEPTION) TSRMLS_CC);
                        }
 
                        if (bucket->own_buf) {
http://cvs.php.net/viewcvs.cgi/php-src/main/streams/streams.c?r1=1.113&r2=1.114&diff_format=u
Index: php-src/main/streams/streams.c
diff -u php-src/main/streams/streams.c:1.113 
php-src/main/streams/streams.c:1.114
--- php-src/main/streams/streams.c:1.113        Sun Mar 26 01:48:33 2006
+++ php-src/main/streams/streams.c      Sun Mar 26 06:19:24 2006
@@ -19,7 +19,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: streams.c,v 1.113 2006/03/26 01:48:33 andrei Exp $ */
+/* $Id: streams.c,v 1.114 2006/03/26 06:19:24 andrei Exp $ */
 
 #define _GNU_SOURCE
 #include "php.h"
@@ -1261,9 +1261,9 @@
 
                num_conv = zend_convert_from_unicode(stream->output_encoding, 
&dest, &destlen, buf.u, buflen, &status);
                if (U_FAILURE(status)) {
-                       int32_t offset = u_countChar32(buf.u, num_conv)-1;
+                       int32_t offset = u_countChar32(buf.u, num_conv);
 
-                       zend_raise_conversion_error_ex("Could not convert 
Unicode string to binary string", stream->output_encoding, offset, 
(UG(from_error_mode) & ZEND_CONV_ERROR_EXCEPTION) TSRMLS_CC);
+                       zend_raise_conversion_error_ex("Could not convert 
Unicode string to binary string", stream->output_encoding, ZEND_FROM_UNICODE, 
offset, (UG(from_error_mode) & ZEND_CONV_ERROR_EXCEPTION) TSRMLS_CC);
                }
                freeme = buf.s = dest;
                buflen = destlen;
@@ -2293,7 +2293,7 @@
                                }
                        } else {
                                /* UTODO: (Maybe?) Allow overriding the default 
error handlers on a per-stream basis via context params */
-                               
zend_set_converter_error_mode(stream->output_encoding, UG(from_error_mode));
+                               
zend_set_converter_error_mode(stream->output_encoding, ZEND_FROM_UNICODE, 
UG(from_error_mode));
                                
zend_set_converter_subst_char(stream->output_encoding, UG(from_subst_char));
                        }
                }

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

Reply via email to