]> granicus.if.org Git - php/commitdiff
transliterate()
authorAndrei Zmievski <andrei@php.net>
Tue, 13 Jun 2006 23:46:04 +0000 (23:46 +0000)
committerAndrei Zmievski <andrei@php.net>
Tue, 13 Jun 2006 23:46:04 +0000 (23:46 +0000)
ext/unicode/config.m4
ext/unicode/config.w32
ext/unicode/php_transform.h [new file with mode: 0644]
ext/unicode/transform.c [new file with mode: 0644]
ext/unicode/unicode.c

index 127d95095963618475e8a123e1b6891f620698bb..1806e51a8a898e08180812d90b04e021c99a262e 100644 (file)
@@ -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)
index edc41151a6834a5dc13144d6473d13643b9ebcf5..8dd662962a0359042df5a67e4cf1bbbc86d4f89c 100644 (file)
@@ -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 (file)
index 0000000..4111844
--- /dev/null
@@ -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 (file)
index 0000000..bad23ff
--- /dev/null
@@ -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
+ */
index 26c3fa1ad89e45cdb4e152ffbd96a472b4154edd..4611eea89960f036ea84ab49953179fb2e2cb5ae 100644 (file)
@@ -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 }
 };
 /* }}} */