Index: Zend/zend_unicode.c =================================================================== RCS file: /repository/ZendEngine2/zend_unicode.c,v retrieving revision 1.27 diff -u -p -r1.27 zend_unicode.c --- Zend/zend_unicode.c 1 Aug 2006 21:49:57 -0000 1.27 +++ Zend/zend_unicode.c 7 Aug 2006 15:29:49 -0000 @@ -537,32 +537,53 @@ ZEND_API void zend_raise_conversion_erro } /* }}} */ -/* {{{ zval_unicode_to_string_ex */ -ZEND_API int zval_unicode_to_string_ex(zval *string, UConverter *conv TSRMLS_DC) +/* {{{ zend_unicode_to_string_ex */ +ZEND_API int zend_unicode_to_string_ex(UChar *u, int u_len, char **s, int *s_len, UConverter *conv TSRMLS_DC) { UErrorCode status = U_ZERO_ERROR; - char *s = NULL; - int s_len; int num_conv; - UChar *u = Z_USTRVAL_P(string); - int u_len = Z_USTRLEN_P(string); - - num_conv = zend_convert_from_unicode(conv, &s, &s_len, u, u_len, &status); + 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); zend_raise_conversion_error_ex("Could not convert Unicode string to binary string", conv, ZEND_FROM_UNICODE, offset TSRMLS_CC); - if (s) { - efree(s); + if (*s) { + efree(*s); } - ZVAL_EMPTY_STRING(string); - efree((UChar*)u); + *s = STR_EMPTY_ALLOC(); + *s_len = 0; return FAILURE; } else { + return SUCCESS; + } +} +/* }}} */ + +/* {{{ zend_unicode_to_string */ +ZEND_API int zend_unicode_to_string(UChar *u, int u_len, char **s, int *s_len TSRMLS_DC) +{ + return zend_unicode_to_string_ex(u, u_len, s, s_len, ZEND_U_CONVERTER(UG(runtime_encoding_conv)) TSRMLS_CC); +} +/* }}} */ + +/* {{{ zval_unicode_to_string_ex */ +ZEND_API int zval_unicode_to_string_ex(zval *string, UConverter *conv TSRMLS_DC) +{ + char *s = NULL; + int s_len; + + UChar *u = Z_USTRVAL_P(string); + int u_len = Z_USTRLEN_P(string); + + if (zend_unicode_to_string_ex(u, u_len, &s, &s_len, conv TSRMLS_CC) == SUCCESS) { ZVAL_STRINGL(string, s, s_len, 0); efree((UChar*)u); + return FAILURE; + } else { + ZVAL_EMPTY_STRING(string); + efree((UChar*)u); return SUCCESS; } } @@ -575,30 +596,52 @@ ZEND_API int zval_unicode_to_string(zval } /* }}} */ -/* {{{ zval_string_to_unicode_ex */ -ZEND_API int zval_string_to_unicode_ex(zval *string, UConverter *conv TSRMLS_DC) +/* {{{ zend_string_to_unicode_ex */ +ZEND_API int zend_string_to_unicode_ex(char *s, int s_len, UChar **u, int *u_len, UConverter *conv TSRMLS_DC) { UErrorCode status = U_ZERO_ERROR; - UChar *u = NULL; - int u_len, num_conv; - - char *s = Z_STRVAL_P(string); - int s_len = Z_STRLEN_P(string); + int num_conv; - num_conv = zend_convert_to_unicode(conv, &u, &u_len, s, s_len, &status); + 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 TSRMLS_CC); - if (u) { - efree(u); + if (*u) { + efree(*u); } - ZVAL_EMPTY_UNICODE(string); - efree(s); + *u = USTR_MAKE(""); + *u_len = 0; return FAILURE; } else { + return SUCCESS; + } +} +/* }}} */ + +/* {{{ zend_string_to_unicode */ +ZEND_API int zend_string_to_unicode(char *s, int s_len, UChar **u, int *u_len TSRMLS_DC) +{ + return zend_string_to_unicode_ex(s, s_len, u, u_len, ZEND_U_CONVERTER(UG(runtime_encoding_conv)) TSRMLS_CC); +} +/* }}} */ + +/* {{{ zval_string_to_unicode_ex */ +ZEND_API int zval_string_to_unicode_ex(zval *string, UConverter *conv TSRMLS_DC) +{ + UChar *u = NULL; + int u_len; + + char *s = Z_STRVAL_P(string); + int s_len = Z_STRLEN_P(string); + + if (zend_string_to_unicode_ex(s, s_len, &u, &u_len, conv TSRMLS_CC) == SUCCESS) { ZVAL_UNICODEL(string, u, u_len, 0); efree(s); return SUCCESS; + } else { + ZVAL_EMPTY_UNICODE(string); + efree(s); + return FAILURE; } } /* }}} */ Index: Zend/zend_unicode.h =================================================================== RCS file: /repository/ZendEngine2/zend_unicode.h,v retrieving revision 1.20 diff -u -p -r1.20 zend_unicode.h --- Zend/zend_unicode.h 14 Jul 2006 10:31:32 -0000 1.20 +++ Zend/zend_unicode.h 7 Aug 2006 15:29:49 -0000 @@ -76,6 +76,11 @@ ZEND_API int zend_convert_from_unicode(U 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 char* zend_unicode_to_ascii(const UChar *us, int us_len TSRMLS_DC); +ZEND_API int zend_string_to_unicode_ex(char *s, int s_len, UChar **u, int *u_len, UConverter *conv TSRMLS_DC); +ZEND_API int zend_string_to_unicode(char *s, int s_len, UChar **u, int *u_len TSRMLS_DC); +ZEND_API int zend_unicode_to_string_ex(UChar *u, int u_len, char **s, int *s_len, UConverter *conv TSRMLS_DC); +ZEND_API int zend_unicode_to_string(UChar *u, int u_len, char **s, int *s_len TSRMLS_DC); + ZEND_API int zval_string_to_unicode_ex(zval *string, UConverter *conv TSRMLS_DC); ZEND_API int zval_string_to_unicode(zval *string TSRMLS_DC); ZEND_API int zval_unicode_to_string_ex(zval *string, UConverter *conv TSRMLS_DC);