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