]> granicus.if.org Git - php/commitdiff
Move to refcounted implementation of collators.
authorAndrei Zmievski <andrei@php.net>
Thu, 20 Apr 2006 21:56:43 +0000 (21:56 +0000)
committerAndrei Zmievski <andrei@php.net>
Thu, 20 Apr 2006 21:56:43 +0000 (21:56 +0000)
Zend/zend.c
Zend/zend_globals.h
Zend/zend_operators.c
Zend/zend_unicode.c
Zend/zend_unicode.h
ext/unicode/collator.c
ext/unicode/php_unicode.h
ext/unicode/unicode.c

index 825a307baeb23f7c2b709c8a716adf0fe574931c..8e172fb521851889338a0fb99478beb6085597f1 100644 (file)
@@ -1227,15 +1227,17 @@ ZEND_API char *get_zend_version()
 
 ZEND_API void zend_reset_locale_deps(TSRMLS_D)
 {
+       UCollator *coll;
        UErrorCode status = U_ZERO_ERROR;
 
        if (UG(default_collator)) {
-               ucol_close(UG(default_collator));
+               zend_collator_destroy(UG(default_collator));
        }
-       UG(default_collator) = ucol_open(UG(default_locale), &status);
+       coll = ucol_open(UG(default_locale), &status);
        if (U_FAILURE(status)) {
                zend_error(E_ERROR, "Could not open collator for locale %s", UG(default_locale));
        }
+       UG(default_collator) = zend_collator_create(coll);
 }
 
 static void init_unicode_request_globals(TSRMLS_D)
@@ -1248,7 +1250,7 @@ static void init_unicode_request_globals(TSRMLS_D)
 
 static void shutdown_unicode_request_globals(TSRMLS_D)
 {
-       ucol_close(UG(default_collator));
+       zend_collator_destroy(UG(default_collator));
        efree(UG(default_locale));
 }
 
index be512bb15e94da8e5eab2ab00e8e3901f47fdd5e..e4bdef54a02747adf5b2d347aacbbd35eac544c8 100644 (file)
@@ -307,9 +307,9 @@ struct _zend_unicode_globals {
        uint16_t to_error_mode;
 
        char *default_locale;
-       UCollator *default_collator;
+       zend_collator *default_collator;
 
-       HashTable flex_compatible;
+       HashTable flex_compatible;                       /* table of flex-compatible encodings */
 };
 
 #endif /* ZEND_GLOBALS_H */
index e965e766840ae08d47503e21ab972b57447888cf..c60458789b8f6e88359662a89af11eb53065f7b8 100644 (file)
@@ -1443,7 +1443,7 @@ ZEND_API int string_locale_compare_function(zval *result, zval *op1, zval *op2 T
                op2 = &op2_copy;
        }
 
-       Z_LVAL_P(result) = ucol_strcoll(UG(default_collator), Z_USTRVAL_P(op1), Z_USTRLEN_P(op1), Z_USTRVAL_P(op2), Z_USTRLEN_P(op2));
+       Z_LVAL_P(result) = ucol_strcoll(UG(default_collator)->coll, Z_USTRVAL_P(op1), Z_USTRLEN_P(op1), Z_USTRVAL_P(op2), Z_USTRLEN_P(op2));
        Z_TYPE_P(result) = IS_LONG;
 
        if (use_copy1) {
index 6ed5013e9599f301f5d902c52d6a8bb0826f807d..ffa7ee254d74563839c532403600c0195bc7fed6 100644 (file)
@@ -677,6 +677,27 @@ void zend_register_unicode_exceptions(TSRMLS_D)
 }
 /* }}} */
 
+zend_collator* zend_collator_create(UCollator *coll)
+{
+       zend_collator *zcoll = NULL;
+
+       zcoll = emalloc(sizeof(zend_collator));
+       zcoll->coll = coll;
+       zcoll->refcount = 1;
+
+       return zcoll;
+}
+
+void zend_collator_destroy(zend_collator *zcoll)
+{
+       zcoll->refcount--;
+       if (zcoll->refcount == 0) {
+               ucol_close(zcoll->coll);
+               efree(zcoll);
+       }
+}
+
+
 /*
  * Local variables:
  * tab-width: 4
index 9c88a560acd7b2150c67029b7f007892a38f996f..9423dfa7d2d2b2d913afd569d17bb203a5bde2ac 100644 (file)
@@ -48,6 +48,12 @@ typedef enum {
 } zend_conv_direction;
 
 
+typedef struct _zend_collator {
+       UCollator    *coll;
+       int       refcount;
+} zend_collator;
+
+
 extern ZEND_API zend_class_entry *unicodeConversionException;
 
 
@@ -58,6 +64,8 @@ void zend_set_converter_error_mode(UConverter *conv, zend_conv_direction dir, ui
 void zend_set_converter_subst_char(UConverter *conv, UChar *subst_char);
 void zend_register_unicode_exceptions(TSRMLS_D);
 void zend_update_converters_error_behavior(TSRMLS_D);
+zend_collator* zend_collator_create(UCollator *coll);
+void zend_collator_destroy(zend_collator *zcoll);
 
 
 /* API functions */
index 3fb3bdc591b4ec8a6e40fc380022a731fac92c32..7c1524c7a85f76da1444caf774019daec608e4e3 100644 (file)
@@ -42,8 +42,8 @@ static zend_object_handlers unicode_object_handlers_collator;
 typedef struct _php_collator_obj php_collator_obj;
 
 struct _php_collator_obj {
-       zend_object   std;
-       UCollator *col;
+       zend_object      std;
+       zend_collator *zcoll;
 };
 
 #define COLLATOR_SET_CONTEXT \
@@ -140,8 +140,8 @@ static void collator_object_free_storage(void *object TSRMLS_DC)
 {
        php_collator_obj *intern = (php_collator_obj *)object;
 
-       if (intern->col) {
-               ucol_close(intern->col);
+       if (intern->zcoll) {
+               zend_collator_destroy(intern->zcoll);
        }
 
        if (intern->std.properties) {
@@ -178,10 +178,11 @@ PHP_METHOD(collator, __construct)
 PHP_FUNCTION(collator_create)
 {
        php_collator_obj *collatorobj;
-       UErrorCode        error;
+       UErrorCode        status = U_ZERO_ERROR;
        char             *collator_name;
        int               collator_name_len;
        zval                     *object;
+       UCollator                *ucoll;
 
        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &collator_name, &collator_name_len) == FAILURE) {
                RETURN_FALSE;
@@ -192,8 +193,13 @@ PHP_FUNCTION(collator_create)
        }
        collator_instantiate(unicode_ce_collator, object TSRMLS_CC);
        collatorobj = (php_collator_obj *) zend_object_store_get_object(object TSRMLS_CC);
-       error = U_ZERO_ERROR;
-       collatorobj->col = ucol_open(collator_name, &error);
+       ucoll = ucol_open(collator_name, &status);
+       if (U_FAILURE(status)) {
+               /* UTODO handle error case properly */
+               zend_error(E_ERROR, "Could not open collator for locale %s", UG(default_locale));
+               return;
+       }
+       collatorobj->zcoll = zend_collator_create(ucoll);
 }
 
 PHP_FUNCTION(collator_compare)
@@ -207,7 +213,7 @@ PHP_FUNCTION(collator_compare)
                RETURN_FALSE;
        }
        collatorobj = (php_collator_obj *) zend_object_store_get_object(object TSRMLS_CC);
-       RETURN_LONG(ucol_strcoll(collatorobj->col, string1, string1_len, string2, string2_len));
+       RETURN_LONG(ucol_strcoll(collatorobj->zcoll->coll, string1, string1_len, string2, string2_len));
 }
 
 PHP_FUNCTION(collator_sort)
@@ -216,7 +222,7 @@ PHP_FUNCTION(collator_sort)
        php_collator_obj *collatorobj;
        zval             *array;
        HashTable        *target_hash;
-       UCollator        *orig_collator;
+       zend_collator    *orig_collator;
 
        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Oa/", &object, unicode_ce_collator, &array) == FAILURE) {
                RETURN_FALSE;
@@ -226,7 +232,7 @@ PHP_FUNCTION(collator_sort)
        target_hash = HASH_OF(array);
        php_set_compare_func(SORT_LOCALE_STRING TSRMLS_CC);
        orig_collator = UG(default_collator);
-       UG(default_collator) = collatorobj->col;
+       UG(default_collator) = collatorobj->zcoll;
        if (zend_hash_sort(target_hash, zend_qsort, php_array_data_compare, 1 TSRMLS_CC) == FAILURE) {
                RETVAL_FALSE;
        } else {
@@ -245,7 +251,7 @@ PHP_FUNCTION(collator_set_strength)
                RETURN_FALSE;
        }
        collatorobj = (php_collator_obj *) zend_object_store_get_object(object TSRMLS_CC);
-       ucol_setStrength(collatorobj->col, strength);
+       ucol_setStrength(collatorobj->zcoll->coll, strength);
 }
 
 PHP_FUNCTION(collator_get_strength)
@@ -257,7 +263,7 @@ PHP_FUNCTION(collator_get_strength)
                RETURN_FALSE;
        }
        collatorobj = (php_collator_obj *) zend_object_store_get_object(object TSRMLS_CC);
-       RETURN_LONG(ucol_getStrength(collatorobj->col));
+       RETURN_LONG(ucol_getStrength(collatorobj->zcoll->coll));
 }
 
 PHP_FUNCTION(collator_set_attribute)
@@ -272,7 +278,7 @@ PHP_FUNCTION(collator_set_attribute)
        }
        collatorobj = (php_collator_obj *) zend_object_store_get_object(object TSRMLS_CC);
        error = U_ZERO_ERROR;
-       ucol_setAttribute(collatorobj->col, attribute, value, &error);
+       ucol_setAttribute(collatorobj->zcoll->coll, attribute, value, &error);
        RETURN_BOOL(error == U_ZERO_ERROR ? 1 : 0);
 }
 
@@ -288,9 +294,26 @@ PHP_FUNCTION(collator_get_attribute)
        }
        collatorobj = (php_collator_obj *) zend_object_store_get_object(object TSRMLS_CC);
        error = U_ZERO_ERROR;
-       value = ucol_getAttribute(collatorobj->col, attribute, &error);
+       value = ucol_getAttribute(collatorobj->zcoll->coll, attribute, &error);
        if (error != U_ZERO_ERROR) {
                RETURN_FALSE;
        }
        RETURN_LONG(value);
 }
+
+PHP_FUNCTION(i18n_coll_get_default)
+{
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "") == FAILURE) {
+               return;
+       }
+
+}
+
+/*
+ * 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 cd9f59a6eddbcb7af05552be3f526bc811e24e08..d1697f87e4a6cbe3c412ad8be3cd6db4897cd1da 100644 (file)
@@ -57,6 +57,7 @@ PHP_MINFO_FUNCTION(unicode);
 
 PHP_FUNCTION(i18n_loc_get_default);
 PHP_FUNCTION(i18n_loc_set_default);
+PHP_FUNCTION(i18n_coll_get_default);
 PHP_FUNCTION(collator_create);
 PHP_FUNCTION(collator_compare);
 PHP_FUNCTION(collator_sort);
index 827c36c8e8305241414835acc7f71e19be7f188d..2323ed2f47bc44d82319f45322ac5f5aa0e94c3d 100644 (file)
@@ -18,7 +18,6 @@
 /* $Id$ */ 
 
 #include "php_unicode.h"
-#if HAVE_UNICODE
 #include "zend_unicode.h"
 
 void php_register_unicode_iterators(TSRMLS_D);
@@ -236,6 +235,7 @@ PHP_FUNCTION(unicode_get_subst_char)
 zend_function_entry unicode_functions[] = {
        PHP_FE(i18n_loc_get_default, NULL)
        PHP_FE(i18n_loc_set_default, NULL)
+       PHP_FE(i18n_coll_get_default, NULL)
        PHP_FE(unicode_decode, NULL)
        PHP_FE(unicode_semantics, NULL)
        PHP_FE(unicode_encode, NULL)
@@ -318,8 +318,6 @@ PHP_MINFO_FUNCTION(unicode)
 /* }}} */
 
 
-#endif /* HAVE_UNICODE */
-
 
 /*
  * Local variables: