static void TestClone() { UErrorCode status=U_ZERO_ERROR; UTransliterator* t1=NULL; UTransliterator* t2=NULL; UTransliterator* t3=NULL; UTransliterator* t4=NULL; enum { BUF_CAP = 128 }; char buf1[BUF_CAP], buf2[BUF_CAP], buf3[BUF_CAP]; t1=utrans_open("Latin-Devanagari", UTRANS_FORWARD, NULL,0,NULL,&status); if(U_FAILURE(status)) { log_data_err("FAIL: construction -> %s (Are you missing data?)\n", u_errorName(status)); return; } t2=utrans_open("Latin-Greek", UTRANS_FORWARD, NULL,0,NULL,&status); if(U_FAILURE(status)) { log_err("FAIL: construction\n"); utrans_close(t1); return; } t3=utrans_clone(t1, &status); t4=utrans_clone(t2, &status); utrans_getID(t1, buf1, BUF_CAP); utrans_getID(t2, buf2, BUF_CAP); utrans_getID(t3, buf3, BUF_CAP); if(strcmp(buf1, buf3) != 0 || strcmp(buf1, buf2) == 0) { log_err("FAIL: utrans_clone() failed\n"); } utrans_getID(t4, buf3, BUF_CAP); if(strcmp(buf2, buf3) != 0 || strcmp(buf1, buf3) == 0) { log_err("FAIL: utrans_clone() failed\n"); } utrans_close(t1); utrans_close(t2); utrans_close(t3); utrans_close(t4); }
/* {{{ clone handler for Transliterator */ static zend_object *Transliterator_clone_obj( zval *object ) { Transliterator_object *to_orig, *to_new; zend_object *ret_val; intl_error_reset( NULL ); to_orig = Z_INTL_TRANSLITERATOR_P( object ); intl_error_reset( INTL_DATA_ERROR_P( to_orig ) ); ret_val = Transliterator_ce_ptr->create_object( Z_OBJCE_P( object ) ); to_new = php_intl_transliterator_fetch_object( ret_val ); zend_objects_clone_members( &to_new->zo, &to_orig->zo ); if( to_orig->utrans != NULL ) { zval tempz; /* dummy zval to pass to transliterator_object_construct */ /* guaranteed to return NULL if it fails */ UTransliterator *utrans = utrans_clone( to_orig->utrans, TRANSLITERATOR_ERROR_CODE_P( to_orig ) ); if( U_FAILURE( TRANSLITERATOR_ERROR_CODE( to_orig ) ) ) goto err; ZVAL_OBJ(&tempz, ret_val); transliterator_object_construct( &tempz, utrans, TRANSLITERATOR_ERROR_CODE_P( to_orig ) ); if( U_FAILURE( TRANSLITERATOR_ERROR_CODE( to_orig ) ) ) { zend_string *err_msg; err: if( utrans != NULL ) transliterator_object_destroy( to_new ); /* set the error anyway, in case in the future we decide not to * throw an error. It also helps build the error message */ intl_error_set_code( NULL, INTL_DATA_ERROR_CODE( to_orig ) ); intl_errors_set_custom_msg( TRANSLITERATOR_ERROR_P( to_orig ), "Could not clone transliterator", 0 ); err_msg = intl_error_get_message( TRANSLITERATOR_ERROR_P( to_orig ) ); zend_throw_error( NULL, "%s", ZSTR_VAL(err_msg) ); zend_string_free( err_msg ); /* if it's changed into a warning */ /* do not destroy tempz; we need to return something */ } } else { /* We shouldn't have unconstructed objects in the first place */ php_error_docref( NULL, E_WARNING, "Cloning unconstructed transliterator." ); } return ret_val; }
static char* trans_clone(char* obj) { UErrorCode status = U_ZERO_ERROR; obj = (char*) utrans_clone( (const UTransliterator *) obj, &status ); if(U_FAILURE(status)) { return NULL; } return obj; }
static void TestRegisterUnregister() { UErrorCode status=U_ZERO_ERROR; UTransliterator* t1=NULL; UTransliterator* rules=NULL, *rules2; UTransliterator* inverse1=NULL; UChar rule[]= { 0x0061, 0x003c, 0x003e, 0x0063}; /*a<>b*/ U_STRING_DECL(ID, "TestA-TestB", 11); U_STRING_INIT(ID, "TestA-TestB", 11); /* Make sure it doesn't exist */ t1=utrans_open("TestA-TestB", UTRANS_FORWARD,NULL,0,NULL, &status); if(t1 != NULL || U_SUCCESS(status)) { log_err("FAIL: TestA-TestB already registered\n"); return; } status=U_ZERO_ERROR; /* Check inverse too */ inverse1=utrans_open("TestA-TestB", UTRANS_REVERSE, NULL,0,NULL,&status); if(inverse1 != NULL || U_SUCCESS(status)) { log_err("FAIL: TestA-TestB already registered\n"); return; } status=U_ZERO_ERROR; /* Create it */ rules=utrans_open("TestA-TestB",UTRANS_FORWARD, rule, 4, NULL, &status); if(U_FAILURE(status)) { log_err("FAIL: utrans_openRules(a<>B) failed with error=%s\n", myErrorName(status)); return; } /* clone it so we can register it a second time */ rules2=utrans_clone(rules, &status); if(U_FAILURE(status)) { log_err("FAIL: utrans_clone(a<>B) failed with error=%s\n", myErrorName(status)); return; } status=U_ZERO_ERROR; /* Register it */ utrans_register(rules, &status); if(U_FAILURE(status)) { log_err("FAIL: utrans_register failed with error=%s\n", myErrorName(status)); return; } status=U_ZERO_ERROR; /* Now check again -- should exist now*/ t1= utrans_open("TestA-TestB", UTRANS_FORWARD, NULL,0,NULL,&status); if(U_FAILURE(status) || t1 == NULL) { log_err("FAIL: TestA-TestB not registered\n"); return; } utrans_close(t1); /*unregister the instance*/ status=U_ZERO_ERROR; utrans_unregister("TestA-TestB"); /* now Make sure it doesn't exist */ t1=utrans_open("TestA-TestB", UTRANS_FORWARD,NULL,0,NULL, &status); if(U_SUCCESS(status) || t1 != NULL) { log_err("FAIL: TestA-TestB isn't unregistered\n"); return; } utrans_close(t1); /* now with utrans_unregisterID(const UChar *) */ status=U_ZERO_ERROR; utrans_register(rules2, &status); if(U_FAILURE(status)) { log_err("FAIL: 2nd utrans_register failed with error=%s\n", myErrorName(status)); return; } status=U_ZERO_ERROR; /* Now check again -- should exist now*/ t1= utrans_open("TestA-TestB", UTRANS_FORWARD, NULL,0,NULL,&status); if(U_FAILURE(status) || t1 == NULL) { log_err("FAIL: 2nd TestA-TestB not registered\n"); return; } utrans_close(t1); /*unregister the instance*/ status=U_ZERO_ERROR; utrans_unregisterID(ID, -1); /* now Make sure it doesn't exist */ t1=utrans_openU(ID, -1, UTRANS_FORWARD,NULL,0,NULL, &status); if(U_SUCCESS(status) || t1 != NULL) { log_err("FAIL: 2nd TestA-TestB isn't unregistered\n"); return; } utrans_close(t1); utrans_close(inverse1); }