summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ext/unicode/config.m42
-rw-r--r--ext/unicode/config.w322
-rw-r--r--ext/unicode/php_transform.h34
-rw-r--r--ext/unicode/transform.c112
-rw-r--r--ext/unicode/unicode.c5
5 files changed, 153 insertions, 2 deletions
diff --git a/ext/unicode/config.m4 b/ext/unicode/config.m4
index 127d950959..1806e51a8a 100644
--- a/ext/unicode/config.m4
+++ b/ext/unicode/config.m4
@@ -4,4 +4,4 @@ dnl
PHP_SUBST(UNICODE_SHARED_LIBADD)
AC_DEFINE(HAVE_UNICODE, 1, [ ])
-PHP_NEW_EXTENSION(unicode, unicode.c locale.c unicode_iterators.c collator.c property.c constants.c, $ext_shared)
+PHP_NEW_EXTENSION(unicode, unicode.c locale.c unicode_iterators.c collator.c property.c constants.c transform.c, $ext_shared)
diff --git a/ext/unicode/config.w32 b/ext/unicode/config.w32
index edc41151a6..8dd662962a 100644
--- a/ext/unicode/config.w32
+++ b/ext/unicode/config.w32
@@ -1,5 +1,5 @@
// $Id$
// vim:ft=javascript
-EXTENSION("unicode", "unicode.c unicode_iterators.c collator.c locale.c property.c constants.c", false);
+EXTENSION("unicode", "unicode.c unicode_iterators.c collator.c locale.c property.c constants.c transform.c", false);
AC_DEFINE('HAVE_UNICODE', 1, 'ICU API extension');
diff --git a/ext/unicode/php_transform.h b/ext/unicode/php_transform.h
new file mode 100644
index 0000000000..41118447d7
--- /dev/null
+++ b/ext/unicode/php_transform.h
@@ -0,0 +1,34 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP Version 6 |
+ +----------------------------------------------------------------------+
+ | This source file is subject to version 3.01 of the PHP license, |
+ | that is bundled with this package in the file LICENSE, and is |
+ | available through the world-wide-web at the following url: |
+ | http://www.php.net/license/3_01.txt |
+ | If you did not receive a copy of the PHP license and are unable to |
+ | obtain it through the world-wide-web, please send a note to |
+ | license@php.net so we can mail you a copy immediately. |
+ +----------------------------------------------------------------------+
+ | Authors: Andrei Zmievski <andrei@php.net> |
+ +----------------------------------------------------------------------+
+*/
+
+/* $Id$ */
+
+#ifndef PHP_TRANSFORM_H
+#define PHP_TRANSFORM_H
+
+PHP_FUNCTION(transliterate);
+
+#endif /* PHP_TRANSFORM_H */
+
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ * vim600: noet sw=4 ts=4 fdm=marker
+ * vim<600: noet sw=4 ts=4
+ */
diff --git a/ext/unicode/transform.c b/ext/unicode/transform.c
new file mode 100644
index 0000000000..bad23ff66f
--- /dev/null
+++ b/ext/unicode/transform.c
@@ -0,0 +1,112 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP Version 6 |
+ +----------------------------------------------------------------------+
+ | This source file is subject to version 3.01 of the PHP license, |
+ | that is bundled with this package in the file LICENSE, and is |
+ | available through the world-wide-web at the following url: |
+ | http://www.php.net/license/3_01.txt |
+ | If you did not receive a copy of the PHP license and are unable to |
+ | obtain it through the world-wide-web, please send a note to |
+ | license@php.net so we can mail you a copy immediately. |
+ +----------------------------------------------------------------------+
+ | Authors: Andrei Zmievski <andrei@php.net> |
+ +----------------------------------------------------------------------+
+ */
+
+/* $Id$ */
+
+#include "php_unicode.h"
+
+PHP_FUNCTION(transliterate)
+{
+ UChar *str, *from, *to, *variant = NULL;
+ int str_len, from_len, to_len, variant_len = 0;
+ UChar id[256];
+ int id_len;
+ UChar *result = NULL;
+ int result_len = 0;
+ UTransliterator *trans = NULL;
+ UErrorCode status = U_ZERO_ERROR;
+ int32_t capacity, start, limit;
+
+ /*
+ {
+
+ char *str;
+ int32_t str_len;
+ UEnumeration *ids;
+
+ ids = utrans_openIDs(&status);
+ printf("%d\n", uenum_count(ids, &status));
+ str = (char*)uenum_next(ids, &str_len, &status);
+ while (str) {
+ printf("id: %s\n", str);
+ str = (char*)uenum_next(ids, &str_len, &status);
+ }
+ uenum_close(ids);
+ }
+
+ return;
+ */
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "uuu|u", &str,
+ &str_len, &from, &from_len, &to, &to_len,
+ &variant, &variant_len) == FAILURE) {
+ return;
+ }
+
+ if (variant) {
+ id_len = u_snprintf(id, sizeof(id)-1, "%S-%S/%S", from, to, variant);
+ } else {
+ id_len = u_snprintf(id, sizeof(id)-1, "%S-%S", from, to);
+ }
+
+ if (id_len < 0) {
+ php_error_docref("", E_WARNING, "Transliterator ID too long");
+ return;
+ }
+
+ id[id_len] = 0;
+
+ trans = utrans_openU(id, id_len, UTRANS_FORWARD, NULL, 0, NULL, &status);
+ if (U_FAILURE(status)) {
+ php_error_docref("", E_WARNING, "Failed to create transliterator");
+ return;
+ }
+
+ result = eustrndup(str, str_len);
+ result_len = limit = str_len;
+ capacity = str_len + 1;
+
+ while (1) {
+ utrans_transUChars(trans, result, &result_len, capacity, 0, &limit, &status);
+ if (status == U_BUFFER_OVERFLOW_ERROR) {
+ result = eurealloc(result, result_len + 1);
+ memcpy(result, str, UBYTES(str_len));
+ capacity = result_len + 1;
+ result_len = limit = str_len;
+ status = U_ZERO_ERROR;
+ utrans_transUChars(trans, result, &result_len, capacity, 0, &limit, &status);
+ } else {
+ if (status == U_STRING_NOT_TERMINATED_WARNING) {
+ result = eurealloc(result, result_len + 1);
+ }
+ break;
+ }
+ }
+
+ result[result_len] = 0;
+ utrans_close(trans);
+
+ RETURN_UNICODEL(result, result_len, 0);
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ * vim600: noet sw=4 ts=4 fdm=marker
+ * vim<600: noet sw=4 ts=4
+ */
diff --git a/ext/unicode/unicode.c b/ext/unicode/unicode.c
index 26c3fa1ad8..4611eea899 100644
--- a/ext/unicode/unicode.c
+++ b/ext/unicode/unicode.c
@@ -20,6 +20,7 @@
#include "php_unicode.h"
#include "zend_unicode.h"
#include "php_property.h"
+#include "php_transform.h"
void php_register_unicode_iterators(TSRMLS_D);
@@ -298,6 +299,10 @@ zend_function_entry unicode_functions[] = {
PHP_FE(char_enum_names, NULL)
PHP_FE(char_enum_types, NULL)
+ /* text transformation functions */
+
+ PHP_FE(transliterate, NULL)
+
{ NULL, NULL, NULL }
};
/* }}} */