diff options
-rw-r--r-- | Zend/zend_ini.c | 40 | ||||
-rw-r--r-- | Zend/zend_ini.h | 1 | ||||
-rw-r--r-- | unicode-progress.txt | 1 |
3 files changed, 42 insertions, 0 deletions
diff --git a/Zend/zend_ini.c b/Zend/zend_ini.c index d46cd9db46..3ef92be5f1 100644 --- a/Zend/zend_ini.c +++ b/Zend/zend_ini.c @@ -589,6 +589,46 @@ ZEND_API ZEND_INI_MH(OnUpdateStringUnempty) return SUCCESS; } +ZEND_API ZEND_INI_MH(OnUpdateUTF8String) +{ + UChar **p; + UChar *ustr = NULL; + int32_t ustr_len, capacity; + UErrorCode status = U_ZERO_ERROR; +#ifndef ZTS + char *base = (char *) mh_arg2; +#else + char *base; + + base = (char *) ts_resource(*((int *) mh_arg2)); +#endif + + /* 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; + } + + p = (UChar **) (base+(size_t) mh_arg1); + + *p = ustr; + return SUCCESS; +} + /* * Local variables: * tab-width: 4 diff --git a/Zend/zend_ini.h b/Zend/zend_ini.h index 7234a0be2e..8dcb0b0907 100644 --- a/Zend/zend_ini.h +++ b/Zend/zend_ini.h @@ -178,6 +178,7 @@ ZEND_API ZEND_INI_MH(OnUpdateLong); ZEND_API ZEND_INI_MH(OnUpdateReal); ZEND_API ZEND_INI_MH(OnUpdateString); ZEND_API ZEND_INI_MH(OnUpdateStringUnempty); +ZEND_API ZEND_INI_MH(OnUpdateUTF8String); END_EXTERN_C() #define ZEND_INI_DISPLAY_ORIG 1 diff --git a/unicode-progress.txt b/unicode-progress.txt index c8ba7af02b..867665eaf3 100644 --- a/unicode-progress.txt +++ b/unicode-progress.txt @@ -575,6 +575,7 @@ ext/standard implode() levenshtein() localeconv() + metaphone() money_format() nl_langinfo() nl2br() |