summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Zend/zend_ini.c40
-rw-r--r--Zend/zend_ini.h1
-rw-r--r--unicode-progress.txt1
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()