mirror of
https://github.com/php/php-src.git
synced 2024-09-23 10:57:26 +00:00
transliterate()
This commit is contained in:
parent
b5f20ceb48
commit
a093762a6f
@ -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)
|
||||
|
@ -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');
|
||||
|
34
ext/unicode/php_transform.h
Normal file
34
ext/unicode/php_transform.h
Normal file
@ -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
|
||||
*/
|
112
ext/unicode/transform.c
Normal file
112
ext/unicode/transform.c
Normal file
@ -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
|
||||
*/
|
@ -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 }
|
||||
};
|
||||
/* }}} */
|
||||
|
Loading…
Reference in New Issue
Block a user