andrei Tue May 9 00:06:08 2006 UTC Modified files: /php-src/ext/unicode php_property.h property.c unicode.c Log: Add char_enum_names(). http://cvs.php.net/viewcvs.cgi/php-src/ext/unicode/php_property.h?r1=1.7&r2=1.8&diff_format=u Index: php-src/ext/unicode/php_property.h diff -u php-src/ext/unicode/php_property.h:1.7 php-src/ext/unicode/php_property.h:1.8 --- php-src/ext/unicode/php_property.h:1.7 Mon May 8 23:01:20 2006 +++ php-src/ext/unicode/php_property.h Tue May 9 00:06:08 2006 @@ -14,7 +14,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_property.h,v 1.7 2006/05/08 23:01:20 andrei Exp $ */ +/* $Id: php_property.h,v 1.8 2006/05/09 00:06:08 andrei Exp $ */ #ifndef PHP_PROPERTY_H #define PHP_PROPERTY_H @@ -83,6 +83,8 @@ PHP_FUNCTION(char_get_property_value_name); PHP_FUNCTION(char_get_property_value_from_name); +PHP_FUNCTION(char_enum_names); + #endif /* PHP_PROPERTY_H */ http://cvs.php.net/viewcvs.cgi/php-src/ext/unicode/property.c?r1=1.11&r2=1.12&diff_format=u Index: php-src/ext/unicode/property.c diff -u php-src/ext/unicode/property.c:1.11 php-src/ext/unicode/property.c:1.12 --- php-src/ext/unicode/property.c:1.11 Mon May 8 23:01:20 2006 +++ php-src/ext/unicode/property.c Tue May 9 00:06:08 2006 @@ -14,12 +14,19 @@ +----------------------------------------------------------------------+ */ -/* $Id: property.c,v 1.11 2006/05/08 23:01:20 andrei Exp $ */ +/* $Id: property.c,v 1.12 2006/05/09 00:06:08 andrei Exp $ */ #include "php_unicode.h" typedef UBool (*prop_check_func_t)(UChar32 ch); +typedef struct { + zval **args[4]; + void ***thread_ctx; + zend_fcall_info fci; + zend_fcall_info_cache fci_cache; +} char_enum_context_t; + static void check_property_impl(INTERNAL_FUNCTION_PARAMETERS, prop_check_func_t checker) { UChar *str; @@ -636,6 +643,115 @@ /* }}} */ + +/* {{{ Enumerator functions */ + +static UBool php_enum_char_names(void *context, + UChar32 code, + UCharNameChoice nameChoice, + const char *name, + int32_t length) +{ + char_enum_context_t *ctx = (char_enum_context_t *)context; + zval *retval_ptr = NULL; + int status; + UBool result = FALSE; + TSRMLS_FETCH_FROM_CTX(ctx->thread_ctx); + + /* + convert_to_long_ex(ctx->args[0]); + convert_to_bool_ex(ctx->args[1]); + convert_to_string_ex(ctx->args[2]); + */ + + ZVAL_LONG(*ctx->args[0], code); + ZVAL_BOOL(*ctx->args[1], nameChoice == U_EXTENDED_CHAR_NAME); + if (Z_USTRVAL_PP(ctx->args[2])) { + efree(Z_USTRVAL_PP(ctx->args[2])); + } + ZVAL_ASCII_STRINGL(*ctx->args[2], (char *)name, length, ZSTR_DUPLICATE); + + ctx->fci.retval_ptr_ptr = &retval_ptr; + + status = zend_call_function(&ctx->fci, &ctx->fci_cache TSRMLS_CC); + + if (status == SUCCESS && retval_ptr && !EG(exception)) { + convert_to_boolean(retval_ptr); + result = (UBool)Z_BVAL_P(retval_ptr); + } else { + if (!EG(exception)) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Enumeration callback encountered an error"); + } + result = FALSE; + } + if (retval_ptr) { + zval_ptr_dtor(&retval_ptr); + } + return result; +} + +PHP_FUNCTION(char_enum_names) +{ + zval *callback; + long start, limit; + zend_bool extended = FALSE; + zval *zcode, *zname, *zextended; + char_enum_context_t ectx; + UCharNameChoice choice = U_UNICODE_CHAR_NAME; + UErrorCode status = U_ZERO_ERROR; + + if (zend_parse_parameters(ZEND_NUM_ARGS()TSRMLS_CC, "zll|l", &callback, &start, &limit, &extended)) { + return; + } + + if (!zend_is_callable(callback, 0, NULL)) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "invalid enumeration callback"); + return; + } + + if (extended) { + choice = U_EXTENDED_CHAR_NAME; + } + + /* Do all the heavy lifing once, instead of in the callback */ + MAKE_STD_ZVAL(zcode); + MAKE_STD_ZVAL(zextended); + MAKE_STD_ZVAL(zname); + + ZVAL_LONG(zcode, 0); + ZVAL_BOOL(zextended, 0); + Z_TYPE_P(zname) = IS_UNICODE; + Z_USTRVAL_P(zname) = NULL; + + memset(&ectx, 0, sizeof(char_enum_context_t)); + ectx.fci.size = sizeof(ectx.fci); + ectx.fci.function_table = EG(function_table); + ectx.fci.function_name = callback; + ectx.fci.no_separation = 1; + ectx.fci_cache = empty_fcall_info_cache; + ectx.args[0] = &zcode; + ectx.args[1] = &zextended; + ectx.args[2] = &zname; + ectx.fci.param_count = 3; + ectx.fci.params = ectx.args; + TSRMLS_SET_CTX(ectx.thread_ctx); + + u_enumCharNames(start, limit, (UEnumCharNamesFn *)php_enum_char_names, + (void *)&ectx, choice, &status); + + zval_ptr_dtor(&zcode); + zval_ptr_dtor(&zextended); + zval_ptr_dtor(&zname); + + if (U_SUCCESS(status)) { + RETURN_TRUE; + } else { + RETURN_FALSE; + } +} + +/* }}} */ + /* * Local variables: * tab-width: 4 http://cvs.php.net/viewcvs.cgi/php-src/ext/unicode/unicode.c?r1=1.32&r2=1.33&diff_format=u Index: php-src/ext/unicode/unicode.c diff -u php-src/ext/unicode/unicode.c:1.32 php-src/ext/unicode/unicode.c:1.33 --- php-src/ext/unicode/unicode.c:1.32 Mon May 8 23:01:20 2006 +++ php-src/ext/unicode/unicode.c Tue May 9 00:06:08 2006 @@ -15,7 +15,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: unicode.c,v 1.32 2006/05/08 23:01:20 andrei Exp $ */ +/* $Id: unicode.c,v 1.33 2006/05/09 00:06:08 andrei Exp $ */ #include "php_unicode.h" #include "zend_unicode.h" @@ -295,6 +295,8 @@ PHP_FE(char_get_property_value_name, NULL) PHP_FE(char_get_property_value_from_name, NULL) + PHP_FE(char_enum_names, NULL) + { NULL, NULL, NULL } }; /* }}} */
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php