mirror of
https://github.com/php/php-src.git
synced 2024-09-22 02:17:32 +00:00
Refactoring ext/intl (incompleted)
This commit is contained in:
parent
f609d8c1c6
commit
4fbaddb4f8
@ -81,8 +81,8 @@ static int BreakIterator_compare_objects(zval *object1,
|
||||
BreakIterator_object *bio1,
|
||||
*bio2;
|
||||
|
||||
bio1 = (BreakIterator_object*)zend_object_store_get_object(object1 TSRMLS_CC);
|
||||
bio2 = (BreakIterator_object*)zend_object_store_get_object(object2 TSRMLS_CC);
|
||||
bio1 = Z_INTL_BREAKITERATOR_P(object1);
|
||||
bio2 = Z_INTL_BREAKITERATOR_P(object2);
|
||||
|
||||
if (bio1->biter == NULL || bio2->biter == NULL) {
|
||||
return bio1->biter == bio2->biter ? 0 : 1;
|
||||
@ -93,41 +93,36 @@ static int BreakIterator_compare_objects(zval *object1,
|
||||
/* }}} */
|
||||
|
||||
/* {{{ clone handler for BreakIterator */
|
||||
static zend_object_value BreakIterator_clone_obj(zval *object TSRMLS_DC)
|
||||
static zend_object *BreakIterator_clone_obj(zval *object TSRMLS_DC)
|
||||
{
|
||||
BreakIterator_object *bio_orig,
|
||||
*bio_new;
|
||||
zend_object_value ret_val;
|
||||
zend_object *ret_val;
|
||||
|
||||
bio_orig = (BreakIterator_object*)zend_object_store_get_object(object TSRMLS_CC);
|
||||
bio_orig = Z_INTL_BREAKITERATOR_P(object);
|
||||
intl_errors_reset(INTL_DATA_ERROR_P(bio_orig) TSRMLS_CC);
|
||||
|
||||
ret_val = BreakIterator_ce_ptr->create_object(Z_OBJCE_P(object) TSRMLS_CC);
|
||||
bio_new = (BreakIterator_object*)zend_object_store_get_object_by_handle(
|
||||
ret_val.handle TSRMLS_CC);
|
||||
bio_new = php_intl_breakiterator_fetch_object(ret_val);
|
||||
|
||||
zend_objects_clone_members(&bio_new->zo, ret_val,
|
||||
&bio_orig->zo, Z_OBJ_HANDLE_P(object) TSRMLS_CC);
|
||||
zend_objects_clone_members(&bio_new->zo, &bio_orig->zo TSRMLS_CC);
|
||||
|
||||
if (bio_orig->biter != NULL) {
|
||||
BreakIterator *new_biter;
|
||||
|
||||
new_biter = bio_orig->biter->clone();
|
||||
if (!new_biter) {
|
||||
char *err_msg;
|
||||
zend_string *err_msg;
|
||||
intl_errors_set_code(BREAKITER_ERROR_P(bio_orig),
|
||||
U_MEMORY_ALLOCATION_ERROR TSRMLS_CC);
|
||||
intl_errors_set_custom_msg(BREAKITER_ERROR_P(bio_orig),
|
||||
"Could not clone BreakIterator", 0 TSRMLS_CC);
|
||||
err_msg = intl_error_get_message(BREAKITER_ERROR_P(bio_orig) TSRMLS_CC);
|
||||
zend_throw_exception(NULL, err_msg, 0 TSRMLS_CC);
|
||||
efree(err_msg);
|
||||
zend_throw_exception(NULL, err_msg->val, 0 TSRMLS_CC);
|
||||
STR_FREE(err_msg);
|
||||
} else {
|
||||
bio_new->biter = new_biter;
|
||||
bio_new->text = bio_orig->text;
|
||||
if (bio_new->text) {
|
||||
zval_add_ref(&bio_new->text);
|
||||
}
|
||||
ZVAL_COPY(&bio_new->text, &bio_orig->text);
|
||||
}
|
||||
} else {
|
||||
zend_throw_exception(NULL, "Cannot clone unconstructed BreakIterator", 0 TSRMLS_CC);
|
||||
@ -148,23 +143,23 @@ static HashTable *BreakIterator_get_debug_info(zval *object, int *is_temp TSRMLS
|
||||
|
||||
array_init_size(&zv, 8);
|
||||
|
||||
bio = (BreakIterator_object*)zend_object_store_get_object(object TSRMLS_CC);
|
||||
bio = Z_INTL_BREAKITERATOR_P(object);
|
||||
biter = bio->biter;
|
||||
|
||||
if (biter == NULL) {
|
||||
add_assoc_bool_ex(&zv, "valid", sizeof("valid"), 0);
|
||||
add_assoc_bool_ex(&zv, "valid", sizeof("valid") - 1, 0);
|
||||
return Z_ARRVAL(zv);
|
||||
}
|
||||
add_assoc_bool_ex(&zv, "valid", sizeof("valid"), 1);
|
||||
add_assoc_bool_ex(&zv, "valid", sizeof("valid") - 1, 1);
|
||||
|
||||
if (bio->text == NULL) {
|
||||
add_assoc_null_ex(&zv, "text", sizeof("text"));
|
||||
if (Z_ISUNDEF(bio->text)) {
|
||||
add_assoc_null_ex(&zv, "text", sizeof("text") - 1);
|
||||
} else {
|
||||
zval_add_ref(&bio->text);
|
||||
add_assoc_zval_ex(&zv, "text", sizeof("text"), bio->text);
|
||||
Z_TRY_ADDREF(bio->text);
|
||||
add_assoc_zval_ex(&zv, "text", sizeof("text") - 1, &bio->text);
|
||||
}
|
||||
|
||||
add_assoc_string_ex(&zv, "type", sizeof("type"),
|
||||
add_assoc_string_ex(&zv, "type", sizeof("type") - 1,
|
||||
const_cast<char*>(typeid(*biter).name()));
|
||||
|
||||
return Z_ARRVAL(zv);
|
||||
@ -178,26 +173,23 @@ static void breakiterator_object_init(BreakIterator_object *bio TSRMLS_DC)
|
||||
{
|
||||
intl_error_init(BREAKITER_ERROR_P(bio) TSRMLS_CC);
|
||||
bio->biter = NULL;
|
||||
bio->text = NULL;
|
||||
ZVAL_UNDEF(&bio->text);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ BreakIterator_objects_dtor */
|
||||
static void BreakIterator_objects_dtor(void *object,
|
||||
zend_object_handle handle TSRMLS_DC)
|
||||
static void BreakIterator_objects_dtor(zend_object *object TSRMLS_DC)
|
||||
{
|
||||
zend_objects_destroy_object((zend_object*)object, handle TSRMLS_CC);
|
||||
zend_objects_destroy_object(object TSRMLS_CC);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ BreakIterator_objects_free */
|
||||
static void BreakIterator_objects_free(zend_object *object TSRMLS_DC)
|
||||
{
|
||||
BreakIterator_object* bio = (BreakIterator_object*) object;
|
||||
BreakIterator_object* bio = php_intl_breakiterator_fetch_object(object);
|
||||
|
||||
if (bio->text) {
|
||||
zval_ptr_dtor(&bio->text);
|
||||
}
|
||||
zval_ptr_dtor(&bio->text);
|
||||
if (bio->biter) {
|
||||
delete bio->biter;
|
||||
bio->biter = NULL;
|
||||
@ -205,37 +197,23 @@ static void BreakIterator_objects_free(zend_object *object TSRMLS_DC)
|
||||
intl_error_reset(BREAKITER_ERROR_P(bio) TSRMLS_CC);
|
||||
|
||||
zend_object_std_dtor(&bio->zo TSRMLS_CC);
|
||||
|
||||
efree(bio);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ BreakIterator_object_create */
|
||||
static zend_object_value BreakIterator_object_create(zend_class_entry *ce TSRMLS_DC)
|
||||
static zend_object *BreakIterator_object_create(zend_class_entry *ce TSRMLS_DC)
|
||||
{
|
||||
zend_object_value retval;
|
||||
BreakIterator_object* intern;
|
||||
|
||||
intern = (BreakIterator_object*)ecalloc(1, sizeof(BreakIterator_object));
|
||||
intern = (BreakIterator_object*)ecalloc(1, sizeof(BreakIterator_object) + sizeof(zval) * (ce->default_properties_count - 1));
|
||||
|
||||
zend_object_std_init(&intern->zo, ce TSRMLS_CC);
|
||||
#if PHP_VERSION_ID < 50399
|
||||
zend_hash_copy(intern->zo.properties, &(ce->default_properties),
|
||||
(copy_ctor_func_t) zval_add_ref, NULL, sizeof(zval*));
|
||||
#else
|
||||
object_properties_init((zend_object*) intern, ce);
|
||||
#endif
|
||||
breakiterator_object_init(intern TSRMLS_CC);
|
||||
|
||||
retval.handle = zend_objects_store_put(
|
||||
intern,
|
||||
BreakIterator_objects_dtor,
|
||||
(zend_objects_free_object_storage_t) BreakIterator_objects_free,
|
||||
NULL TSRMLS_CC);
|
||||
intern->zo.handlers = &BreakIterator_handlers;
|
||||
|
||||
retval.handlers = &BreakIterator_handlers;
|
||||
|
||||
return retval;
|
||||
return &intern->zo;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
@ -343,9 +321,12 @@ U_CFUNC void breakiterator_register_BreakIterator_class(TSRMLS_D)
|
||||
|
||||
memcpy(&BreakIterator_handlers, zend_get_std_object_handlers(),
|
||||
sizeof BreakIterator_handlers);
|
||||
BreakIterator_handlers.offset = XtOffsetOf(BreakIterator_object, zo);
|
||||
BreakIterator_handlers.compare_objects = BreakIterator_compare_objects;
|
||||
BreakIterator_handlers.clone_obj = BreakIterator_clone_obj;
|
||||
BreakIterator_handlers.get_debug_info = BreakIterator_get_debug_info;
|
||||
BreakIterator_handlers.dtor_obj = BreakIterator_objects_dtor;
|
||||
BreakIterator_handlers.free_obj = BreakIterator_objects_free;
|
||||
|
||||
zend_class_implements(BreakIterator_ce_ptr TSRMLS_CC, 1,
|
||||
zend_ce_traversable);
|
||||
|
@ -29,8 +29,6 @@ typedef void BreakIterator;
|
||||
#endif
|
||||
|
||||
typedef struct {
|
||||
zend_object zo;
|
||||
|
||||
// error handling
|
||||
intl_error err;
|
||||
|
||||
@ -38,9 +36,16 @@ typedef struct {
|
||||
BreakIterator* biter;
|
||||
|
||||
// current text
|
||||
zval *text;
|
||||
zval text;
|
||||
|
||||
zend_object zo;
|
||||
} BreakIterator_object;
|
||||
|
||||
static inline BreakIterator_object *php_intl_breakiterator_fetch_object(zend_object *obj) {
|
||||
return (BreakIterator_object *)((char*)(obj) - XtOffsetOf(BreakIterator_object, zo));
|
||||
}
|
||||
#define Z_INTL_BREAKITERATOR_P(zv) php_intl_breakiterator_fetch_object(Z_OBJ_P(zv))
|
||||
|
||||
#define BREAKITER_ERROR(bio) (bio)->err
|
||||
#define BREAKITER_ERROR_P(bio) &(BREAKITER_ERROR(bio))
|
||||
|
||||
@ -48,7 +53,7 @@ typedef struct {
|
||||
#define BREAKITER_ERROR_CODE_P(bio) &(INTL_ERROR_CODE(BREAKITER_ERROR(bio)))
|
||||
|
||||
#define BREAKITER_METHOD_INIT_VARS INTL_METHOD_INIT_VARS(BreakIterator, bio)
|
||||
#define BREAKITER_METHOD_FETCH_OBJECT_NO_CHECK INTL_METHOD_FETCH_OBJECT(BreakIterator, bio)
|
||||
#define BREAKITER_METHOD_FETCH_OBJECT_NO_CHECK INTL_METHOD_FETCH_OBJECT(INTL_BREAKITERATOR, bio)
|
||||
#define BREAKITER_METHOD_FETCH_OBJECT \
|
||||
BREAKITER_METHOD_FETCH_OBJECT_NO_CHECK; \
|
||||
if (bio->biter == NULL) \
|
||||
|
@ -59,8 +59,7 @@ U_CFUNC void calendar_object_create(zval *object,
|
||||
|
||||
U_CFUNC Calendar *calendar_fetch_native_calendar(zval *object TSRMLS_DC)
|
||||
{
|
||||
Calendar_object *co = (Calendar_object*)
|
||||
zend_object_store_get_object(object TSRMLS_CC);
|
||||
Calendar_object *co = Z_INTL_CALENDAR_P(object);
|
||||
|
||||
return co->ucal;
|
||||
}
|
||||
@ -76,35 +75,34 @@ U_CFUNC void calendar_object_construct(zval *object,
|
||||
}
|
||||
|
||||
/* {{{ clone handler for Calendar */
|
||||
static zend_object_value Calendar_clone_obj(zval *object TSRMLS_DC)
|
||||
static zend_object *Calendar_clone_obj(zval *object TSRMLS_DC)
|
||||
{
|
||||
Calendar_object *co_orig,
|
||||
*co_new;
|
||||
zend_object_value ret_val;
|
||||
zend_object *ret_val;
|
||||
intl_error_reset(NULL TSRMLS_CC);
|
||||
|
||||
co_orig = (Calendar_object*)zend_object_store_get_object(object TSRMLS_CC);
|
||||
co_orig = Z_INTL_CALENDAR_P(object);
|
||||
intl_error_reset(INTL_DATA_ERROR_P(co_orig) TSRMLS_CC);
|
||||
|
||||
ret_val = Calendar_ce_ptr->create_object(Z_OBJCE_P(object) TSRMLS_CC);
|
||||
co_new = (Calendar_object*)zend_object_store_get_object_by_handle(ret_val.handle TSRMLS_CC);
|
||||
co_new = php_intl_calendar_fetch_object(ret_val);
|
||||
|
||||
zend_objects_clone_members(&co_new->zo, ret_val,
|
||||
&co_orig->zo, Z_OBJ_HANDLE_P(object) TSRMLS_CC);
|
||||
zend_objects_clone_members(&co_new->zo, &co_orig->zo TSRMLS_CC);
|
||||
|
||||
if (co_orig->ucal != NULL) {
|
||||
Calendar *newCalendar;
|
||||
|
||||
newCalendar = co_orig->ucal->clone();
|
||||
if (!newCalendar) {
|
||||
char *err_msg;
|
||||
zend_string *err_msg;
|
||||
intl_errors_set_code(CALENDAR_ERROR_P(co_orig),
|
||||
U_MEMORY_ALLOCATION_ERROR TSRMLS_CC);
|
||||
intl_errors_set_custom_msg(CALENDAR_ERROR_P(co_orig),
|
||||
"Could not clone IntlCalendar", 0 TSRMLS_CC);
|
||||
err_msg = intl_error_get_message(CALENDAR_ERROR_P(co_orig) TSRMLS_CC);
|
||||
zend_throw_exception(NULL, err_msg, 0 TSRMLS_CC);
|
||||
efree(err_msg);
|
||||
zend_throw_exception(NULL, err_msg->val, 0 TSRMLS_CC);
|
||||
STR_FREE(err_msg);
|
||||
} else {
|
||||
co_new->ucal = newCalendar;
|
||||
}
|
||||
@ -149,7 +147,7 @@ static const struct {
|
||||
static HashTable *Calendar_get_debug_info(zval *object, int *is_temp TSRMLS_DC)
|
||||
{
|
||||
zval zv = zval_used_for_init,
|
||||
*zfields;
|
||||
zfields;
|
||||
Calendar_object *co;
|
||||
const Calendar *cal;
|
||||
|
||||
@ -157,7 +155,7 @@ static HashTable *Calendar_get_debug_info(zval *object, int *is_temp TSRMLS_DC)
|
||||
|
||||
array_init_size(&zv, 8);
|
||||
|
||||
co = (Calendar_object*)zend_object_store_get_object(object TSRMLS_CC);
|
||||
co = Z_INTL_CALENDAR_P(object);
|
||||
cal = co->ucal;
|
||||
|
||||
if (cal == NULL) {
|
||||
@ -172,7 +170,7 @@ static HashTable *Calendar_get_debug_info(zval *object, int *is_temp TSRMLS_DC)
|
||||
|
||||
{
|
||||
zval ztz = zval_used_for_init,
|
||||
*ztz_debug;
|
||||
ztz_debug;
|
||||
int is_tmp;
|
||||
HashTable *debug_info;
|
||||
|
||||
@ -180,26 +178,23 @@ static HashTable *Calendar_get_debug_info(zval *object, int *is_temp TSRMLS_DC)
|
||||
debug_info = Z_OBJ_HANDLER(ztz, get_debug_info)(&ztz, &is_tmp TSRMLS_CC);
|
||||
assert(is_tmp == 1);
|
||||
|
||||
ALLOC_INIT_ZVAL(ztz_debug);
|
||||
Z_TYPE_P(ztz_debug) = IS_ARRAY;
|
||||
Z_ARRVAL_P(ztz_debug) = debug_info;
|
||||
add_assoc_zval_ex(&zv, "timeZone", sizeof("timeZone"), ztz_debug);
|
||||
zend_hash_copy(Z_ARRVAL(ztz_debug), debug_info, NULL);
|
||||
add_assoc_zval_ex(&zv, "timeZone", sizeof("timeZone") - 1, &ztz_debug);
|
||||
}
|
||||
|
||||
{
|
||||
UErrorCode uec = U_ZERO_ERROR;
|
||||
Locale locale = cal->getLocale(ULOC_VALID_LOCALE, uec);
|
||||
if (U_SUCCESS(uec)) {
|
||||
add_assoc_string_ex(&zv, "locale", sizeof("locale"),
|
||||
add_assoc_string_ex(&zv, "locale", sizeof("locale") - 1,
|
||||
const_cast<char*>(locale.getName()));
|
||||
} else {
|
||||
add_assoc_string_ex(&zv, "locale", sizeof("locale"),
|
||||
add_assoc_string_ex(&zv, "locale", sizeof("locale") - 1,
|
||||
const_cast<char*>(u_errorName(uec)));
|
||||
}
|
||||
}
|
||||
|
||||
ALLOC_INIT_ZVAL(zfields);
|
||||
array_init_size(zfields, UCAL_FIELD_COUNT);
|
||||
array_init_size(&zfields, UCAL_FIELD_COUNT);
|
||||
|
||||
for (int i = 0;
|
||||
i < sizeof(debug_info_fields) / sizeof(*debug_info_fields);
|
||||
@ -208,13 +203,13 @@ static HashTable *Calendar_get_debug_info(zval *object, int *is_temp TSRMLS_DC)
|
||||
const char *name = debug_info_fields[i].name;
|
||||
int32_t res = cal->get(debug_info_fields[i].field, uec);
|
||||
if (U_SUCCESS(uec)) {
|
||||
add_assoc_long(zfields, name, (long)res);
|
||||
add_assoc_long(&zfields, name, (long)res);
|
||||
} else {
|
||||
add_assoc_string(zfields, name, const_cast<char*>(u_errorName(uec)));
|
||||
add_assoc_string(&zfields, name, const_cast<char*>(u_errorName(uec)));
|
||||
}
|
||||
}
|
||||
|
||||
add_assoc_zval_ex(&zv, "fields", sizeof("fields"), zfields);
|
||||
add_assoc_zval_ex(&zv, "fields", sizeof("fields") - 1, &zfields);
|
||||
|
||||
return Z_ARRVAL(zv);
|
||||
}
|
||||
@ -231,10 +226,9 @@ static void calendar_object_init(Calendar_object *co TSRMLS_DC)
|
||||
/* }}} */
|
||||
|
||||
/* {{{ Calendar_objects_dtor */
|
||||
static void Calendar_objects_dtor(void *object,
|
||||
zend_object_handle handle TSRMLS_DC)
|
||||
static void Calendar_objects_dtor(zend_object *object TSRMLS_DC)
|
||||
{
|
||||
zend_objects_destroy_object((zend_object*)object, handle TSRMLS_CC);
|
||||
zend_objects_destroy_object(object TSRMLS_CC);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
@ -256,31 +250,20 @@ static void Calendar_objects_free(zend_object *object TSRMLS_DC)
|
||||
/* }}} */
|
||||
|
||||
/* {{{ Calendar_object_create */
|
||||
static zend_object_value Calendar_object_create(zend_class_entry *ce TSRMLS_DC)
|
||||
static zend_object *Calendar_object_create(zend_class_entry *ce TSRMLS_DC)
|
||||
{
|
||||
zend_object_value retval;
|
||||
Calendar_object* intern;
|
||||
|
||||
intern = (Calendar_object*)ecalloc(1, sizeof(Calendar_object));
|
||||
intern = (Calendar_object*)ecalloc(1, sizeof(Calendar_object) + sizeof(zval) * (ce->default_properties_count - 1));
|
||||
|
||||
zend_object_std_init(&intern->zo, ce TSRMLS_CC);
|
||||
#if PHP_VERSION_ID < 50399
|
||||
zend_hash_copy(intern->zo.properties, &(ce->default_properties),
|
||||
(copy_ctor_func_t) zval_add_ref, NULL, sizeof(zval*));
|
||||
#else
|
||||
object_properties_init((zend_object*) intern, ce);
|
||||
#endif
|
||||
calendar_object_init(intern TSRMLS_CC);
|
||||
|
||||
retval.handle = zend_objects_store_put(
|
||||
intern,
|
||||
Calendar_objects_dtor,
|
||||
(zend_objects_free_object_storage_t) Calendar_objects_free,
|
||||
NULL TSRMLS_CC);
|
||||
|
||||
retval.handlers = &Calendar_handlers;
|
||||
intern->zo.handlers = &Calendar_handlers;
|
||||
|
||||
return retval;
|
||||
return &intern->zo;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
@ -484,8 +467,11 @@ void calendar_register_IntlCalendar_class(TSRMLS_D)
|
||||
}
|
||||
memcpy( &Calendar_handlers, zend_get_std_object_handlers(),
|
||||
sizeof Calendar_handlers);
|
||||
Calendar_handlers.offset = XtOffsetOf(Calendar_object, zo);
|
||||
Calendar_handlers.clone_obj = Calendar_clone_obj;
|
||||
Calendar_handlers.get_debug_info = Calendar_get_debug_info;
|
||||
Calendar_handlers.dtor_obj = Calendar_objects_dtor;
|
||||
Calendar_handlers.free_obj = Calendar_objects_free;
|
||||
|
||||
/* Create and register 'IntlGregorianCalendar' class. */
|
||||
INIT_CLASS_ENTRY(ce, "IntlGregorianCalendar", GregorianCalendar_class_functions);
|
||||
|
@ -29,15 +29,20 @@ typedef void Calendar;
|
||||
#endif
|
||||
|
||||
typedef struct {
|
||||
zend_object zo;
|
||||
|
||||
// error handling
|
||||
intl_error err;
|
||||
|
||||
// ICU calendar
|
||||
Calendar* ucal;
|
||||
|
||||
zend_object zo;
|
||||
} Calendar_object;
|
||||
|
||||
static inline Calendar_object *php_intl_calendar_fetch_object(zend_object *obj) {
|
||||
return (Calendar_object *)((char*)(obj) - XtOffsetOf(Calendar_object, zo));
|
||||
}
|
||||
#define Z_INTL_CALENDAR_P(zv) php_intl_calendar_fetch_object(Z_OBJ_P(zv))
|
||||
|
||||
#define CALENDAR_ERROR(co) (co)->err
|
||||
#define CALENDAR_ERROR_P(co) &(CALENDAR_ERROR(co))
|
||||
|
||||
@ -45,7 +50,7 @@ typedef struct {
|
||||
#define CALENDAR_ERROR_CODE_P(co) &(INTL_ERROR_CODE(CALENDAR_ERROR(co)))
|
||||
|
||||
#define CALENDAR_METHOD_INIT_VARS INTL_METHOD_INIT_VARS(Calendar, co)
|
||||
#define CALENDAR_METHOD_FETCH_OBJECT_NO_CHECK INTL_METHOD_FETCH_OBJECT(Calendar, co)
|
||||
#define CALENDAR_METHOD_FETCH_OBJECT_NO_CHECK INTL_METHOD_FETCH_OBJECT(INTL_CALENDAR, co)
|
||||
#define CALENDAR_METHOD_FETCH_OBJECT \
|
||||
CALENDAR_METHOD_FETCH_OBJECT_NO_CHECK; \
|
||||
if (co->ucal == NULL) \
|
||||
|
@ -49,14 +49,14 @@ U_CFUNC PHP_METHOD(IntlCalendar, __construct)
|
||||
|
||||
U_CFUNC PHP_FUNCTION(intlcal_create_instance)
|
||||
{
|
||||
zval **zv_timezone = NULL;
|
||||
zval *zv_timezone = NULL;
|
||||
const char *locale_str = NULL;
|
||||
int dummy;
|
||||
TimeZone *timeZone;
|
||||
UErrorCode status = U_ZERO_ERROR;
|
||||
intl_error_reset(NULL TSRMLS_CC);
|
||||
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|Zs!",
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|zs!",
|
||||
&zv_timezone, &locale_str, &dummy) == FAILURE) {
|
||||
intl_error_set(NULL, U_ILLEGAL_ARGUMENT_ERROR,
|
||||
"intlcal_create_calendar: bad arguments", 0 TSRMLS_CC);
|
||||
@ -344,8 +344,8 @@ U_CFUNC PHP_FUNCTION(intlcal_set_time_zone)
|
||||
RETURN_TRUE; /* the method does nothing if passed null */
|
||||
}
|
||||
|
||||
timeZone = timezone_process_timezone_argument(&zv_timezone,
|
||||
CALENDAR_ERROR_P(co), "intlcal_set_time_zone" TSRMLS_CC);
|
||||
timeZone = timezone_process_timezone_argument(zv_timezone,
|
||||
CALENDAR_ERROR_P(co), "intlcal_set_time_zone" TSRMLS_CC);
|
||||
if (timeZone == NULL) {
|
||||
RETURN_FALSE;
|
||||
}
|
||||
@ -374,8 +374,7 @@ static void _php_intlcal_before_after(
|
||||
|
||||
CALENDAR_METHOD_FETCH_OBJECT;
|
||||
|
||||
when_co = static_cast<Calendar_object*>(
|
||||
zend_object_store_get_object(when_object TSRMLS_CC));
|
||||
when_co = Z_INTL_CALENDAR_P(when_object);
|
||||
if (when_co->ucal == NULL) {
|
||||
intl_errors_set(&co->err, U_ILLEGAL_ARGUMENT_ERROR,
|
||||
"intlcal_before/after: Other IntlCalendar was unconstructed", 0 TSRMLS_CC);
|
||||
@ -401,8 +400,8 @@ U_CFUNC PHP_FUNCTION(intlcal_before)
|
||||
U_CFUNC PHP_FUNCTION(intlcal_set)
|
||||
{
|
||||
long arg1, arg2, arg3, arg4, arg5, arg6;
|
||||
zval **args_a[7] = {0},
|
||||
***args = &args_a[0];
|
||||
zval args_a[7] = {0},
|
||||
*args = args_a;
|
||||
int i;
|
||||
int variant; /* number of args of the set() overload */
|
||||
CALENDAR_METHOD_INIT_VARS;
|
||||
@ -418,7 +417,7 @@ U_CFUNC PHP_FUNCTION(intlcal_set)
|
||||
args++;
|
||||
}
|
||||
variant = ZEND_NUM_ARGS() - (getThis() ? 0 : 1);
|
||||
while (variant > 2 && Z_TYPE_PP(args[variant - 1]) == IS_NULL) {
|
||||
while (variant > 2 && Z_TYPE(args[variant - 1]) == IS_NULL) {
|
||||
variant--;
|
||||
}
|
||||
|
||||
@ -432,7 +431,7 @@ U_CFUNC PHP_FUNCTION(intlcal_set)
|
||||
}
|
||||
|
||||
for (i = 0; i < variant; i++) {
|
||||
if (Z_LVAL_PP(args[i]) < INT32_MIN || Z_LVAL_PP(args[i]) > INT32_MAX) {
|
||||
if (Z_LVAL(args[i]) < INT32_MIN || Z_LVAL(args[i]) > INT32_MAX) {
|
||||
intl_error_set(NULL, U_ILLEGAL_ARGUMENT_ERROR,
|
||||
"intlcal_set: at least one of the arguments has an absolute "
|
||||
"value that is too large", 0 TSRMLS_CC);
|
||||
@ -465,8 +464,8 @@ U_CFUNC PHP_FUNCTION(intlcal_roll)
|
||||
{
|
||||
long field,
|
||||
value;
|
||||
zval **args_a[3] = {0},
|
||||
***args = &args_a[0];
|
||||
zval args_a[3] = {0},
|
||||
*args = args_a;
|
||||
zend_bool bool_variant_val = (zend_bool)-1;
|
||||
CALENDAR_METHOD_INIT_VARS;
|
||||
|
||||
@ -479,7 +478,7 @@ U_CFUNC PHP_FUNCTION(intlcal_roll)
|
||||
if (!getThis()) {
|
||||
args++;
|
||||
}
|
||||
if (args[1] != NULL && Z_TYPE_PP(args[1]) == IS_BOOL) {
|
||||
if (!Z_ISUNDEF(args[1]) && (Z_TYPE(args[1]) == IS_TRUE || Z_TYPE(args[1]) == IS_FALSE)) {
|
||||
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(),
|
||||
"Olb", &object, Calendar_ce_ptr, &field, &bool_variant_val)
|
||||
== FAILURE) {
|
||||
@ -487,7 +486,7 @@ U_CFUNC PHP_FUNCTION(intlcal_roll)
|
||||
"intlcal_roll: bad arguments", 0 TSRMLS_CC);
|
||||
RETURN_FALSE;
|
||||
}
|
||||
bool_variant_val = Z_BVAL_PP(args[1]);
|
||||
bool_variant_val = Z_TYPE(args[1]) == IS_TRUE? 1 : 0;
|
||||
} else if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(),
|
||||
"Oll", &object, Calendar_ce_ptr, &field, &value) == FAILURE) {
|
||||
intl_error_set(NULL, U_ILLEGAL_ARGUMENT_ERROR,
|
||||
@ -523,8 +522,8 @@ U_CFUNC PHP_FUNCTION(intlcal_roll)
|
||||
|
||||
U_CFUNC PHP_FUNCTION(intlcal_clear)
|
||||
{
|
||||
zval **args_a[2] = {0},
|
||||
***args = &args_a[0];
|
||||
zval args_a[2] = {0},
|
||||
*args = &args_a[0];
|
||||
long field;
|
||||
int variant;
|
||||
CALENDAR_METHOD_INIT_VARS;
|
||||
@ -538,7 +537,7 @@ U_CFUNC PHP_FUNCTION(intlcal_clear)
|
||||
if (!getThis()) {
|
||||
args++;
|
||||
}
|
||||
if (args[0] == NULL || Z_TYPE_PP(args[0]) == IS_NULL) {
|
||||
if (Z_ISUNDEF(args[0]) || Z_TYPE(args[0]) == IS_NULL) {
|
||||
zval *dummy; /* we know it's null */
|
||||
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
|
||||
getThis(), "O|z", &object, Calendar_ce_ptr, &dummy) == FAILURE) {
|
||||
@ -731,7 +730,7 @@ U_CFUNC PHP_FUNCTION(intlcal_get_locale)
|
||||
INTL_METHOD_CHECK_STATUS(co,
|
||||
"intlcal_get_locale: Call to ICU method has failed");
|
||||
|
||||
RETURN_STRING(locale.getName(), 1);
|
||||
RETURN_STRING(locale.getName());
|
||||
}
|
||||
|
||||
U_CFUNC PHP_FUNCTION(intlcal_get_maximum)
|
||||
@ -802,7 +801,7 @@ U_CFUNC PHP_FUNCTION(intlcal_get_type)
|
||||
|
||||
CALENDAR_METHOD_FETCH_OBJECT;
|
||||
|
||||
RETURN_STRING(co->ucal->getType(), 1);
|
||||
RETURN_STRING(co->ucal->getType());
|
||||
}
|
||||
|
||||
#if U_ICU_VERSION_MAJOR_NUM * 10 + U_ICU_VERSION_MINOR_NUM >= 44
|
||||
@ -869,7 +868,7 @@ U_CFUNC PHP_FUNCTION(intlcal_is_equivalent_to)
|
||||
RETURN_FALSE;
|
||||
}
|
||||
|
||||
other_co = (Calendar_object*)zend_object_store_get_object(other_object TSRMLS_CC);
|
||||
other_co = Z_INTL_CALENDAR_P(other_object);
|
||||
if (other_co->ucal == NULL) {
|
||||
intl_error_set(NULL, U_ILLEGAL_ARGUMENT_ERROR, "intlcal_is_equivalent_to:"
|
||||
" Other IntlCalendar is unconstructed", 0 TSRMLS_CC);
|
||||
@ -1037,7 +1036,7 @@ U_CFUNC PHP_FUNCTION(intlcal_equals)
|
||||
}
|
||||
|
||||
CALENDAR_METHOD_FETCH_OBJECT;
|
||||
other_co = (Calendar_object *) zend_object_store_get_object(other_object TSRMLS_CC);
|
||||
other_co = Z_INTL_CALENDAR_P(other_object);
|
||||
if (other_co->ucal == NULL) {
|
||||
intl_errors_set(&co->err, U_ILLEGAL_ARGUMENT_ERROR,
|
||||
"intlcal_equals: The second IntlCalendar is unconstructed", 0 TSRMLS_CC);
|
||||
@ -1139,8 +1138,9 @@ U_CFUNC PHP_FUNCTION(intlcal_set_skipped_wall_time_option)
|
||||
|
||||
U_CFUNC PHP_FUNCTION(intlcal_from_date_time)
|
||||
{
|
||||
zval **zv_arg,
|
||||
*zv_datetime = NULL,
|
||||
zval *zv_arg,
|
||||
zv_tmp,
|
||||
*zv_datetime = NULL,
|
||||
*zv_timestamp = NULL;
|
||||
php_date_obj *datetime;
|
||||
char *locale_str = NULL;
|
||||
@ -1150,28 +1150,27 @@ U_CFUNC PHP_FUNCTION(intlcal_from_date_time)
|
||||
Calendar *cal;
|
||||
intl_error_reset(NULL TSRMLS_CC);
|
||||
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Z|s!",
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z|s!",
|
||||
&zv_arg, &locale_str, &locale_str_len) == FAILURE) {
|
||||
intl_error_set(NULL, U_ILLEGAL_ARGUMENT_ERROR,
|
||||
"intlcal_from_date_time: bad arguments", 0 TSRMLS_CC);
|
||||
RETURN_NULL();
|
||||
}
|
||||
|
||||
if (!(Z_TYPE_PP(zv_arg) == IS_OBJECT && instanceof_function(
|
||||
Z_OBJCE_PP(zv_arg), php_date_get_date_ce() TSRMLS_CC))) {
|
||||
ALLOC_INIT_ZVAL(zv_datetime);
|
||||
object_init_ex(zv_datetime, php_date_get_date_ce());
|
||||
zend_call_method_with_1_params(&zv_datetime, NULL, NULL, "__construct",
|
||||
NULL, *zv_arg);
|
||||
if (!(Z_TYPE_P(zv_arg) == IS_OBJECT && instanceof_function(
|
||||
Z_OBJCE_P(zv_arg), php_date_get_date_ce() TSRMLS_CC))) {
|
||||
object_init_ex(&zv_tmp, php_date_get_date_ce());
|
||||
zend_call_method_with_1_params(&zv_tmp, NULL, NULL, "__construct", NULL, zv_arg);
|
||||
if (EG(exception)) {
|
||||
zend_object_store_ctor_failed(zv_datetime TSRMLS_CC);
|
||||
zend_object_store_ctor_failed(Z_OBJ(zv_tmp) TSRMLS_CC);
|
||||
goto error;
|
||||
}
|
||||
zv_datetime = &zv_tmp;
|
||||
} else {
|
||||
zv_datetime = *zv_arg;
|
||||
zv_datetime = zv_arg;
|
||||
}
|
||||
|
||||
datetime = (php_date_obj*)zend_object_store_get_object(zv_datetime TSRMLS_CC);
|
||||
datetime = Z_PHPDATE_P(zv_datetime);
|
||||
if (!datetime->time) {
|
||||
intl_error_set(NULL, U_ILLEGAL_ARGUMENT_ERROR,
|
||||
"intlcal_from_date_time: DateTime object is unconstructed",
|
||||
@ -1179,8 +1178,7 @@ U_CFUNC PHP_FUNCTION(intlcal_from_date_time)
|
||||
goto error;
|
||||
}
|
||||
|
||||
zend_call_method_with_0_params(&zv_datetime, php_date_get_date_ce(),
|
||||
NULL, "gettimestamp", &zv_timestamp);
|
||||
zend_call_method_with_0_params(zv_datetime, php_date_get_date_ce(), NULL, "gettimestamp", zv_timestamp);
|
||||
if (!zv_timestamp || Z_TYPE_P(zv_timestamp) != IS_LONG) {
|
||||
intl_error_set(NULL, U_ILLEGAL_ARGUMENT_ERROR,
|
||||
"intlcal_from_date_time: bad DateTime; call to "
|
||||
@ -1222,17 +1220,17 @@ U_CFUNC PHP_FUNCTION(intlcal_from_date_time)
|
||||
calendar_object_create(return_value, cal TSRMLS_CC);
|
||||
|
||||
error:
|
||||
if (zv_datetime != *zv_arg) {
|
||||
zval_ptr_dtor(&zv_datetime);
|
||||
if (zv_datetime != zv_arg) {
|
||||
zval_ptr_dtor(zv_datetime);
|
||||
}
|
||||
if (zv_timestamp) {
|
||||
zval_ptr_dtor(&zv_timestamp);
|
||||
zval_ptr_dtor(zv_timestamp);
|
||||
}
|
||||
}
|
||||
|
||||
U_CFUNC PHP_FUNCTION(intlcal_to_date_time)
|
||||
{
|
||||
zval *retval = NULL;
|
||||
zval retval;
|
||||
CALENDAR_METHOD_INIT_VARS;
|
||||
|
||||
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O",
|
||||
@ -1250,7 +1248,7 @@ U_CFUNC PHP_FUNCTION(intlcal_to_date_time)
|
||||
int64_t ts;
|
||||
char ts_str[sizeof("@-9223372036854775808")];
|
||||
int ts_str_len;
|
||||
zval ts_zval = zval_used_for_init;
|
||||
zval ts_tmp, ts_zval = zval_used_for_init;
|
||||
|
||||
INTL_METHOD_CHECK_STATUS(co, "Call to ICU method has failed");
|
||||
|
||||
@ -1261,15 +1259,18 @@ U_CFUNC PHP_FUNCTION(intlcal_to_date_time)
|
||||
RETURN_FALSE;
|
||||
}
|
||||
|
||||
ZVAL_UNDEF(&retval);
|
||||
ts = (int64_t)date;
|
||||
|
||||
ts_str_len = slprintf(ts_str, sizeof(ts_str), "@%I64d", ts);
|
||||
ZVAL_STRINGL(&ts_zval, ts_str, ts_str_len, 0);
|
||||
ZVAL_STRINGL(&ts_zval, ts_str, ts_str_len);
|
||||
//???
|
||||
efree(ts_str);
|
||||
|
||||
/* Now get the time zone */
|
||||
const TimeZone& tz = co->ucal->getTimeZone();
|
||||
zval *timezone_zval = timezone_convert_to_datetimezone(
|
||||
&tz, CALENDAR_ERROR_P(co), "intlcal_to_date_time" TSRMLS_CC);
|
||||
&tz, CALENDAR_ERROR_P(co), "intlcal_to_date_time", &ts_zval TSRMLS_CC);
|
||||
if (timezone_zval == NULL) {
|
||||
RETURN_FALSE;
|
||||
}
|
||||
@ -1278,36 +1279,33 @@ U_CFUNC PHP_FUNCTION(intlcal_to_date_time)
|
||||
|
||||
/* Finally, instantiate object and call constructor */
|
||||
object_init_ex(return_value, php_date_get_date_ce());
|
||||
zend_call_method_with_2_params(&return_value, NULL, NULL, "__construct",
|
||||
NULL, &ts_zval, timezone_zval);
|
||||
zend_call_method_with_2_params(return_value, NULL, NULL, "__construct", NULL, &ts_zval, timezone_zval);
|
||||
if (EG(exception)) {
|
||||
intl_errors_set(CALENDAR_ERROR_P(co), U_ILLEGAL_ARGUMENT_ERROR,
|
||||
"intlcal_to_date_time: DateTime constructor has thrown exception",
|
||||
1 TSRMLS_CC);
|
||||
zend_object_store_ctor_failed(return_value TSRMLS_CC);
|
||||
zval_ptr_dtor(&return_value);
|
||||
zend_object_store_ctor_failed(Z_OBJ_P(return_value) TSRMLS_CC);
|
||||
zval_ptr_dtor(return_value);
|
||||
|
||||
RETVAL_FALSE;
|
||||
goto error;
|
||||
}
|
||||
|
||||
/* due to bug #40743, we have to set the time zone again */
|
||||
zend_call_method_with_1_params(&return_value, NULL, NULL, "settimezone",
|
||||
zend_call_method_with_1_params(return_value, NULL, NULL, "settimezone",
|
||||
&retval, timezone_zval);
|
||||
if (retval == NULL || Z_TYPE_P(retval) == IS_BOOL) {
|
||||
if (Z_ISUNDEF(retval) || Z_TYPE(retval) == IS_FALSE) {
|
||||
intl_errors_set(CALENDAR_ERROR_P(co), U_ILLEGAL_ARGUMENT_ERROR,
|
||||
"intlcal_to_date_time: call to DateTime::setTimeZone has failed",
|
||||
1 TSRMLS_CC);
|
||||
zval_ptr_dtor(&return_value);
|
||||
zval_ptr_dtor(return_value);
|
||||
RETVAL_FALSE;
|
||||
goto error;
|
||||
}
|
||||
|
||||
error:
|
||||
zval_ptr_dtor(&timezone_zval);
|
||||
if (retval != NULL) {
|
||||
zval_ptr_dtor(&retval);
|
||||
}
|
||||
zval_ptr_dtor(timezone_zval);
|
||||
zval_ptr_dtor(&retval);
|
||||
}
|
||||
|
||||
U_CFUNC PHP_FUNCTION(intlcal_get_error_code)
|
||||
@ -1322,7 +1320,7 @@ U_CFUNC PHP_FUNCTION(intlcal_get_error_code)
|
||||
}
|
||||
|
||||
/* Fetch the object (without resetting its last error code ). */
|
||||
co = (Calendar_object*)zend_object_store_get_object(object TSRMLS_CC);
|
||||
co = Z_INTL_CALENDAR_P(object);
|
||||
if (co == NULL)
|
||||
RETURN_FALSE;
|
||||
|
||||
@ -1331,7 +1329,7 @@ U_CFUNC PHP_FUNCTION(intlcal_get_error_code)
|
||||
|
||||
U_CFUNC PHP_FUNCTION(intlcal_get_error_message)
|
||||
{
|
||||
const char* message = NULL;
|
||||
zend_string* message = NULL;
|
||||
CALENDAR_METHOD_INIT_VARS;
|
||||
|
||||
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O",
|
||||
@ -1343,11 +1341,11 @@ U_CFUNC PHP_FUNCTION(intlcal_get_error_message)
|
||||
|
||||
|
||||
/* Fetch the object (without resetting its last error code ). */
|
||||
co = (Calendar_object*)zend_object_store_get_object(object TSRMLS_CC);
|
||||
co = Z_INTL_CALENDAR_P(object);
|
||||
if (co == NULL)
|
||||
RETURN_FALSE;
|
||||
|
||||
/* Return last error message. */
|
||||
message = intl_error_get_message(CALENDAR_ERROR_P(co) TSRMLS_CC);
|
||||
RETURN_STRING(message, 0);
|
||||
RETURN_STR(message);
|
||||
}
|
||||
|
@ -38,9 +38,9 @@ static inline GregorianCalendar *fetch_greg(Calendar_object *co) {
|
||||
|
||||
static void _php_intlgregcal_constructor_body(INTERNAL_FUNCTION_PARAMETERS)
|
||||
{
|
||||
zval **tz_object = NULL;
|
||||
zval **args_a[6] = {0},
|
||||
***args = &args_a[0];
|
||||
zval *tz_object = NULL;
|
||||
zval args_a[6] = {0},
|
||||
*args = &args_a[0];
|
||||
char *locale = NULL;
|
||||
int locale_len;
|
||||
long largs[6];
|
||||
@ -56,7 +56,7 @@ static void _php_intlgregcal_constructor_body(INTERNAL_FUNCTION_PARAMETERS)
|
||||
RETURN_NULL();
|
||||
}
|
||||
for (variant = ZEND_NUM_ARGS();
|
||||
variant > 0 && Z_TYPE_PP(args[variant - 1]) == IS_NULL;
|
||||
variant > 0 && Z_TYPE(args[variant - 1]) == IS_NULL;
|
||||
variant--) {}
|
||||
if (variant == 4) {
|
||||
intl_error_set(NULL, U_ILLEGAL_ARGUMENT_ERROR,
|
||||
@ -68,7 +68,7 @@ static void _php_intlgregcal_constructor_body(INTERNAL_FUNCTION_PARAMETERS)
|
||||
// argument parsing
|
||||
if (variant <= 2) {
|
||||
if (zend_parse_parameters(MIN(ZEND_NUM_ARGS(), 2) TSRMLS_CC,
|
||||
"|Z!s!", &tz_object, &locale, &locale_len) == FAILURE) {
|
||||
"|z!s!", &tz_object, &locale, &locale_len) == FAILURE) {
|
||||
intl_error_set(NULL, U_ILLEGAL_ARGUMENT_ERROR,
|
||||
"intlgregcal_create_instance: bad arguments", 0 TSRMLS_CC);
|
||||
RETURN_NULL();
|
||||
@ -158,8 +158,7 @@ static void _php_intlgregcal_constructor_body(INTERNAL_FUNCTION_PARAMETERS)
|
||||
gcal->adoptTimeZone(tz);
|
||||
}
|
||||
|
||||
Calendar_object *co = (Calendar_object*)zend_object_store_get_object(
|
||||
return_value TSRMLS_CC);
|
||||
Calendar_object *co = Z_INTL_CALENDAR_P(return_value);
|
||||
co->ucal = gcal;
|
||||
}
|
||||
|
||||
@ -169,12 +168,12 @@ U_CFUNC PHP_FUNCTION(intlgregcal_create_instance)
|
||||
intl_error_reset(NULL TSRMLS_CC);
|
||||
|
||||
object_init_ex(return_value, GregorianCalendar_ce_ptr);
|
||||
orig = *return_value;
|
||||
ZVAL_COPY_VALUE(&orig, return_value);
|
||||
|
||||
_php_intlgregcal_constructor_body(INTERNAL_FUNCTION_PARAM_PASSTHRU);
|
||||
|
||||
if (Z_TYPE_P(return_value) == IS_NULL) {
|
||||
zend_object_store_ctor_failed(&orig TSRMLS_CC);
|
||||
zend_object_store_ctor_failed(Z_OBJ(orig) TSRMLS_CC);
|
||||
zval_dtor(&orig);
|
||||
}
|
||||
}
|
||||
@ -189,7 +188,7 @@ U_CFUNC PHP_METHOD(IntlGregorianCalendar, __construct)
|
||||
_php_intlgregcal_constructor_body(INTERNAL_FUNCTION_PARAM_PASSTHRU);
|
||||
|
||||
if (Z_TYPE_P(return_value) == IS_NULL) {
|
||||
zend_object_store_ctor_failed(&orig_this TSRMLS_CC);
|
||||
zend_object_store_ctor_failed(Z_OBJ(orig_this) TSRMLS_CC);
|
||||
zval_dtor(&orig_this);
|
||||
}
|
||||
}
|
||||
|
@ -36,48 +36,36 @@ static zend_object_handlers Collator_handlers;
|
||||
*/
|
||||
|
||||
/* {{{ Collator_objects_dtor */
|
||||
static void Collator_objects_dtor(
|
||||
void *object,
|
||||
zend_object_handle handle TSRMLS_DC )
|
||||
static void Collator_objects_dtor(zend_object *object TSRMLS_DC )
|
||||
{
|
||||
zend_objects_destroy_object( object, handle TSRMLS_CC );
|
||||
zend_objects_destroy_object(object TSRMLS_CC );
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ Collator_objects_free */
|
||||
void Collator_objects_free( zend_object *object TSRMLS_DC )
|
||||
void Collator_objects_free(zend_object *object TSRMLS_DC )
|
||||
{
|
||||
Collator_object* co = (Collator_object*)object;
|
||||
Collator_object* co = php_collator_fetch_object(object);
|
||||
|
||||
zend_object_std_dtor( &co->zo TSRMLS_CC );
|
||||
zend_object_std_dtor(&co->zo TSRMLS_CC );
|
||||
|
||||
collator_object_destroy( co TSRMLS_CC );
|
||||
|
||||
efree( co );
|
||||
collator_object_destroy(co TSRMLS_CC );
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ Collator_object_create */
|
||||
zend_object_value Collator_object_create(
|
||||
zend_class_entry *ce TSRMLS_DC )
|
||||
zend_object *Collator_object_create(zend_class_entry *ce TSRMLS_DC )
|
||||
{
|
||||
zend_object_value retval;
|
||||
Collator_object* intern;
|
||||
|
||||
intern = ecalloc( 1, sizeof(Collator_object) );
|
||||
intl_error_init( COLLATOR_ERROR_P( intern ) TSRMLS_CC );
|
||||
zend_object_std_init( &intern->zo, ce TSRMLS_CC );
|
||||
intern = ecalloc(1, sizeof(Collator_object) + sizeof(zval) * (ce->default_properties_count - 1));
|
||||
intl_error_init(COLLATOR_ERROR_P(intern) TSRMLS_CC);
|
||||
zend_object_std_init(&intern->zo, ce TSRMLS_CC );
|
||||
object_properties_init(&intern->zo, ce);
|
||||
|
||||
retval.handle = zend_objects_store_put(
|
||||
intern,
|
||||
Collator_objects_dtor,
|
||||
(zend_objects_free_object_storage_t)Collator_objects_free,
|
||||
NULL TSRMLS_CC );
|
||||
intern->zo.handlers = &Collator_handlers;
|
||||
|
||||
retval.handlers = &Collator_handlers;
|
||||
|
||||
return retval;
|
||||
return &intern->zo;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
@ -148,7 +136,10 @@ void collator_register_Collator_class( TSRMLS_D )
|
||||
sizeof Collator_handlers);
|
||||
/* Collator has no usable clone semantics - ucol_cloneBinary/ucol_openBinary require binary buffer
|
||||
for which we don't have the place to keep */
|
||||
Collator_handlers.offset = XtOffsetOf(Collator_object, zo);
|
||||
Collator_handlers.clone_obj = NULL;
|
||||
Collator_handlers.dtor_obj = Collator_objects_dtor;
|
||||
Collator_handlers.free_obj = Collator_objects_free;
|
||||
|
||||
/* Declare 'Collator' class properties. */
|
||||
if( !Collator_ce_ptr )
|
||||
|
@ -27,13 +27,14 @@
|
||||
#include <unicode/ucol.h>
|
||||
|
||||
typedef struct {
|
||||
zend_object zo;
|
||||
|
||||
// error handling
|
||||
intl_error err;
|
||||
|
||||
// ICU collator
|
||||
UCollator* ucoll;
|
||||
|
||||
zend_object zo;
|
||||
|
||||
} Collator_object;
|
||||
|
||||
#define COLLATOR_ERROR(co) (co)->err
|
||||
@ -42,6 +43,11 @@ typedef struct {
|
||||
#define COLLATOR_ERROR_CODE(co) INTL_ERROR_CODE(COLLATOR_ERROR(co))
|
||||
#define COLLATOR_ERROR_CODE_P(co) &(INTL_ERROR_CODE(COLLATOR_ERROR(co)))
|
||||
|
||||
static inline Collator_object *php_intl_collator_fetch_object(zend_object *obj) {
|
||||
return (Collator_object *)((char*)(obj) - XtOffsetOf(Collator_object, zo));
|
||||
}
|
||||
#define Z_INTL_COLLATOR_P(zv) php_intl_collator_fetch_object(Z_OBJ_P(zv))
|
||||
|
||||
void collator_register_Collator_class( TSRMLS_D );
|
||||
void collator_object_init( Collator_object* co TSRMLS_DC );
|
||||
void collator_object_destroy( Collator_object* co TSRMLS_DC );
|
||||
@ -55,7 +61,7 @@ extern zend_class_entry *Collator_ce_ptr;
|
||||
Collator_object* co = NULL; \
|
||||
intl_error_reset( NULL TSRMLS_CC ); \
|
||||
|
||||
#define COLLATOR_METHOD_FETCH_OBJECT INTL_METHOD_FETCH_OBJECT(Collator, co)
|
||||
#define COLLATOR_METHOD_FETCH_OBJECT INTL_METHOD_FETCH_OBJECT(INIL_COLLATOR, co)
|
||||
|
||||
// Macro to check return value of a ucol_* function call.
|
||||
#define COLLATOR_CHECK_STATUS( co, msg ) \
|
||||
|
@ -35,31 +35,31 @@
|
||||
#endif
|
||||
|
||||
#define COLLATOR_CONVERT_RETURN_FAILED(retval) { \
|
||||
zval_add_ref( &retval ); \
|
||||
zval_add_ref( retval ); \
|
||||
return retval; \
|
||||
}
|
||||
|
||||
/* {{{ collator_convert_hash_item_from_utf8_to_utf16 */
|
||||
static void collator_convert_hash_item_from_utf8_to_utf16(
|
||||
HashTable* hash, int hashKeyType, char* hashKey, ulong hashIndex,
|
||||
HashTable* hash, zend_string *hashKey, ulong hashIndex,
|
||||
UErrorCode* status )
|
||||
{
|
||||
const char* old_val;
|
||||
int old_val_len;
|
||||
UChar* new_val = NULL;
|
||||
int new_val_len = 0;
|
||||
zval** hashData = NULL;
|
||||
zval* znew_val = NULL;
|
||||
zval* hashData = NULL;
|
||||
zval znew_val;
|
||||
|
||||
/* Get current hash item. */
|
||||
zend_hash_get_current_data( hash, (void**) &hashData );
|
||||
hashData = zend_hash_get_current_data( hash );
|
||||
|
||||
/* Process string values only. */
|
||||
if( Z_TYPE_P( *hashData ) != IS_STRING )
|
||||
if( Z_TYPE_P( hashData ) != IS_STRING )
|
||||
return;
|
||||
|
||||
old_val = Z_STRVAL_P( *hashData );
|
||||
old_val_len = Z_STRLEN_P( *hashData );
|
||||
old_val = Z_STRVAL_P( hashData );
|
||||
old_val_len = Z_STRLEN_P( hashData );
|
||||
|
||||
/* Convert it from UTF-8 to UTF-16LE and save the result to new_val[_len]. */
|
||||
intl_convert_utf8_to_utf16( &new_val, &new_val_len, old_val, old_val_len, status );
|
||||
@ -67,43 +67,42 @@ static void collator_convert_hash_item_from_utf8_to_utf16(
|
||||
return;
|
||||
|
||||
/* Update current hash item with the converted value. */
|
||||
MAKE_STD_ZVAL( znew_val );
|
||||
ZVAL_STRINGL( znew_val, (char*)new_val, UBYTES(new_val_len), FALSE );
|
||||
ZVAL_STRINGL( &znew_val, (char*)new_val, UBYTES(new_val_len) );
|
||||
//???
|
||||
efree(new_val);
|
||||
|
||||
if( hashKeyType == HASH_KEY_IS_STRING )
|
||||
if( hashKey)
|
||||
{
|
||||
zend_hash_update( hash, hashKey, strlen( hashKey ) + 1,
|
||||
(void*) &znew_val, sizeof(zval*), NULL );
|
||||
zend_hash_update( hash, hashKey, &znew_val);
|
||||
}
|
||||
else /* hashKeyType == HASH_KEY_IS_LONG */
|
||||
{
|
||||
zend_hash_index_update( hash, hashIndex,
|
||||
(void*) &znew_val, sizeof(zval*), NULL );
|
||||
zend_hash_index_update( hash, hashIndex, &znew_val);
|
||||
}
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ collator_convert_hash_item_from_utf16_to_utf8 */
|
||||
static void collator_convert_hash_item_from_utf16_to_utf8(
|
||||
HashTable* hash, int hashKeyType, char* hashKey, ulong hashIndex,
|
||||
HashTable* hash, zend_string* hashKey, ulong hashIndex,
|
||||
UErrorCode* status )
|
||||
{
|
||||
const char* old_val;
|
||||
int old_val_len;
|
||||
char* new_val = NULL;
|
||||
int new_val_len = 0;
|
||||
zval** hashData = NULL;
|
||||
zval* znew_val = NULL;
|
||||
int old_val_len;
|
||||
char* new_val = NULL;
|
||||
int new_val_len = 0;
|
||||
zval* hashData = NULL;
|
||||
zval znew_val;
|
||||
|
||||
/* Get current hash item. */
|
||||
zend_hash_get_current_data( hash, (void**) &hashData );
|
||||
hashData = zend_hash_get_current_data( hash );
|
||||
|
||||
/* Process string values only. */
|
||||
if( Z_TYPE_P( *hashData ) != IS_STRING )
|
||||
if( Z_TYPE_P( hashData ) != IS_STRING )
|
||||
return;
|
||||
|
||||
old_val = Z_STRVAL_P( *hashData );
|
||||
old_val_len = Z_STRLEN_P( *hashData );
|
||||
old_val = Z_STRVAL_P( hashData );
|
||||
old_val_len = Z_STRLEN_P( hashData );
|
||||
|
||||
/* Convert it from UTF-16LE to UTF-8 and save the result to new_val[_len]. */
|
||||
intl_convert_utf16_to_utf8( &new_val, &new_val_len,
|
||||
@ -112,18 +111,17 @@ static void collator_convert_hash_item_from_utf16_to_utf8(
|
||||
return;
|
||||
|
||||
/* Update current hash item with the converted value. */
|
||||
MAKE_STD_ZVAL( znew_val );
|
||||
ZVAL_STRINGL( znew_val, (char*)new_val, new_val_len, FALSE );
|
||||
ZVAL_STRINGL( &znew_val, (char*)new_val, new_val_len);
|
||||
//???
|
||||
efree(new_val);
|
||||
|
||||
if( hashKeyType == HASH_KEY_IS_STRING )
|
||||
if( hashKey )
|
||||
{
|
||||
zend_hash_update( hash, hashKey, strlen( hashKey ) + 1,
|
||||
(void*) &znew_val, sizeof(zval*), NULL );
|
||||
zend_hash_update( hash, hashKey, &znew_val);
|
||||
}
|
||||
else /* hashKeyType == HASH_KEY_IS_LONG */
|
||||
{
|
||||
zend_hash_index_update( hash, hashIndex,
|
||||
(void*) &znew_val, sizeof(zval*), NULL );
|
||||
zend_hash_index_update( hash, hashIndex, &znew_val);
|
||||
}
|
||||
}
|
||||
/* }}} */
|
||||
@ -133,23 +131,16 @@ static void collator_convert_hash_item_from_utf16_to_utf8(
|
||||
*/
|
||||
void collator_convert_hash_from_utf8_to_utf16( HashTable* hash, UErrorCode* status )
|
||||
{
|
||||
ulong hashIndex = 0;
|
||||
char* hashKey = NULL;
|
||||
int hashKeyType = 0;
|
||||
ulong hashIndex;
|
||||
zend_string *hashKey;
|
||||
|
||||
zend_hash_internal_pointer_reset( hash );
|
||||
while( ( hashKeyType = zend_hash_get_current_key( hash, &hashKey, &hashIndex, 0 ) )
|
||||
!= HASH_KEY_NON_EXISTENT )
|
||||
{
|
||||
ZEND_HASH_FOREACH_KEY(hash, hashIndex, hashKey) {
|
||||
/* Convert current hash item from UTF-8 to UTF-16LE. */
|
||||
collator_convert_hash_item_from_utf8_to_utf16(
|
||||
hash, hashKeyType, hashKey, hashIndex, status );
|
||||
hash, hashKey, hashIndex, status );
|
||||
if( U_FAILURE( *status ) )
|
||||
return;
|
||||
|
||||
/* Proceed to the next item. */
|
||||
zend_hash_move_forward( hash );
|
||||
}
|
||||
} ZEND_HASH_FOREACH_END();
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
@ -158,24 +149,17 @@ void collator_convert_hash_from_utf8_to_utf16( HashTable* hash, UErrorCode* stat
|
||||
*/
|
||||
void collator_convert_hash_from_utf16_to_utf8( HashTable* hash, UErrorCode* status )
|
||||
{
|
||||
ulong hashIndex = 0;
|
||||
char* hashKey = NULL;
|
||||
int hashKeyType = 0;
|
||||
ulong hashIndex;
|
||||
zend_string *hashKey;
|
||||
|
||||
zend_hash_internal_pointer_reset( hash );
|
||||
while( ( hashKeyType = zend_hash_get_current_key( hash, &hashKey, &hashIndex, 0 ) )
|
||||
!= HASH_KEY_NON_EXISTENT )
|
||||
{
|
||||
ZEND_HASH_FOREACH_KEY(hash, hashIndex, hashKey) {
|
||||
/* Convert current hash item from UTF-16LE to UTF-8. */
|
||||
collator_convert_hash_item_from_utf16_to_utf8(
|
||||
hash, hashKeyType, hashKey, hashIndex, status );
|
||||
hash, hashKey, hashIndex, status );
|
||||
if( U_FAILURE( *status ) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* Proceed to the next item. */
|
||||
zend_hash_move_forward( hash );
|
||||
}
|
||||
} ZEND_HASH_FOREACH_END();
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
@ -187,7 +171,7 @@ void collator_convert_hash_from_utf16_to_utf8( HashTable* hash, UErrorCode* stat
|
||||
*
|
||||
* @return zval* Converted string.
|
||||
*/
|
||||
zval* collator_convert_zstr_utf16_to_utf8( zval* utf16_zval )
|
||||
zval* collator_convert_zstr_utf16_to_utf8( zval* utf16_zval, zval *rv )
|
||||
{
|
||||
zval* utf8_zval = NULL;
|
||||
char* str = NULL;
|
||||
@ -200,8 +184,10 @@ zval* collator_convert_zstr_utf16_to_utf8( zval* utf16_zval )
|
||||
if( U_FAILURE( status ) )
|
||||
php_error( E_WARNING, "Error converting utf16 to utf8 in collator_convert_zval_utf16_to_utf8()" );
|
||||
|
||||
ALLOC_INIT_ZVAL( utf8_zval );
|
||||
ZVAL_STRINGL( utf8_zval, str, str_len, FALSE );
|
||||
utf8_zval = rv;
|
||||
ZVAL_STRINGL( utf8_zval, str, str_len);
|
||||
//???
|
||||
efree(str);
|
||||
|
||||
return utf8_zval;
|
||||
}
|
||||
@ -215,7 +201,7 @@ zval* collator_convert_zstr_utf16_to_utf8( zval* utf16_zval )
|
||||
*
|
||||
* @return zval* Converted string.
|
||||
*/
|
||||
zval* collator_convert_zstr_utf8_to_utf16( zval* utf8_zval )
|
||||
zval* collator_convert_zstr_utf8_to_utf16( zval* utf8_zval, zval *rv )
|
||||
{
|
||||
zval* zstr = NULL;
|
||||
UChar* ustr = NULL;
|
||||
@ -231,8 +217,10 @@ zval* collator_convert_zstr_utf8_to_utf16( zval* utf8_zval )
|
||||
php_error( E_WARNING, "Error casting object to string in collator_convert_zstr_utf8_to_utf16()" );
|
||||
|
||||
/* Set string. */
|
||||
ALLOC_INIT_ZVAL( zstr );
|
||||
ZVAL_STRINGL( zstr, (char*)ustr, UBYTES(ustr_len), FALSE );
|
||||
zstr = rv;
|
||||
ZVAL_STRINGL( zstr, (char*)ustr, UBYTES(ustr_len));
|
||||
//???
|
||||
efree((char *)ustr);
|
||||
|
||||
return zstr;
|
||||
}
|
||||
@ -241,7 +229,7 @@ zval* collator_convert_zstr_utf8_to_utf16( zval* utf8_zval )
|
||||
/* {{{ collator_convert_object_to_string
|
||||
* Convert object to UTF16-encoded string.
|
||||
*/
|
||||
zval* collator_convert_object_to_string( zval* obj TSRMLS_DC )
|
||||
zval* collator_convert_object_to_string( zval* obj, zval *rv TSRMLS_DC )
|
||||
{
|
||||
zval* zstr = NULL;
|
||||
UErrorCode status = U_ZERO_ERROR;
|
||||
@ -257,14 +245,14 @@ zval* collator_convert_object_to_string( zval* obj TSRMLS_DC )
|
||||
/* Try object's handlers. */
|
||||
if( Z_OBJ_HT_P(obj)->get )
|
||||
{
|
||||
zstr = Z_OBJ_HT_P(obj)->get( obj TSRMLS_CC );
|
||||
zstr = Z_OBJ_HT_P(obj)->get( obj, rv TSRMLS_CC );
|
||||
|
||||
switch( Z_TYPE_P( zstr ) )
|
||||
{
|
||||
case IS_OBJECT:
|
||||
{
|
||||
/* Bail out. */
|
||||
zval_ptr_dtor( &zstr );
|
||||
zval_ptr_dtor( zstr );
|
||||
COLLATOR_CONVERT_RETURN_FAILED( obj );
|
||||
} break;
|
||||
|
||||
@ -279,12 +267,12 @@ zval* collator_convert_object_to_string( zval* obj TSRMLS_DC )
|
||||
}
|
||||
else if( Z_OBJ_HT_P(obj)->cast_object )
|
||||
{
|
||||
ALLOC_INIT_ZVAL( zstr );
|
||||
zstr = rv;
|
||||
|
||||
if( Z_OBJ_HT_P(obj)->cast_object( obj, zstr, IS_STRING CAST_OBJECT_SHOULD_FREE TSRMLS_CC ) == FAILURE )
|
||||
{
|
||||
/* cast_object failed => bail out. */
|
||||
zval_ptr_dtor( &zstr );
|
||||
zval_ptr_dtor( zstr );
|
||||
COLLATOR_CONVERT_RETURN_FAILED( obj );
|
||||
}
|
||||
}
|
||||
@ -307,7 +295,9 @@ zval* collator_convert_object_to_string( zval* obj TSRMLS_DC )
|
||||
zval_dtor( zstr );
|
||||
|
||||
/* Set string. */
|
||||
ZVAL_STRINGL( zstr, (char*)ustr, UBYTES(ustr_len), FALSE );
|
||||
ZVAL_STRINGL( zstr, (char*)ustr, UBYTES(ustr_len));
|
||||
//???
|
||||
efree((char *)ustr);
|
||||
|
||||
/* Don't free ustr cause it's set in zstr without copy.
|
||||
* efree( ustr );
|
||||
@ -325,15 +315,15 @@ zval* collator_convert_object_to_string( zval* obj TSRMLS_DC )
|
||||
*
|
||||
* @return zval* Number. If str is not numeric string return number zero.
|
||||
*/
|
||||
zval* collator_convert_string_to_number( zval* str )
|
||||
zval* collator_convert_string_to_number( zval* str, zval *rv )
|
||||
{
|
||||
zval* num = collator_convert_string_to_number_if_possible( str );
|
||||
zval* num = collator_convert_string_to_number_if_possible( str, rv );
|
||||
if( num == str )
|
||||
{
|
||||
/* String wasn't converted => return zero. */
|
||||
zval_ptr_dtor( &num );
|
||||
zval_ptr_dtor( num );
|
||||
|
||||
ALLOC_INIT_ZVAL( num );
|
||||
num = rv;
|
||||
ZVAL_LONG( num, 0 );
|
||||
}
|
||||
|
||||
@ -349,9 +339,9 @@ zval* collator_convert_string_to_number( zval* str )
|
||||
*
|
||||
* @return zval* Number. If str is not numeric string return number zero.
|
||||
*/
|
||||
zval* collator_convert_string_to_double( zval* str )
|
||||
zval* collator_convert_string_to_double( zval* str, zval *rv )
|
||||
{
|
||||
zval* num = collator_convert_string_to_number( str );
|
||||
zval* num = collator_convert_string_to_number( str, rv );
|
||||
if( Z_TYPE_P(num) == IS_LONG )
|
||||
{
|
||||
ZVAL_DOUBLE( num, Z_LVAL_P( num ) );
|
||||
@ -370,9 +360,8 @@ zval* collator_convert_string_to_double( zval* str )
|
||||
* @return zval* Number if str is numeric string. Otherwise
|
||||
* original str param.
|
||||
*/
|
||||
zval* collator_convert_string_to_number_if_possible( zval* str )
|
||||
zval* collator_convert_string_to_number_if_possible( zval* str, zval *rv )
|
||||
{
|
||||
zval* num = NULL;
|
||||
int is_numeric = 0;
|
||||
long lval = 0;
|
||||
double dval = 0;
|
||||
@ -384,21 +373,18 @@ zval* collator_convert_string_to_number_if_possible( zval* str )
|
||||
|
||||
if( ( is_numeric = collator_is_numeric( (UChar*) Z_STRVAL_P(str), UCHARS( Z_STRLEN_P(str) ), &lval, &dval, 1 ) ) )
|
||||
{
|
||||
ALLOC_INIT_ZVAL( num );
|
||||
|
||||
if( is_numeric == IS_LONG )
|
||||
Z_LVAL_P(num) = lval;
|
||||
if( is_numeric == IS_LONG ) {
|
||||
ZVAL_LONG(rv, lval);
|
||||
}
|
||||
if( is_numeric == IS_DOUBLE )
|
||||
Z_DVAL_P(num) = dval;
|
||||
|
||||
Z_TYPE_P(num) = is_numeric;
|
||||
ZVAL_DOUBLE(rv, dval);
|
||||
}
|
||||
else
|
||||
{
|
||||
COLLATOR_CONVERT_RETURN_FAILED( str );
|
||||
}
|
||||
|
||||
return num;
|
||||
return rv;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
@ -410,7 +396,7 @@ zval* collator_convert_string_to_number_if_possible( zval* str )
|
||||
*
|
||||
* @return zval* UTF16 string.
|
||||
*/
|
||||
zval* collator_make_printable_zval( zval* arg )
|
||||
zval* collator_make_printable_zval( zval* arg, zval *rv )
|
||||
{
|
||||
zval arg_copy;
|
||||
int use_copy = 0;
|
||||
@ -422,12 +408,12 @@ zval* collator_make_printable_zval( zval* arg )
|
||||
|
||||
if( use_copy )
|
||||
{
|
||||
str = collator_convert_zstr_utf8_to_utf16( &arg_copy );
|
||||
str = collator_convert_zstr_utf8_to_utf16( &arg_copy, rv );
|
||||
zval_dtor( &arg_copy );
|
||||
}
|
||||
else
|
||||
{
|
||||
str = collator_convert_zstr_utf8_to_utf16( arg );
|
||||
str = collator_convert_zstr_utf8_to_utf16( arg, rv );
|
||||
}
|
||||
}
|
||||
else
|
||||
@ -448,7 +434,7 @@ zval* collator_make_printable_zval( zval* arg )
|
||||
* @return zval* Normalized copy of arg or unmodified arg
|
||||
* if normalization is not needed.
|
||||
*/
|
||||
zval* collator_normalize_sort_argument( zval* arg )
|
||||
zval* collator_normalize_sort_argument( zval* arg, zval *rv )
|
||||
{
|
||||
zval* n_arg = NULL;
|
||||
|
||||
@ -461,15 +447,15 @@ zval* collator_normalize_sort_argument( zval* arg )
|
||||
}
|
||||
|
||||
/* Try convert to number. */
|
||||
n_arg = collator_convert_string_to_number_if_possible( arg );
|
||||
n_arg = collator_convert_string_to_number_if_possible( arg, rv );
|
||||
|
||||
if( n_arg == arg )
|
||||
{
|
||||
/* Conversion to number failed. */
|
||||
zval_ptr_dtor( &n_arg );
|
||||
zval_ptr_dtor( n_arg );
|
||||
|
||||
/* Convert string to utf8. */
|
||||
n_arg = collator_convert_zstr_utf16_to_utf8( arg );
|
||||
n_arg = collator_convert_zstr_utf16_to_utf8( arg, rv );
|
||||
}
|
||||
|
||||
return n_arg;
|
||||
|
@ -24,15 +24,15 @@
|
||||
void collator_convert_hash_from_utf8_to_utf16( HashTable* hash, UErrorCode* status );
|
||||
void collator_convert_hash_from_utf16_to_utf8( HashTable* hash, UErrorCode* status );
|
||||
|
||||
zval* collator_convert_zstr_utf16_to_utf8( zval* utf16_zval );
|
||||
zval* collator_convert_zstr_utf8_to_utf16( zval* utf8_zval );
|
||||
zval* collator_convert_zstr_utf16_to_utf8( zval* utf16_zval, zval *rv );
|
||||
zval* collator_convert_zstr_utf8_to_utf16( zval* utf8_zval, zval *rv );
|
||||
|
||||
zval* collator_normalize_sort_argument( zval* arg );
|
||||
zval* collator_convert_object_to_string( zval* obj TSRMLS_DC );
|
||||
zval* collator_convert_string_to_number( zval* arg );
|
||||
zval* collator_convert_string_to_number_if_possible( zval* str );
|
||||
zval* collator_convert_string_to_double( zval* str );
|
||||
zval* collator_normalize_sort_argument( zval* arg, zval *rv );
|
||||
zval* collator_convert_object_to_string( zval* obj, zval *rv TSRMLS_DC );
|
||||
zval* collator_convert_string_to_number( zval* arg, zval *rv );
|
||||
zval* collator_convert_string_to_number_if_possible( zval* str, zval *rv );
|
||||
zval* collator_convert_string_to_double( zval* str, zval *rv );
|
||||
|
||||
zval* collator_make_printable_zval( zval* arg );
|
||||
zval* collator_make_printable_zval( zval* arg, zval *rv );
|
||||
|
||||
#endif // COLLATOR_CONVERT_H
|
||||
|
@ -43,7 +43,7 @@ PHP_FUNCTION( collator_get_error_code )
|
||||
}
|
||||
|
||||
/* Fetch the object (without resetting its last error code). */
|
||||
co = (Collator_object *) zend_object_store_get_object(object TSRMLS_CC);
|
||||
co = Z_INTL_COLLATOR_P(object);
|
||||
if( co == NULL )
|
||||
RETURN_FALSE;
|
||||
|
||||
@ -74,13 +74,15 @@ PHP_FUNCTION( collator_get_error_message )
|
||||
}
|
||||
|
||||
/* Fetch the object (without resetting its last error code). */
|
||||
co = (Collator_object *) zend_object_store_get_object( object TSRMLS_CC );
|
||||
co = Z_INTL_COLLATOR_P( object );
|
||||
if( co == NULL )
|
||||
RETURN_FALSE;
|
||||
|
||||
/* Return last error message. */
|
||||
message = intl_error_get_message( COLLATOR_ERROR_P( co ) TSRMLS_CC );
|
||||
RETURN_STRING( (char*)message, FALSE );
|
||||
RETVAL_STRING( (char*)message);
|
||||
//???
|
||||
efree((char *)message);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
|
@ -66,7 +66,7 @@ PHP_FUNCTION( collator_get_locale )
|
||||
COLLATOR_CHECK_STATUS( co, "Error getting locale by type" );
|
||||
|
||||
/* Return it. */
|
||||
RETVAL_STRINGL( locale_name, strlen(locale_name), TRUE );
|
||||
RETVAL_STRINGL( locale_name, strlen(locale_name) );
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
|
@ -36,7 +36,7 @@ typedef long ptrdiff_t;
|
||||
*/
|
||||
typedef struct _collator_sort_key_index {
|
||||
char* key; /* pointer to sort key */
|
||||
zval** zstr; /* pointer to original string(hash-item) */
|
||||
zval* zstr; /* pointer to original string(hash-item) */
|
||||
} collator_sort_key_index_t;
|
||||
|
||||
ZEND_EXTERN_MODULE_GLOBALS( intl )
|
||||
@ -53,25 +53,23 @@ static const size_t DEF_UTF16_BUF_SIZE = 1024;
|
||||
static int collator_regular_compare_function(zval *result, zval *op1, zval *op2 TSRMLS_DC)
|
||||
{
|
||||
Collator_object* co = NULL;
|
||||
|
||||
int rc = SUCCESS;
|
||||
|
||||
zval* str1 = collator_convert_object_to_string( op1 TSRMLS_CC );
|
||||
zval* str2 = collator_convert_object_to_string( op2 TSRMLS_CC );
|
||||
|
||||
zval* num1 = NULL;
|
||||
zval* num2 = NULL;
|
||||
zval* norm1 = NULL;
|
||||
zval* norm2 = NULL;
|
||||
int rc = SUCCESS;
|
||||
zval str1, str2;
|
||||
zval num1, num2;
|
||||
zval norm1, norm2;
|
||||
zval *num1_p = NULL, *num2_p = NULL;
|
||||
zval *norm1_p = NULL, *norm2_p = NULL;
|
||||
zval* str1_p = collator_convert_object_to_string( op1, &str1 TSRMLS_CC );
|
||||
zval* str2_p = collator_convert_object_to_string( op2, &str2 TSRMLS_CC );
|
||||
|
||||
/* If both args are strings AND either of args is not numeric string
|
||||
* then use ICU-compare. Otherwise PHP-compare. */
|
||||
if( Z_TYPE_P(str1) == IS_STRING && Z_TYPE_P(str2) == IS_STRING &&
|
||||
( str1 == ( num1 = collator_convert_string_to_number_if_possible( str1 ) ) ||
|
||||
str2 == ( num2 = collator_convert_string_to_number_if_possible( str2 ) ) ) )
|
||||
if( Z_TYPE_P(str1_p) == IS_STRING && Z_TYPE_P(str2_p) == IS_STRING &&
|
||||
( str1_p == ( num1_p = collator_convert_string_to_number_if_possible( str1_p, &num1 ) ) ||
|
||||
str2_p == ( num2_p = collator_convert_string_to_number_if_possible( str2_p, &num2 ) ) ) )
|
||||
{
|
||||
/* Fetch collator object. */
|
||||
co = (Collator_object *) zend_object_store_get_object( INTL_G(current_collator) TSRMLS_CC );
|
||||
co = Z_INTL_COLLATOR_P(&INTL_G(current_collator) TSRMLS_CC );
|
||||
|
||||
if (!co || !co->ucoll) {
|
||||
intl_error_set_code( NULL, COLLATOR_ERROR_CODE( co ) TSRMLS_CC );
|
||||
@ -82,61 +80,60 @@ static int collator_regular_compare_function(zval *result, zval *op1, zval *op2
|
||||
}
|
||||
|
||||
/* Compare the strings using ICU. */
|
||||
result->value.lval = ucol_strcoll(
|
||||
co->ucoll,
|
||||
INTL_Z_STRVAL_P(str1), INTL_Z_STRLEN_P(str1),
|
||||
INTL_Z_STRVAL_P(str2), INTL_Z_STRLEN_P(str2) );
|
||||
result->type = IS_LONG;
|
||||
ZVAL_LONG(result, ucol_strcoll(
|
||||
co->ucoll,
|
||||
INTL_Z_STRVAL_P(str1_p), INTL_Z_STRLEN_P(str1_p),
|
||||
INTL_Z_STRVAL_P(str2_p), INTL_Z_STRLEN_P(str2_p) ));
|
||||
}
|
||||
else
|
||||
{
|
||||
/* num1 is set if str1 and str2 are strings. */
|
||||
if( num1 )
|
||||
if( num1_p )
|
||||
{
|
||||
if( num1 == str1 )
|
||||
if( num1_p == str1_p )
|
||||
{
|
||||
/* str1 is string but not numeric string
|
||||
* just convert it to utf8.
|
||||
*/
|
||||
norm1 = collator_convert_zstr_utf16_to_utf8( str1 );
|
||||
norm1_p = collator_convert_zstr_utf16_to_utf8( str1_p, &norm1 );
|
||||
|
||||
/* num2 is not set but str2 is string => do normalization. */
|
||||
norm2 = collator_normalize_sort_argument( str2 );
|
||||
norm2_p = collator_normalize_sort_argument( str2_p, &norm2 );
|
||||
}
|
||||
else
|
||||
{
|
||||
/* str1 is numeric strings => passthru to PHP-compare. */
|
||||
zval_add_ref( &num1 );
|
||||
norm1 = num1;
|
||||
zval_add_ref( num1_p );
|
||||
norm1_p = num1_p;
|
||||
|
||||
/* str2 is numeric strings => passthru to PHP-compare. */
|
||||
zval_add_ref( &num2 );
|
||||
norm2 = num2;
|
||||
zval_add_ref( num2_p );
|
||||
norm2_p = num2_p;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* num1 is not set if str1 or str2 is not a string => do normalization. */
|
||||
norm1 = collator_normalize_sort_argument( str1 );
|
||||
norm1_p = collator_normalize_sort_argument( str1_p, &norm1 );
|
||||
|
||||
/* if num1 is not set then num2 is not set as well => do normalization. */
|
||||
norm2 = collator_normalize_sort_argument( str2 );
|
||||
norm2_p = collator_normalize_sort_argument( str2_p, &norm2 );
|
||||
}
|
||||
|
||||
rc = compare_function( result, norm1, norm2 TSRMLS_CC );
|
||||
rc = compare_function( result, norm1_p, norm2_p TSRMLS_CC );
|
||||
|
||||
zval_ptr_dtor( &norm1 );
|
||||
zval_ptr_dtor( &norm2 );
|
||||
zval_ptr_dtor( norm1_p );
|
||||
zval_ptr_dtor( norm2_p );
|
||||
}
|
||||
|
||||
if( num1 )
|
||||
zval_ptr_dtor( &num1 );
|
||||
if( num1_p )
|
||||
zval_ptr_dtor( num1_p );
|
||||
|
||||
if( num2 )
|
||||
zval_ptr_dtor( &num2 );
|
||||
if( num2_p )
|
||||
zval_ptr_dtor( num2_p );
|
||||
|
||||
zval_ptr_dtor( &str1 );
|
||||
zval_ptr_dtor( &str2 );
|
||||
zval_ptr_dtor( str1_p );
|
||||
zval_ptr_dtor( str2_p );
|
||||
|
||||
return rc;
|
||||
}
|
||||
@ -148,27 +145,28 @@ static int collator_regular_compare_function(zval *result, zval *op1, zval *op2
|
||||
static int collator_numeric_compare_function(zval *result, zval *op1, zval *op2 TSRMLS_DC)
|
||||
{
|
||||
int rc = SUCCESS;
|
||||
zval* num1 = NULL;
|
||||
zval* num2 = NULL;
|
||||
zval num1, num2;
|
||||
zval *num1_p = NULL;
|
||||
zval *num2_p = NULL;
|
||||
|
||||
if( Z_TYPE_P(op1) == IS_STRING )
|
||||
{
|
||||
num1 = collator_convert_string_to_double( op1 );
|
||||
op1 = num1;
|
||||
num1_p = collator_convert_string_to_double( op1, &num1 );
|
||||
op1 = num1_p;
|
||||
}
|
||||
|
||||
if( Z_TYPE_P(op2) == IS_STRING )
|
||||
{
|
||||
num2 = collator_convert_string_to_double( op2 );
|
||||
op2 = num2;
|
||||
num2_p = collator_convert_string_to_double( op2, &num2 );
|
||||
op2 = num2_p;
|
||||
}
|
||||
|
||||
rc = numeric_compare_function( result, op1, op2 TSRMLS_CC);
|
||||
|
||||
if( num1 )
|
||||
zval_ptr_dtor( &num1 );
|
||||
if( num2 )
|
||||
zval_ptr_dtor( &num2 );
|
||||
if( num1_p )
|
||||
zval_ptr_dtor( num1_p );
|
||||
if( num2_p )
|
||||
zval_ptr_dtor( num2_p );
|
||||
|
||||
return rc;
|
||||
}
|
||||
@ -179,26 +177,26 @@ static int collator_numeric_compare_function(zval *result, zval *op1, zval *op2
|
||||
*/
|
||||
static int collator_icu_compare_function(zval *result, zval *op1, zval *op2 TSRMLS_DC)
|
||||
{
|
||||
zval str1, str2;
|
||||
int rc = SUCCESS;
|
||||
Collator_object* co = NULL;
|
||||
zval* str1 = NULL;
|
||||
zval* str2 = NULL;
|
||||
zval *str1_p = NULL;
|
||||
zval *str2_p = NULL;
|
||||
|
||||
str1 = collator_make_printable_zval( op1 );
|
||||
str2 = collator_make_printable_zval( op2 );
|
||||
str1_p = collator_make_printable_zval( op1, &str1);
|
||||
str2_p = collator_make_printable_zval( op2, &str2 );
|
||||
|
||||
/* Fetch collator object. */
|
||||
co = (Collator_object *) zend_object_store_get_object( INTL_G(current_collator) TSRMLS_CC );
|
||||
co = Z_INTL_COLLATOR_P(&INTL_G(current_collator) TSRMLS_CC );
|
||||
|
||||
/* Compare the strings using ICU. */
|
||||
result->value.lval = ucol_strcoll(
|
||||
co->ucoll,
|
||||
INTL_Z_STRVAL_P(str1), INTL_Z_STRLEN_P(str1),
|
||||
INTL_Z_STRVAL_P(str2), INTL_Z_STRLEN_P(str2) );
|
||||
result->type = IS_LONG;
|
||||
ZVAL_LONG(result, ucol_strcoll(
|
||||
co->ucoll,
|
||||
INTL_Z_STRVAL_P(str1_p), INTL_Z_STRLEN_P(str1_p),
|
||||
INTL_Z_STRVAL_P(str2_p), INTL_Z_STRLEN_P(str2_p) ));
|
||||
|
||||
zval_ptr_dtor( &str1 );
|
||||
zval_ptr_dtor( &str2 );
|
||||
zval_ptr_dtor( str1_p );
|
||||
zval_ptr_dtor( str2_p );
|
||||
|
||||
return rc;
|
||||
}
|
||||
@ -218,8 +216,8 @@ static int collator_compare_func( const void* a, const void* b TSRMLS_DC )
|
||||
f = (Bucket *) a;
|
||||
s = (Bucket *) b;
|
||||
|
||||
first = *((zval **) f->pData);
|
||||
second = *((zval **) s->pData);
|
||||
first = &f->val;
|
||||
second = &s->val;
|
||||
|
||||
if( INTL_G(compare_func)( &result, first, second TSRMLS_CC) == FAILURE )
|
||||
return 0;
|
||||
@ -289,9 +287,9 @@ static collator_compare_func_t collator_get_compare_function( const long sort_fl
|
||||
*/
|
||||
static void collator_sort_internal( int renumber, INTERNAL_FUNCTION_PARAMETERS )
|
||||
{
|
||||
zval saved_collator;
|
||||
zval* array = NULL;
|
||||
HashTable* hash = NULL;
|
||||
zval* saved_collator = NULL;
|
||||
long sort_flags = COLLATOR_SORT_REGULAR;
|
||||
|
||||
COLLATOR_METHOD_INIT_VARS
|
||||
@ -319,14 +317,14 @@ static void collator_sort_internal( int renumber, INTERNAL_FUNCTION_PARAMETERS )
|
||||
COLLATOR_CHECK_STATUS( co, "Error converting hash from UTF-8 to UTF-16" );
|
||||
|
||||
/* Save specified collator in the request-global (?) variable. */
|
||||
saved_collator = INTL_G( current_collator );
|
||||
INTL_G( current_collator ) = object;
|
||||
ZVAL_COPY_VALUE(&saved_collator, &INTL_G( current_collator ));
|
||||
ZVAL_COPY_VALUE(&INTL_G( current_collator ), object);
|
||||
|
||||
/* Sort specified array. */
|
||||
zend_hash_sort( hash, zend_qsort, collator_compare_func, renumber TSRMLS_CC );
|
||||
|
||||
/* Restore saved collator. */
|
||||
INTL_G( current_collator ) = saved_collator;
|
||||
ZVAL_COPY_VALUE(&INTL_G( current_collator ), &saved_collator);
|
||||
|
||||
/* Convert strings in the specified array back to UTF-8. */
|
||||
collator_convert_hash_from_utf16_to_utf8( hash, COLLATOR_ERROR_CODE_P( co ) );
|
||||
@ -358,7 +356,7 @@ PHP_FUNCTION( collator_sort_with_sort_keys )
|
||||
{
|
||||
zval* array = NULL;
|
||||
HashTable* hash = NULL;
|
||||
zval** hashData = NULL; /* currently processed item of input hash */
|
||||
zval* hashData = NULL; /* currently processed item of input hash */
|
||||
|
||||
char* sortKeyBuf = NULL; /* buffer to store sort keys */
|
||||
uint32_t sortKeyBufSize = DEF_SORT_KEYS_BUF_SIZE; /* buffer size */
|
||||
@ -418,17 +416,15 @@ PHP_FUNCTION( collator_sort_with_sort_keys )
|
||||
utf16_buf = eumalloc( utf16_buf_size );
|
||||
|
||||
/* Iterate through input hash and create a sort key for each value. */
|
||||
zend_hash_internal_pointer_reset( hash );
|
||||
while( zend_hash_get_current_data( hash, (void**) &hashData ) == SUCCESS )
|
||||
{
|
||||
ZEND_HASH_FOREACH_VAL(hash, hashData) {
|
||||
/* Convert current hash item from UTF-8 to UTF-16LE and save the result to utf16_buf. */
|
||||
|
||||
utf16_len = utf16_buf_size;
|
||||
|
||||
/* Process string values only. */
|
||||
if( Z_TYPE_PP( hashData ) == IS_STRING )
|
||||
if( Z_TYPE_P( hashData ) == IS_STRING )
|
||||
{
|
||||
intl_convert_utf8_to_utf16( &utf16_buf, &utf16_len, Z_STRVAL_PP( hashData ), Z_STRLEN_PP( hashData ), COLLATOR_ERROR_CODE_P( co ) );
|
||||
intl_convert_utf8_to_utf16( &utf16_buf, &utf16_len, Z_STRVAL_P( hashData ), Z_STRLEN_P( hashData ), COLLATOR_ERROR_CODE_P( co ) );
|
||||
|
||||
if( U_FAILURE( COLLATOR_ERROR_CODE( co ) ) )
|
||||
{
|
||||
@ -493,8 +489,7 @@ PHP_FUNCTION( collator_sort_with_sort_keys )
|
||||
sortKeyBufOffset += sortKeyLen;
|
||||
++sortKeyCount;
|
||||
|
||||
zend_hash_move_forward( hash );
|
||||
}
|
||||
} ZEND_HASH_FOREACH_END();
|
||||
|
||||
/* update ptrs to point to valid keys. */
|
||||
for( j = 0; j < sortKeyCount; j++ )
|
||||
@ -503,21 +498,16 @@ PHP_FUNCTION( collator_sort_with_sort_keys )
|
||||
/* sort it */
|
||||
zend_qsort( sortKeyIndxBuf, sortKeyCount, sortKeyIndxSize, collator_cmp_sort_keys TSRMLS_CC );
|
||||
|
||||
zval_dtor( array );
|
||||
/* for resulting hash we'll assign new hash keys rather then reordering */
|
||||
ALLOC_HASHTABLE( sortedHash );
|
||||
zend_hash_init( sortedHash, 0, NULL, ZVAL_PTR_DTOR, 0 );
|
||||
array_init(array);
|
||||
|
||||
for( j = 0; j < sortKeyCount; j++ )
|
||||
{
|
||||
zval_add_ref( sortKeyIndxBuf[j].zstr );
|
||||
zend_hash_next_index_insert( sortedHash, sortKeyIndxBuf[j].zstr, sizeof(zval **), NULL );
|
||||
Z_TRY_ADDREF_P( sortKeyIndxBuf[j].zstr );
|
||||
zend_hash_next_index_insert( Z_ARRVAL_P(array), sortKeyIndxBuf[j].zstr);
|
||||
}
|
||||
|
||||
/* Save sorted hash into return variable. */
|
||||
zval_dtor( array );
|
||||
(array)->value.ht = sortedHash;
|
||||
(array)->type = IS_ARRAY;
|
||||
|
||||
if( utf16_buf )
|
||||
efree( utf16_buf );
|
||||
|
||||
@ -608,7 +598,9 @@ PHP_FUNCTION( collator_get_sort_key )
|
||||
if(!key_len) {
|
||||
RETURN_FALSE;
|
||||
}
|
||||
RETURN_STRINGL((char *)key, key_len - 1, 0);
|
||||
RETVAL_STRINGL((char *)key, key_len - 1);
|
||||
//????
|
||||
efree(key);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
|
@ -110,7 +110,7 @@ U_CFUNC int intl_datetime_decompose(zval *z, double *millis, TimeZone **tz,
|
||||
intl_error *err, const char *func TSRMLS_DC)
|
||||
{
|
||||
zval retval;
|
||||
zval *zfuncname;
|
||||
zval zfuncname;
|
||||
char *message;
|
||||
|
||||
if (err && U_FAILURE(err->code)) {
|
||||
@ -125,10 +125,8 @@ U_CFUNC int intl_datetime_decompose(zval *z, double *millis, TimeZone **tz,
|
||||
}
|
||||
|
||||
if (millis) {
|
||||
INIT_ZVAL(retval);
|
||||
MAKE_STD_ZVAL(zfuncname);
|
||||
ZVAL_STRING(zfuncname, "getTimestamp", 1);
|
||||
if (call_user_function(NULL, &(z), zfuncname, &retval, 0, NULL TSRMLS_CC)
|
||||
ZVAL_STRING(&zfuncname, "getTimestamp");
|
||||
if (call_user_function(NULL, z, &zfuncname, &retval, 0, NULL TSRMLS_CC)
|
||||
!= SUCCESS || Z_TYPE(retval) != IS_LONG) {
|
||||
spprintf(&message, 0, "%s: error calling ::getTimeStamp() on the "
|
||||
"object", func);
|
||||
@ -145,7 +143,7 @@ U_CFUNC int intl_datetime_decompose(zval *z, double *millis, TimeZone **tz,
|
||||
|
||||
if (tz) {
|
||||
php_date_obj *datetime;
|
||||
datetime = (php_date_obj*)zend_object_store_get_object(z TSRMLS_CC);
|
||||
datetime = Z_PHPDATE_P(z);
|
||||
if (!datetime->time) {
|
||||
spprintf(&message, 0, "%s: the DateTime object is not properly "
|
||||
"initialized", func);
|
||||
@ -210,8 +208,7 @@ U_CFUNC double intl_zval_to_millis(zval *z, intl_error *err, const char *func TS
|
||||
if (instanceof_function(Z_OBJCE_P(z), php_date_get_date_ce() TSRMLS_CC)) {
|
||||
intl_datetime_decompose(z, &rv, NULL, err, func TSRMLS_CC);
|
||||
} else if (instanceof_function(Z_OBJCE_P(z), Calendar_ce_ptr TSRMLS_CC)) {
|
||||
Calendar_object *co = (Calendar_object *)
|
||||
zend_object_store_get_object(z TSRMLS_CC );
|
||||
Calendar_object *co = Z_INTL_CALENDAR_P(z);
|
||||
if (co->ucal == NULL) {
|
||||
spprintf(&message, 0, "%s: IntlCalendar object is not properly "
|
||||
"constructed", func);
|
||||
|
@ -37,14 +37,14 @@ void zoi_with_current_dtor(zend_object_iterator *iter TSRMLS_DC)
|
||||
{
|
||||
zoi_with_current *zoiwc = (zoi_with_current*)iter;
|
||||
|
||||
if (zoiwc->wrapping_obj) {
|
||||
if (!Z_ISUNDEF(zoiwc->wrapping_obj)) {
|
||||
/* we have to copy the pointer because zoiwc->wrapping_obj may be
|
||||
* changed midway the execution of zval_ptr_dtor() */
|
||||
zval *zwo = zoiwc->wrapping_obj;
|
||||
zval *zwo = &zoiwc->wrapping_obj;
|
||||
|
||||
/* object is still here, we can rely on it to call this again and
|
||||
* destroy this object */
|
||||
zval_ptr_dtor(&zwo);
|
||||
zval_ptr_dtor(zwo);
|
||||
} else {
|
||||
/* Object not here anymore (we've been called by the object free handler)
|
||||
* Note that the iterator wrapper objects (that also depend on this
|
||||
@ -60,20 +60,20 @@ void zoi_with_current_dtor(zend_object_iterator *iter TSRMLS_DC)
|
||||
|
||||
U_CFUNC int zoi_with_current_valid(zend_object_iterator *iter TSRMLS_DC)
|
||||
{
|
||||
return ((zoi_with_current*)iter)->current != NULL ? SUCCESS : FAILURE;
|
||||
return Z_ISUNDEF(((zoi_with_current*)iter)->current)? FAILURE : SUCCESS;
|
||||
}
|
||||
|
||||
U_CFUNC void zoi_with_current_get_current_data(zend_object_iterator *iter, zval ***data TSRMLS_DC)
|
||||
U_CFUNC zval *zoi_with_current_get_current_data(zend_object_iterator *iter TSRMLS_DC)
|
||||
{
|
||||
*data = &((zoi_with_current*)iter)->current;
|
||||
return &((zoi_with_current*)iter)->current;
|
||||
}
|
||||
|
||||
U_CFUNC void zoi_with_current_invalidate_current(zend_object_iterator *iter TSRMLS_DC)
|
||||
{
|
||||
zoi_with_current *zoi_iter = (zoi_with_current*)iter;
|
||||
if (zoi_iter->current) {
|
||||
if (!Z_ISUNDEF(zoi_iter->current)) {
|
||||
zval_ptr_dtor(&zoi_iter->current);
|
||||
zoi_iter->current = NULL; //valid would return FAILURE now
|
||||
ZVAL_UNDEF(&zoi_iter->current); //valid would return FAILURE now
|
||||
}
|
||||
}
|
||||
|
||||
@ -84,11 +84,11 @@ static void string_enum_current_move_forward(zend_object_iterator *iter TSRMLS_D
|
||||
|
||||
iter->funcs->invalidate_current(iter TSRMLS_CC);
|
||||
|
||||
object = zoi_iter->wrapping_obj;
|
||||
object = &zoi_iter->wrapping_obj;
|
||||
INTLITERATOR_METHOD_FETCH_OBJECT_NO_CHECK;
|
||||
|
||||
int32_t result_length;
|
||||
const char *result = ((StringEnumeration*)iter->data)->next(
|
||||
const char *result = ((StringEnumeration*)Z_PTR(iter->data))->next(
|
||||
&result_length, INTLITERATOR_ERROR_CODE(ii));
|
||||
|
||||
intl_error_set_code(NULL, INTLITERATOR_ERROR_CODE(ii) TSRMLS_CC);
|
||||
@ -96,8 +96,7 @@ static void string_enum_current_move_forward(zend_object_iterator *iter TSRMLS_D
|
||||
intl_errors_set_custom_msg(INTL_DATA_ERROR_P(ii),
|
||||
"Error fetching next iteration element", 0 TSRMLS_CC);
|
||||
} else if (result) {
|
||||
MAKE_STD_ZVAL(zoi_iter->current);
|
||||
ZVAL_STRINGL(zoi_iter->current, result, result_length, 1);
|
||||
ZVAL_STRINGL(&zoi_iter->current, result, result_length);
|
||||
} //else we've reached the end of the enum, nothing more is required
|
||||
}
|
||||
|
||||
@ -106,14 +105,14 @@ static void string_enum_rewind(zend_object_iterator *iter TSRMLS_DC)
|
||||
zoi_with_current *zoi_iter = (zoi_with_current*)iter;
|
||||
INTLITERATOR_METHOD_INIT_VARS;
|
||||
|
||||
if (zoi_iter->current) {
|
||||
if (!Z_ISUNDEF(zoi_iter->current)) {
|
||||
iter->funcs->invalidate_current(iter TSRMLS_CC);
|
||||
}
|
||||
|
||||
object = zoi_iter->wrapping_obj;
|
||||
object = &zoi_iter->wrapping_obj;
|
||||
INTLITERATOR_METHOD_FETCH_OBJECT_NO_CHECK;
|
||||
|
||||
((StringEnumeration*)iter->data)->reset(INTLITERATOR_ERROR_CODE(ii));
|
||||
((StringEnumeration*)Z_PTR(iter->data))->reset(INTLITERATOR_ERROR_CODE(ii));
|
||||
|
||||
intl_error_set_code(NULL, INTLITERATOR_ERROR_CODE(ii) TSRMLS_CC);
|
||||
if (U_FAILURE(INTLITERATOR_ERROR_CODE(ii))) {
|
||||
@ -126,7 +125,7 @@ static void string_enum_rewind(zend_object_iterator *iter TSRMLS_DC)
|
||||
|
||||
static void string_enum_destroy_it(zend_object_iterator *iter TSRMLS_DC)
|
||||
{
|
||||
delete (StringEnumeration*)iter->data;
|
||||
delete (StringEnumeration*)Z_PTR(iter->data);
|
||||
}
|
||||
|
||||
static zend_object_iterator_funcs string_enum_object_iterator_funcs = {
|
||||
@ -143,23 +142,24 @@ U_CFUNC void IntlIterator_from_StringEnumeration(StringEnumeration *se, zval *ob
|
||||
{
|
||||
IntlIterator_object *ii;
|
||||
object_init_ex(object, IntlIterator_ce_ptr);
|
||||
ii = (IntlIterator_object*)zend_object_store_get_object(object TSRMLS_CC);
|
||||
ii = (IntlIterator_object*)Z_OBJ_P(object);
|
||||
ii->iterator = (zend_object_iterator*)emalloc(sizeof(zoi_with_current));
|
||||
ii->iterator->data = (void*)se;
|
||||
zend_iterator_init(ii->iterator TSRMLS_CC);
|
||||
ZVAL_PTR(&ii->iterator->data, se);
|
||||
ii->iterator->funcs = &string_enum_object_iterator_funcs;
|
||||
ii->iterator->index = 0;
|
||||
((zoi_with_current*)ii->iterator)->destroy_it = string_enum_destroy_it;
|
||||
((zoi_with_current*)ii->iterator)->wrapping_obj = object;
|
||||
((zoi_with_current*)ii->iterator)->current = NULL;
|
||||
ZVAL_COPY_VALUE(&((zoi_with_current*)ii->iterator)->wrapping_obj, object);
|
||||
ZVAL_UNDEF(&((zoi_with_current*)ii->iterator)->current);
|
||||
}
|
||||
|
||||
static void IntlIterator_objects_free(zend_object *object TSRMLS_DC)
|
||||
{
|
||||
IntlIterator_object *ii = (IntlIterator_object*) object;
|
||||
IntlIterator_object *ii = php_intl_iterator_fetch_object(object);
|
||||
|
||||
if (ii->iterator) {
|
||||
zval **wrapping_objp = &((zoi_with_current*)ii->iterator)->wrapping_obj;
|
||||
*wrapping_objp = NULL;
|
||||
zval *wrapping_objp = &((zoi_with_current*)ii->iterator)->wrapping_obj;
|
||||
ZVAL_UNDEF(wrapping_objp);
|
||||
ii->iterator->funcs->dtor(ii->iterator TSRMLS_CC);
|
||||
}
|
||||
intl_error_reset(INTLITERATOR_ERROR_P(ii) TSRMLS_CC);
|
||||
@ -178,8 +178,7 @@ static zend_object_iterator *IntlIterator_get_iterator(
|
||||
return NULL;
|
||||
}
|
||||
|
||||
IntlIterator_object *ii = (IntlIterator_object*)
|
||||
zend_object_store_get_object(object TSRMLS_CC);
|
||||
IntlIterator_object *ii = Z_INTL_ITERATOR_P(object);
|
||||
|
||||
if (ii->iterator == NULL) {
|
||||
zend_throw_exception(NULL,
|
||||
@ -187,42 +186,31 @@ static zend_object_iterator *IntlIterator_get_iterator(
|
||||
return NULL;
|
||||
}
|
||||
|
||||
zval_add_ref(&object);
|
||||
zval_add_ref(object);
|
||||
|
||||
return ii->iterator;
|
||||
}
|
||||
|
||||
static zend_object_value IntlIterator_object_create(zend_class_entry *ce TSRMLS_DC)
|
||||
static zend_object *IntlIterator_object_create(zend_class_entry *ce TSRMLS_DC)
|
||||
{
|
||||
zend_object_value retval;
|
||||
IntlIterator_object *intern;
|
||||
|
||||
intern = (IntlIterator_object*)ecalloc(1, sizeof(IntlIterator_object));
|
||||
intern = (IntlIterator_object*)ecalloc(1, sizeof(IntlIterator_object) + sizeof(zval) * (ce->default_properties_count - 1));
|
||||
|
||||
zend_object_std_init(&intern->zo, ce TSRMLS_CC);
|
||||
#if PHP_VERSION_ID < 50399
|
||||
zend_hash_copy(intern->zo.properties, &(ce->default_properties),
|
||||
(copy_ctor_func_t) zval_add_ref, NULL, sizeof(zval*));
|
||||
#else
|
||||
object_properties_init((zend_object*) intern, ce);
|
||||
#endif
|
||||
intl_error_init(INTLITERATOR_ERROR_P(intern) TSRMLS_CC);
|
||||
|
||||
intern->iterator = NULL;
|
||||
|
||||
retval.handle = zend_objects_store_put(
|
||||
intern,
|
||||
(zend_objects_store_dtor_t)zend_objects_destroy_object,
|
||||
(zend_objects_free_object_storage_t)IntlIterator_objects_free,
|
||||
NULL TSRMLS_CC);
|
||||
intern->zo.handlers = &IntlIterator_handlers;
|
||||
|
||||
retval.handlers = &IntlIterator_handlers;
|
||||
|
||||
return retval;
|
||||
return &intern->zo;
|
||||
}
|
||||
|
||||
static PHP_METHOD(IntlIterator, current)
|
||||
{
|
||||
zval **data;
|
||||
zval *data;
|
||||
INTLITERATOR_METHOD_INIT_VARS;
|
||||
|
||||
if (zend_parse_parameters_none() == FAILURE) {
|
||||
@ -232,9 +220,9 @@ static PHP_METHOD(IntlIterator, current)
|
||||
}
|
||||
|
||||
INTLITERATOR_METHOD_FETCH_OBJECT;
|
||||
ii->iterator->funcs->get_current_data(ii->iterator, &data TSRMLS_CC);
|
||||
if (data && *data) {
|
||||
RETURN_ZVAL(*data, 1, 0);
|
||||
data = ii->iterator->funcs->get_current_data(ii->iterator TSRMLS_CC);
|
||||
if (data) {
|
||||
RETURN_ZVAL(data, 1, 0);
|
||||
}
|
||||
}
|
||||
|
||||
@ -337,6 +325,9 @@ U_CFUNC void intl_register_IntlIterator_class(TSRMLS_D)
|
||||
|
||||
memcpy(&IntlIterator_handlers, zend_get_std_object_handlers(),
|
||||
sizeof IntlIterator_handlers);
|
||||
IntlIterator_handlers.offset = XtOffsetOf(IntlIterator_object, zo);
|
||||
IntlIterator_handlers.clone_obj = NULL;
|
||||
IntlIterator_handlers.dtor_obj = zend_objects_destroy_object;
|
||||
IntlIterator_handlers.free_obj = IntlIterator_objects_free;
|
||||
|
||||
}
|
||||
|
@ -38,7 +38,7 @@ extern "C" {
|
||||
#define INTLITERATOR_ERROR_CODE_P(ii) &(INTL_ERROR_CODE(INTLITERATOR_ERROR(ii)))
|
||||
|
||||
#define INTLITERATOR_METHOD_INIT_VARS INTL_METHOD_INIT_VARS(IntlIterator, ii)
|
||||
#define INTLITERATOR_METHOD_FETCH_OBJECT_NO_CHECK INTL_METHOD_FETCH_OBJECT(IntlIterator, ii)
|
||||
#define INTLITERATOR_METHOD_FETCH_OBJECT_NO_CHECK INTL_METHOD_FETCH_OBJECT(INTL_ITERATOR, ii)
|
||||
#define INTLITERATOR_METHOD_FETCH_OBJECT\
|
||||
object = getThis(); \
|
||||
INTLITERATOR_METHOD_FETCH_OBJECT_NO_CHECK; \
|
||||
@ -48,15 +48,21 @@ extern "C" {
|
||||
}
|
||||
|
||||
typedef struct {
|
||||
zend_object zo;
|
||||
intl_error err;
|
||||
zend_object_iterator *iterator;
|
||||
zend_object zo;
|
||||
} IntlIterator_object;
|
||||
|
||||
|
||||
static inline IntlIterator_object *php_intl_iterator_fetch_object(zend_object *obj) {
|
||||
return (IntlIterator_object *)((char*)(obj) - XtOffsetOf(IntlIterator_object, zo));
|
||||
}
|
||||
#define Z_INTL_ITERATOR_P(zv) php_intl_iterator_fetch_object(Z_OBJ_P(zv))
|
||||
|
||||
typedef struct {
|
||||
zend_object_iterator zoi;
|
||||
zval *current;
|
||||
zval *wrapping_obj;
|
||||
zval current;
|
||||
zval wrapping_obj;
|
||||
void (*destroy_it)(zend_object_iterator *iterator TSRMLS_DC);
|
||||
} zoi_with_current;
|
||||
|
||||
@ -65,7 +71,7 @@ extern zend_object_handlers IntlIterator_handlers;
|
||||
|
||||
U_CFUNC void zoi_with_current_dtor(zend_object_iterator *iter TSRMLS_DC);
|
||||
U_CFUNC int zoi_with_current_valid(zend_object_iterator *iter TSRMLS_DC);
|
||||
U_CFUNC void zoi_with_current_get_current_data(zend_object_iterator *iter, zval ***data TSRMLS_DC);
|
||||
U_CFUNC zval *zoi_with_current_get_current_data(zend_object_iterator *iter TSRMLS_DC);
|
||||
U_CFUNC void zoi_with_current_invalidate_current(zend_object_iterator *iter TSRMLS_DC);
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
@ -37,8 +37,7 @@ PHP_FUNCTION( intl_get_error_code )
|
||||
*/
|
||||
PHP_FUNCTION( intl_get_error_message )
|
||||
{
|
||||
char* message = intl_error_get_message( NULL TSRMLS_CC );
|
||||
RETURN_STRING( message, FALSE );
|
||||
RETURN_STR(intl_error_get_message( NULL TSRMLS_CC ));
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
@ -63,6 +62,7 @@ PHP_FUNCTION( intl_is_failure )
|
||||
|
||||
RETURN_BOOL( U_FAILURE( err_code ) );
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto string intl_error_name()
|
||||
* Return a string for a given error code.
|
||||
@ -82,7 +82,7 @@ PHP_FUNCTION( intl_error_name )
|
||||
RETURN_FALSE;
|
||||
}
|
||||
|
||||
RETURN_STRING( (char*)u_errorName( err_code ), 1 );
|
||||
RETURN_STRING( (char*)u_errorName( err_code ) );
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
|
@ -24,7 +24,6 @@
|
||||
#include "../intl_error.h"
|
||||
|
||||
typedef struct _php_converter_object {
|
||||
zend_object obj;
|
||||
#ifdef ZTS
|
||||
void ***tsrm_ls;
|
||||
#endif
|
||||
@ -32,12 +31,19 @@ typedef struct _php_converter_object {
|
||||
zend_fcall_info to_cb, from_cb;
|
||||
zend_fcall_info_cache to_cache, from_cache;
|
||||
intl_error error;
|
||||
zend_object obj;
|
||||
} php_converter_object;
|
||||
|
||||
|
||||
static inline php_converter_object *php_converter_fetch_object(zend_object *obj) {
|
||||
return (php_converter_object *)((char*)(obj) - XtOffsetOf(php_converter_object, obj));
|
||||
}
|
||||
#define Z_INTL_CONVERTER_P(zv) php_converter_fetch_object(Z_OBJ_P(zv))
|
||||
|
||||
static zend_class_entry *php_converter_ce;
|
||||
static zend_object_handlers php_converter_object_handlers;
|
||||
|
||||
#define CONV_GET(pzv) ((php_converter_object*)zend_objects_get_address((pzv) TSRMLS_CC))
|
||||
#define CONV_GET(pzv) (Z_INTL_CONVERTER_P((pzv)))
|
||||
#define THROW_UFAILURE(obj, fname, error) php_converter_throw_failure(obj, error TSRMLS_CC, \
|
||||
fname "() returned error %ld: %s", (long)error, u_errorName(error))
|
||||
|
||||
@ -75,7 +81,7 @@ static void php_converter_default_callback(zval *return_value, zval *zobj, long
|
||||
chars[1] = 0;
|
||||
chars_len = 1;
|
||||
ZVAL_LONG(error, U_INVALID_STATE_ERROR);
|
||||
RETVAL_STRINGL(chars, chars_len, 1);
|
||||
RETVAL_STRINGL(chars, chars_len);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -94,7 +100,7 @@ static void php_converter_default_callback(zval *return_value, zval *zobj, long
|
||||
chars_len = 1;
|
||||
ZVAL_LONG(error, uerror);
|
||||
}
|
||||
RETVAL_STRINGL(chars, chars_len, 1);
|
||||
RETVAL_STRINGL(chars, chars_len);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -199,14 +205,11 @@ static void php_converter_append_toUnicode_target(zval *val, UConverterToUnicode
|
||||
case IS_ARRAY:
|
||||
{
|
||||
HashTable *ht = Z_ARRVAL_P(val);
|
||||
HashPosition pos;
|
||||
zval **tmpzval;
|
||||
zval *tmpzval;
|
||||
|
||||
for(zend_hash_internal_pointer_reset_ex(ht, &pos);
|
||||
zend_hash_get_current_data_ex(ht, (void**)&tmpzval, &pos) == SUCCESS;
|
||||
zend_hash_move_forward_ex(ht, &pos)) {
|
||||
php_converter_append_toUnicode_target(*tmpzval, args, objval TSRMLS_CC);
|
||||
}
|
||||
ZEND_HASH_FOREACH_VAL(ht, tmpzval) {
|
||||
php_converter_append_toUnicode_target(tmpzval, args, objval TSRMLS_CC);
|
||||
} ZEND_HASH_FOREACH_END();
|
||||
return;
|
||||
}
|
||||
default:
|
||||
@ -223,48 +226,37 @@ static void php_converter_to_u_callback(const void *context,
|
||||
UConverterCallbackReason reason,
|
||||
UErrorCode *pErrorCode) {
|
||||
php_converter_object *objval = (php_converter_object*)context;
|
||||
zval *zreason, *zsource, *zcodeunits, *zerror, *retval = NULL;
|
||||
zval **zargs[4];
|
||||
zval retval;
|
||||
zval zargs[4];
|
||||
#ifdef ZTS
|
||||
TSRMLS_D = objval->tsrm_ls;
|
||||
#endif
|
||||
|
||||
MAKE_STD_ZVAL(zreason);
|
||||
ZVAL_LONG(zreason, reason);
|
||||
zargs[0] = &zreason;
|
||||
|
||||
MAKE_STD_ZVAL(zsource);
|
||||
ZVAL_STRINGL(zsource, args->source, args->sourceLimit - args->source, 1);
|
||||
zargs[1] = &zsource;
|
||||
|
||||
MAKE_STD_ZVAL(zcodeunits);
|
||||
ZVAL_STRINGL(zcodeunits, codeUnits, length, 1);
|
||||
zargs[2] = &zcodeunits;
|
||||
|
||||
MAKE_STD_ZVAL(zerror);
|
||||
ZVAL_LONG(zerror, *pErrorCode);
|
||||
zargs[3] = &zerror;
|
||||
ZVAL_LONG(&zargs[0], reason);
|
||||
ZVAL_STRINGL(&zargs[1], args->source, args->sourceLimit - args->source);
|
||||
ZVAL_STRINGL(&zargs[2], codeUnits, length);
|
||||
ZVAL_LONG(&zargs[3], *pErrorCode);
|
||||
|
||||
objval->to_cb.param_count = 4;
|
||||
objval->to_cb.params = zargs;
|
||||
objval->to_cb.retval_ptr_ptr = &retval;
|
||||
objval->to_cb.params = zargs;
|
||||
objval->to_cb.retval = &retval;
|
||||
objval->to_cb.no_separation = 0;
|
||||
if (zend_call_function(&(objval->to_cb), &(objval->to_cache) TSRMLS_CC) == FAILURE) {
|
||||
/* Unlikely */
|
||||
php_converter_throw_failure(objval, U_INTERNAL_PROGRAM_ERROR TSRMLS_CC, "Unexpected failure calling toUCallback()");
|
||||
} else if (retval) {
|
||||
php_converter_append_toUnicode_target(retval, args, objval TSRMLS_CC);
|
||||
} else if (!Z_ISUNDEF(retval)) {
|
||||
php_converter_append_toUnicode_target(&retval, args, objval TSRMLS_CC);
|
||||
zval_ptr_dtor(&retval);
|
||||
}
|
||||
|
||||
if (Z_TYPE_P(zerror) == IS_LONG) {
|
||||
*pErrorCode = Z_LVAL_P(zerror);
|
||||
if (Z_TYPE(zargs[3]) == IS_LONG) {
|
||||
*pErrorCode = Z_LVAL(zargs[3]);
|
||||
}
|
||||
|
||||
zval_ptr_dtor(&zreason);
|
||||
zval_ptr_dtor(&zsource);
|
||||
zval_ptr_dtor(&zcodeunits);
|
||||
zval_ptr_dtor(&zerror);
|
||||
zval_ptr_dtor(&zargs[0]);
|
||||
zval_ptr_dtor(&zargs[1]);
|
||||
zval_ptr_dtor(&zargs[2]);
|
||||
zval_ptr_dtor(&zargs[3]);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
@ -291,13 +283,10 @@ static void php_converter_append_fromUnicode_target(zval *val, UConverterFromUni
|
||||
case IS_ARRAY:
|
||||
{
|
||||
HashTable *ht = Z_ARRVAL_P(val);
|
||||
HashPosition pos;
|
||||
zval **tmpzval;
|
||||
for(zend_hash_internal_pointer_reset_ex(ht, &pos);
|
||||
zend_hash_get_current_data_ex(ht, (void**)&tmpzval, &pos) == SUCCESS;
|
||||
zend_hash_move_forward_ex(ht, &pos)) {
|
||||
php_converter_append_fromUnicode_target(*tmpzval, args, objval TSRMLS_CC);
|
||||
}
|
||||
zval *tmpzval;
|
||||
ZEND_HASH_FOREACH_VAL(ht, tmpzval) {
|
||||
php_converter_append_fromUnicode_target(tmpzval, args, objval TSRMLS_CC);
|
||||
} ZEND_HASH_FOREACH_END();
|
||||
return;
|
||||
}
|
||||
default:
|
||||
@ -313,55 +302,44 @@ static void php_converter_from_u_callback(const void *context,
|
||||
UConverterCallbackReason reason,
|
||||
UErrorCode *pErrorCode) {
|
||||
php_converter_object *objval = (php_converter_object*)context;
|
||||
zval *zreason, *zsource, *zcodepoint, *zerror, *retval = NULL;
|
||||
zval **zargs[4];
|
||||
zval retval;
|
||||
zval zargs[4];
|
||||
int i;
|
||||
#ifdef ZTS
|
||||
TSRMLS_D = objval->tsrm_ls;
|
||||
#endif
|
||||
|
||||
MAKE_STD_ZVAL(zreason);
|
||||
ZVAL_LONG(zreason, reason);
|
||||
zargs[0] = &zreason;
|
||||
|
||||
MAKE_STD_ZVAL(zsource);
|
||||
array_init(zsource);
|
||||
ZVAL_LONG(&zargs[0], reason);
|
||||
array_init(&zargs[1]);
|
||||
i = 0;
|
||||
while (i < length) {
|
||||
UChar32 c;
|
||||
U16_NEXT(codeUnits, i, length, c);
|
||||
add_next_index_long(zsource, c);
|
||||
add_next_index_long(&zargs[1], c);
|
||||
}
|
||||
zargs[1] = &zsource;
|
||||
ZVAL_LONG(&zargs[2], codePoint);
|
||||
ZVAL_LONG(&zargs[3], *pErrorCode);
|
||||
|
||||
MAKE_STD_ZVAL(zcodepoint);
|
||||
ZVAL_LONG(zcodepoint, codePoint);
|
||||
zargs[2] = &zcodepoint;
|
||||
|
||||
MAKE_STD_ZVAL(zerror);
|
||||
ZVAL_LONG(zerror, *pErrorCode);
|
||||
zargs[3] = &zerror;
|
||||
|
||||
objval->from_cb.param_count = 4;
|
||||
objval->from_cb.params = zargs;
|
||||
objval->from_cb.retval_ptr_ptr = &retval;
|
||||
objval->from_cb.param_count = 4;
|
||||
objval->from_cb.params = zargs;
|
||||
objval->from_cb.retval = &retval;
|
||||
objval->from_cb.no_separation = 0;
|
||||
if (zend_call_function(&(objval->from_cb), &(objval->from_cache) TSRMLS_CC) == FAILURE) {
|
||||
/* Unlikely */
|
||||
php_converter_throw_failure(objval, U_INTERNAL_PROGRAM_ERROR TSRMLS_CC, "Unexpected failure calling fromUCallback()");
|
||||
} else if (retval) {
|
||||
php_converter_append_fromUnicode_target(retval, args, objval TSRMLS_CC);
|
||||
} else if (!Z_ISUNDEF(retval)) {
|
||||
php_converter_append_fromUnicode_target(&retval, args, objval TSRMLS_CC);
|
||||
zval_ptr_dtor(&retval);
|
||||
}
|
||||
|
||||
if (Z_TYPE_P(zerror) == IS_LONG) {
|
||||
*pErrorCode = Z_LVAL_P(zerror);
|
||||
if (Z_TYPE(zargs[3]) == IS_LONG) {
|
||||
*pErrorCode = Z_LVAL(zargs[3]);
|
||||
}
|
||||
|
||||
zval_ptr_dtor(&zreason);
|
||||
zval_ptr_dtor(&zsource);
|
||||
zval_ptr_dtor(&zcodepoint);
|
||||
zval_ptr_dtor(&zerror);
|
||||
zval_ptr_dtor(&zargs[0]);
|
||||
zval_ptr_dtor(&zargs[1]);
|
||||
zval_ptr_dtor(&zargs[2]);
|
||||
zval_ptr_dtor(&zargs[3]);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
@ -489,7 +467,7 @@ static void php_converter_do_get_encoding(php_converter_object *objval, UConvert
|
||||
RETURN_FALSE;
|
||||
}
|
||||
|
||||
RETURN_STRING(name, 1);
|
||||
RETURN_STRING(name);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
@ -674,7 +652,7 @@ static PHP_METHOD(UConverter, getSubstChars) {
|
||||
RETURN_FALSE;
|
||||
}
|
||||
|
||||
RETURN_STRINGL(chars, chars_len, 1);
|
||||
RETURN_STRINGL(chars, chars_len);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
@ -742,7 +720,7 @@ static zend_bool php_converter_do_convert(UConverter *dest_cnv, char **pdest, in
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto string UConverter::reasonText(long reason) */
|
||||
#define UCNV_REASON_CASE(v) case (UCNV_ ## v) : RETURN_STRINGL( "REASON_" #v , sizeof( "REASON_" #v ) - 1, 1);
|
||||
#define UCNV_REASON_CASE(v) case (UCNV_ ## v) : RETURN_STRINGL( "REASON_" #v , sizeof( "REASON_" #v ) - 1);
|
||||
ZEND_BEGIN_ARG_INFO_EX(php_converter_reasontext_arginfo, 0, ZEND_RETURN_VALUE, 0)
|
||||
ZEND_ARG_INFO(0, reason)
|
||||
ZEND_END_ARG_INFO();
|
||||
@ -795,7 +773,9 @@ static PHP_METHOD(UConverter, convert) {
|
||||
reverse ? objval->dest : objval->src,
|
||||
str, str_len,
|
||||
objval TSRMLS_CC)) {
|
||||
RETURN_STRINGL(dest, dest_len, 0);
|
||||
RETURN_STRINGL(dest, dest_len);
|
||||
//???
|
||||
efree(dest);
|
||||
} else {
|
||||
RETURN_FALSE;
|
||||
}
|
||||
@ -831,25 +811,27 @@ static PHP_METHOD(UConverter, transcode) {
|
||||
UErrorCode error = U_ZERO_ERROR;
|
||||
|
||||
if (options && zend_hash_num_elements(Z_ARRVAL_P(options))) {
|
||||
zval **tmpzval;
|
||||
zval *tmpzval;
|
||||
|
||||
if (U_SUCCESS(error) &&
|
||||
zend_hash_find(Z_ARRVAL_P(options), "from_subst", sizeof("from_subst"), (void**)&tmpzval) == SUCCESS &&
|
||||
Z_TYPE_PP(tmpzval) == IS_STRING) {
|
||||
(tmpzval = zend_hash_str_find(Z_ARRVAL_P(options), "from_subst", sizeof("from_subst") - 1)) != NULL &&
|
||||
Z_TYPE_P(tmpzval) == IS_STRING) {
|
||||
error = U_ZERO_ERROR;
|
||||
ucnv_setSubstChars(src_cnv, Z_STRVAL_PP(tmpzval), Z_STRLEN_PP(tmpzval) & 0x7F, &error);
|
||||
ucnv_setSubstChars(src_cnv, Z_STRVAL_P(tmpzval), Z_STRLEN_P(tmpzval) & 0x7F, &error);
|
||||
}
|
||||
if (U_SUCCESS(error) &&
|
||||
zend_hash_find(Z_ARRVAL_P(options), "to_subst", sizeof("to_subst"), (void**)&tmpzval) == SUCCESS &&
|
||||
Z_TYPE_PP(tmpzval) == IS_STRING) {
|
||||
(tmpzval = zend_hash_str_find(Z_ARRVAL_P(options), "to_subst", sizeof("to_subst") - 1)) != NULL &&
|
||||
Z_TYPE_P(tmpzval) == IS_STRING) {
|
||||
error = U_ZERO_ERROR;
|
||||
ucnv_setSubstChars(dest_cnv, Z_STRVAL_PP(tmpzval), Z_STRLEN_PP(tmpzval) & 0x7F, &error);
|
||||
ucnv_setSubstChars(dest_cnv, Z_STRVAL_P(tmpzval), Z_STRLEN_P(tmpzval) & 0x7F, &error);
|
||||
}
|
||||
}
|
||||
|
||||
if (U_SUCCESS(error) &&
|
||||
php_converter_do_convert(dest_cnv, &out, &out_len, src_cnv, str, str_len, NULL TSRMLS_CC)) {
|
||||
RETVAL_STRINGL(out, out_len, 0);
|
||||
RETVAL_STRINGL(out, out_len);
|
||||
//???
|
||||
efree(out);
|
||||
}
|
||||
|
||||
if (U_FAILURE(error)) {
|
||||
@ -890,7 +872,7 @@ ZEND_BEGIN_ARG_INFO_EX(php_converter_geterrormsg_arginfo, 0, ZEND_RETURN_VALUE,
|
||||
ZEND_END_ARG_INFO();
|
||||
static PHP_METHOD(UConverter, getErrorMessage) {
|
||||
php_converter_object *objval = CONV_GET(getThis());
|
||||
char *message = intl_error_get_message(&(objval->error) TSRMLS_CC);
|
||||
zend_string *message = intl_error_get_message(&(objval->error) TSRMLS_CC);
|
||||
|
||||
if (zend_parse_parameters_none() == FAILURE) {
|
||||
intl_error_set(NULL, U_ILLEGAL_ARGUMENT_ERROR,
|
||||
@ -899,7 +881,7 @@ static PHP_METHOD(UConverter, getErrorMessage) {
|
||||
}
|
||||
|
||||
if (message) {
|
||||
RETURN_STRING(message, 1);
|
||||
RETURN_STR(message);
|
||||
} else {
|
||||
RETURN_NULL();
|
||||
}
|
||||
@ -1033,7 +1015,9 @@ static zend_function_entry php_converter_methods[] = {
|
||||
};
|
||||
|
||||
/* {{{ Converter create/clone/destroy */
|
||||
static void php_converter_free_object(php_converter_object *objval TSRMLS_DC) {
|
||||
static void php_converter_free_object(zend_object *obj TSRMLS_DC) {
|
||||
php_converter_object *objval = php_converter_fetch_object(obj);
|
||||
|
||||
if (objval->src) {
|
||||
ucnv_close(objval->src);
|
||||
}
|
||||
@ -1044,15 +1028,12 @@ static void php_converter_free_object(php_converter_object *objval TSRMLS_DC) {
|
||||
|
||||
intl_error_reset(&(objval->error) TSRMLS_CC);
|
||||
zend_object_std_dtor(&(objval->obj) TSRMLS_CC);
|
||||
|
||||
efree(objval);
|
||||
}
|
||||
|
||||
static zend_object_value php_converter_object_ctor(zend_class_entry *ce, php_converter_object **pobjval TSRMLS_DC) {
|
||||
static zend_object *php_converter_object_ctor(zend_class_entry *ce, php_converter_object **pobjval TSRMLS_DC) {
|
||||
php_converter_object *objval;
|
||||
zend_object_value retval;
|
||||
|
||||
objval = ecalloc(1, sizeof(php_converter_object));
|
||||
objval = ecalloc(1, sizeof(php_converter_object) + sizeof(zval) * (ce->default_properties_count - 1));
|
||||
objval->obj.ce = ce;
|
||||
|
||||
#ifdef ZTS
|
||||
@ -1060,25 +1041,24 @@ static zend_object_value php_converter_object_ctor(zend_class_entry *ce, php_con
|
||||
#endif
|
||||
intl_error_init(&(objval->error) TSRMLS_CC);
|
||||
|
||||
retval.handle = zend_objects_store_put(objval, NULL, (zend_objects_free_object_storage_t)php_converter_free_object, NULL TSRMLS_CC);
|
||||
retval.handlers = &php_converter_object_handlers;
|
||||
objval->obj.handlers = &php_converter_object_handlers;
|
||||
*pobjval = objval;
|
||||
|
||||
return retval;
|
||||
return &objval->obj;
|
||||
}
|
||||
|
||||
static zend_object_value php_converter_create_object(zend_class_entry *ce TSRMLS_DC) {
|
||||
static zend_object *php_converter_create_object(zend_class_entry *ce TSRMLS_DC) {
|
||||
php_converter_object *objval = NULL;
|
||||
zend_object_value retval = php_converter_object_ctor(ce, &objval TSRMLS_CC);
|
||||
zend_object *retval = php_converter_object_ctor(ce, &objval TSRMLS_CC);
|
||||
|
||||
object_properties_init(&(objval->obj), ce);
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
static zend_object_value php_converter_clone_object(zval *object TSRMLS_DC) {
|
||||
php_converter_object *objval, *oldobj = (php_converter_object*)zend_objects_get_address(object TSRMLS_CC);
|
||||
zend_object_value retval = php_converter_object_ctor(Z_OBJCE_P(object), &objval TSRMLS_CC);
|
||||
static zend_object *php_converter_clone_object(zval *object TSRMLS_DC) {
|
||||
php_converter_object *objval, *oldobj = Z_INTL_CONVERTER_P(object);
|
||||
zend_object *retval = php_converter_object_ctor(Z_OBJCE_P(object), &objval TSRMLS_CC);
|
||||
UErrorCode error = U_ZERO_ERROR;
|
||||
|
||||
intl_errors_reset(&oldobj->error TSRMLS_CC);
|
||||
@ -1089,12 +1069,12 @@ static zend_object_value php_converter_clone_object(zval *object TSRMLS_DC) {
|
||||
objval->dest = ucnv_safeClone(oldobj->dest, NULL, NULL, &error);
|
||||
}
|
||||
if (U_FAILURE(error)) {
|
||||
char *err_msg;
|
||||
zend_string *err_msg;
|
||||
THROW_UFAILURE(oldobj, "ucnv_safeClone", error);
|
||||
|
||||
err_msg = intl_error_get_message(&oldobj->error TSRMLS_CC);
|
||||
zend_throw_exception(NULL, err_msg, 0 TSRMLS_CC);
|
||||
efree(err_msg);
|
||||
zend_throw_exception(NULL, err_msg->val, 0 TSRMLS_CC);
|
||||
STR_RELEASE(err_msg);
|
||||
|
||||
return retval;
|
||||
}
|
||||
@ -1103,7 +1083,7 @@ static zend_object_value php_converter_clone_object(zval *object TSRMLS_DC) {
|
||||
php_converter_set_callbacks(objval, objval->src TSRMLS_CC);
|
||||
php_converter_set_callbacks(objval, objval->dest TSRMLS_CC);
|
||||
|
||||
zend_objects_clone_members(&(objval->obj), retval, &(oldobj->obj), Z_OBJ_HANDLE_P(object) TSRMLS_CC);
|
||||
zend_objects_clone_members(&(objval->obj), &(oldobj->obj) TSRMLS_CC);
|
||||
|
||||
/* Newly cloned object deliberately does not inherit error state from original object */
|
||||
|
||||
@ -1123,6 +1103,7 @@ int php_converter_minit(INIT_FUNC_ARGS) {
|
||||
php_converter_ce->create_object = php_converter_create_object;
|
||||
memcpy(&php_converter_object_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers));
|
||||
php_converter_object_handlers.clone_obj = php_converter_clone_object;
|
||||
php_converter_object_handlers.free_obj = php_converter_free_object;
|
||||
|
||||
/* enum UConverterCallbackReason */
|
||||
CONV_REASON_CONST(UNASSIGNED);
|
||||
|
@ -82,7 +82,7 @@ PHP_FUNCTION( datefmt_get_error_code )
|
||||
RETURN_FALSE;
|
||||
}
|
||||
|
||||
dfo = (IntlDateFormatter_object *) zend_object_store_get_object( object TSRMLS_CC );
|
||||
dfo = Z_INTL_DATEFORMATTER_P( object TSRMLS_CC );
|
||||
|
||||
/* Return formatter's last error code. */
|
||||
RETURN_LONG( INTL_DATA_ERROR_CODE(dfo) );
|
||||
@ -96,7 +96,7 @@ PHP_FUNCTION( datefmt_get_error_code )
|
||||
*/
|
||||
PHP_FUNCTION( datefmt_get_error_message )
|
||||
{
|
||||
char* message = NULL;
|
||||
zend_string *message = NULL;
|
||||
DATE_FORMAT_METHOD_INIT_VARS;
|
||||
|
||||
/* Parse parameters. */
|
||||
@ -109,10 +109,10 @@ PHP_FUNCTION( datefmt_get_error_message )
|
||||
RETURN_FALSE;
|
||||
}
|
||||
|
||||
dfo = (IntlDateFormatter_object *) zend_object_store_get_object( object TSRMLS_CC );
|
||||
dfo = Z_INTL_DATEFORMATTER_P( object TSRMLS_CC );
|
||||
|
||||
/* Return last error message. */
|
||||
message = intl_error_get_message( INTL_DATA_ERROR_P(dfo) TSRMLS_CC );
|
||||
RETURN_STRING( message, 0);
|
||||
RETURN_STR( message);
|
||||
}
|
||||
/* }}} */
|
||||
|
@ -189,7 +189,7 @@ PHP_FUNCTION( datefmt_get_locale )
|
||||
|
||||
loc = (char *)udat_getLocaleByType(DATE_FORMAT_OBJECT(dfo), loc_type,&INTL_DATA_ERROR_CODE(dfo));
|
||||
INTL_METHOD_CHECK_STATUS(dfo, "Error getting locale");
|
||||
RETURN_STRING(loc, 1);
|
||||
RETURN_STRING(loc);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
|
@ -44,6 +44,8 @@ static inline DateFormat *fetch_datefmt(IntlDateFormatter_object *dfo) {
|
||||
*/
|
||||
U_CFUNC PHP_FUNCTION(datefmt_get_timezone_id)
|
||||
{
|
||||
char *str;
|
||||
int str_len;
|
||||
DATE_FORMAT_METHOD_INIT_VARS;
|
||||
|
||||
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O",
|
||||
@ -57,11 +59,12 @@ U_CFUNC PHP_FUNCTION(datefmt_get_timezone_id)
|
||||
|
||||
UnicodeString res = UnicodeString();
|
||||
fetch_datefmt(dfo)->getTimeZone().getID(res);
|
||||
intl_charFromString(res, &Z_STRVAL_P(return_value),
|
||||
&Z_STRLEN_P(return_value), &INTL_DATA_ERROR_CODE(dfo));
|
||||
intl_charFromString(res, &str, &str_len, &INTL_DATA_ERROR_CODE(dfo));
|
||||
INTL_METHOD_CHECK_STATUS(dfo, "Could not convert time zone id to UTF-8");
|
||||
|
||||
Z_TYPE_P(return_value) = IS_STRING;
|
||||
RETVAL_STRINGL(str, str_len);
|
||||
//????
|
||||
efree(str);
|
||||
}
|
||||
|
||||
/* {{{ proto IntlTimeZone IntlDateFormatter::getTimeZone()
|
||||
@ -111,13 +114,13 @@ U_CFUNC PHP_FUNCTION(datefmt_set_timezone_id)
|
||||
*/
|
||||
U_CFUNC PHP_FUNCTION(datefmt_set_timezone)
|
||||
{
|
||||
zval **timezone_zv;
|
||||
zval *timezone_zv;
|
||||
TimeZone *timezone;
|
||||
|
||||
DATE_FORMAT_METHOD_INIT_VARS;
|
||||
|
||||
if ( zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(),
|
||||
"OZ", &object, IntlDateFormatter_ce_ptr, &timezone_zv) == FAILURE) {
|
||||
"Oz", &object, IntlDateFormatter_ce_ptr, &timezone_zv) == FAILURE) {
|
||||
intl_error_set(NULL, U_ILLEGAL_ARGUMENT_ERROR, "datefmt_set_timezone: "
|
||||
"unable to parse input params", 0 TSRMLS_CC);
|
||||
RETURN_FALSE;
|
||||
|
@ -35,16 +35,16 @@ static zend_object_handlers IntlDateFormatter_handlers;
|
||||
*/
|
||||
|
||||
/* {{{ IntlDateFormatter_objects_dtor */
|
||||
static void IntlDateFormatter_object_dtor(void *object, zend_object_handle handle TSRMLS_DC )
|
||||
static void IntlDateFormatter_object_dtor(zend_object *object TSRMLS_DC )
|
||||
{
|
||||
zend_objects_destroy_object( object, handle TSRMLS_CC );
|
||||
zend_objects_destroy_object( object TSRMLS_CC );
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ IntlDateFormatter_objects_free */
|
||||
void IntlDateFormatter_object_free( zend_object *object TSRMLS_DC )
|
||||
{
|
||||
IntlDateFormatter_object* dfo = (IntlDateFormatter_object*)object;
|
||||
IntlDateFormatter_object* dfo = php_intl_dateformatter_fetch_object(object);
|
||||
|
||||
zend_object_std_dtor( &dfo->zo TSRMLS_CC );
|
||||
|
||||
@ -53,18 +53,15 @@ void IntlDateFormatter_object_free( zend_object *object TSRMLS_DC )
|
||||
}
|
||||
|
||||
dateformat_data_free( &dfo->datef_data TSRMLS_CC );
|
||||
|
||||
efree( dfo );
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ IntlDateFormatter_object_create */
|
||||
zend_object_value IntlDateFormatter_object_create(zend_class_entry *ce TSRMLS_DC)
|
||||
zend_object *IntlDateFormatter_object_create(zend_class_entry *ce TSRMLS_DC)
|
||||
{
|
||||
zend_object_value retval;
|
||||
IntlDateFormatter_object* intern;
|
||||
|
||||
intern = ecalloc( 1, sizeof(IntlDateFormatter_object) );
|
||||
intern = ecalloc( 1, sizeof(IntlDateFormatter_object) + sizeof(zval) * (ce->default_properties_count - 1) );
|
||||
dateformat_data_init( &intern->datef_data TSRMLS_CC );
|
||||
zend_object_std_init( &intern->zo, ce TSRMLS_CC );
|
||||
object_properties_init(&intern->zo, ce);
|
||||
@ -73,31 +70,25 @@ zend_object_value IntlDateFormatter_object_create(zend_class_entry *ce TSRMLS_DC
|
||||
intern->calendar = -1;
|
||||
intern->requested_locale = NULL;
|
||||
|
||||
retval.handle = zend_objects_store_put(
|
||||
intern,
|
||||
IntlDateFormatter_object_dtor,
|
||||
(zend_objects_free_object_storage_t)IntlDateFormatter_object_free,
|
||||
NULL TSRMLS_CC );
|
||||
|
||||
retval.handlers = &IntlDateFormatter_handlers;
|
||||
intern->zo.handlers = &IntlDateFormatter_handlers;
|
||||
|
||||
return retval;
|
||||
return &intern->zo;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ IntlDateFormatter_object_clone */
|
||||
zend_object_value IntlDateFormatter_object_clone(zval *object TSRMLS_DC)
|
||||
zend_object *IntlDateFormatter_object_clone(zval *object TSRMLS_DC)
|
||||
{
|
||||
zend_object_value new_obj_val;
|
||||
zend_object_handle handle = Z_OBJ_HANDLE_P(object);
|
||||
IntlDateFormatter_object *dfo, *new_dfo;
|
||||
zend_object *new_obj;
|
||||
|
||||
DATE_FORMAT_METHOD_FETCH_OBJECT_NO_CHECK;
|
||||
|
||||
new_obj_val = IntlDateFormatter_ce_ptr->create_object(Z_OBJCE_P(object) TSRMLS_CC);
|
||||
new_dfo = (IntlDateFormatter_object *)zend_object_store_get_object_by_handle(new_obj_val.handle TSRMLS_CC);
|
||||
new_obj = IntlDateFormatter_ce_ptr->create_object(Z_OBJCE_P(object) TSRMLS_CC);
|
||||
new_dfo = php_intl_dateformatter_fetch_object(new_obj);
|
||||
/* clone standard parts */
|
||||
zend_objects_clone_members(&new_dfo->zo, new_obj_val, &dfo->zo, handle TSRMLS_CC);
|
||||
zend_objects_clone_members(&new_dfo->zo, &dfo->zo TSRMLS_CC);
|
||||
/* clone formatter object */
|
||||
if (dfo->datef_data.udatf != NULL) {
|
||||
DATE_FORMAT_OBJECT(new_dfo) = udat_clone(DATE_FORMAT_OBJECT(dfo), &INTL_DATA_ERROR_CODE(dfo));
|
||||
@ -110,7 +101,7 @@ zend_object_value IntlDateFormatter_object_clone(zval *object TSRMLS_DC)
|
||||
} else {
|
||||
zend_throw_exception(NULL, "Cannot clone unconstructed IntlDateFormatter", 0 TSRMLS_CC);
|
||||
}
|
||||
return new_obj_val;
|
||||
return new_obj;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
@ -208,7 +199,10 @@ void dateformat_register_IntlDateFormatter_class( TSRMLS_D )
|
||||
|
||||
memcpy(&IntlDateFormatter_handlers, zend_get_std_object_handlers(),
|
||||
sizeof IntlDateFormatter_handlers);
|
||||
IntlDateFormatter_handlers.offset = XtOffsetOf(IntlDateFormatter_object, zo);
|
||||
IntlDateFormatter_handlers.clone_obj = IntlDateFormatter_object_clone;
|
||||
IntlDateFormatter_handlers.dtor_obj = IntlDateFormatter_object_dtor;
|
||||
IntlDateFormatter_handlers.free_obj = IntlDateFormatter_object_free;
|
||||
|
||||
/* Declare 'IntlDateFormatter' class properties. */
|
||||
if( !IntlDateFormatter_ce_ptr )
|
||||
|
@ -24,21 +24,26 @@
|
||||
#include "dateformat_data.h"
|
||||
|
||||
typedef struct {
|
||||
zend_object zo;
|
||||
dateformat_data datef_data;
|
||||
int date_type;
|
||||
int time_type;
|
||||
int calendar;
|
||||
char *requested_locale;
|
||||
zend_object zo;
|
||||
} IntlDateFormatter_object;
|
||||
|
||||
static inline IntlDateFormatter_object *php_intl_dateformatter_fetch_object(zend_object *obj) {
|
||||
return (IntlDateFormatter_object *)((char*)(obj) - XtOffsetOf(IntlDateFormatter_object, zo));
|
||||
}
|
||||
#define Z_INTL_DATEFORMATTER_P(zv) php_intl_dateformatter_fetch_object(Z_OBJ_P(zv))
|
||||
|
||||
void dateformat_register_IntlDateFormatter_class( TSRMLS_D );
|
||||
extern zend_class_entry *IntlDateFormatter_ce_ptr;
|
||||
|
||||
/* Auxiliary macros */
|
||||
|
||||
#define DATE_FORMAT_METHOD_INIT_VARS INTL_METHOD_INIT_VARS(IntlDateFormatter, dfo)
|
||||
#define DATE_FORMAT_METHOD_FETCH_OBJECT_NO_CHECK INTL_METHOD_FETCH_OBJECT(IntlDateFormatter, dfo)
|
||||
#define DATE_FORMAT_METHOD_FETCH_OBJECT_NO_CHECK INTL_METHOD_FETCH_OBJECT(INTL_DATEFORMATTER, dfo)
|
||||
#define DATE_FORMAT_METHOD_FETCH_OBJECT \
|
||||
DATE_FORMAT_METHOD_FETCH_OBJECT_NO_CHECK; \
|
||||
if (dfo->datef_data.udatf == NULL) \
|
||||
|
@ -49,7 +49,7 @@ static void datefmt_ctor(INTERNAL_FUNCTION_PARAMETERS)
|
||||
Calendar *calendar = NULL;
|
||||
long calendar_type;
|
||||
bool calendar_owned;
|
||||
zval **timezone_zv = NULL;
|
||||
zval *timezone_zv = NULL;
|
||||
TimeZone *timezone = NULL;
|
||||
bool explicit_tz;
|
||||
char* pattern_str = NULL;
|
||||
@ -61,7 +61,7 @@ static void datefmt_ctor(INTERNAL_FUNCTION_PARAMETERS)
|
||||
intl_error_reset(NULL TSRMLS_CC);
|
||||
object = return_value;
|
||||
/* Parse parameters. */
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sll|Zzs",
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sll|zzs",
|
||||
&locale_str, &locale_len, &date_type, &time_type, &timezone_zv,
|
||||
&calendar_zv, &pattern_str, &pattern_str_len) == FAILURE) {
|
||||
intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR, "datefmt_create: "
|
||||
@ -93,7 +93,7 @@ static void datefmt_ctor(INTERNAL_FUNCTION_PARAMETERS)
|
||||
}
|
||||
|
||||
/* process timezone */
|
||||
explicit_tz = timezone_zv != NULL && Z_TYPE_PP(timezone_zv) != IS_NULL;
|
||||
explicit_tz = timezone_zv != NULL && Z_TYPE_P(timezone_zv) != IS_NULL;
|
||||
|
||||
if (explicit_tz || calendar_owned ) {
|
||||
//we have an explicit time zone or a non-object calendar
|
||||
|
@ -62,7 +62,7 @@ static void internal_format(IntlDateFormatter_object *dfo, UDate timestamp, zval
|
||||
static int32_t internal_get_arr_ele(IntlDateFormatter_object *dfo,
|
||||
HashTable* hash_arr, char* key_name, intl_error *err TSRMLS_DC)
|
||||
{
|
||||
zval **ele_value = NULL;
|
||||
zval *ele_value = NULL;
|
||||
int32_t result = 0;
|
||||
char *message;
|
||||
|
||||
@ -70,23 +70,22 @@ static int32_t internal_get_arr_ele(IntlDateFormatter_object *dfo,
|
||||
return result;
|
||||
}
|
||||
|
||||
if (zend_hash_find(hash_arr, key_name, strlen(key_name) + 1,
|
||||
(void **)&ele_value) == SUCCESS) {
|
||||
if(Z_TYPE_PP(ele_value) != IS_LONG) {
|
||||
if ((ele_value = zend_hash_str_find(hash_arr, key_name, strlen(key_name))) != NULL) {
|
||||
if(Z_TYPE_P(ele_value) != IS_LONG) {
|
||||
spprintf(&message, 0, "datefmt_format: parameter array contains "
|
||||
"a non-integer element for key '%s'", key_name);
|
||||
intl_errors_set(err, U_ILLEGAL_ARGUMENT_ERROR, message, 1 TSRMLS_CC);
|
||||
efree(message);
|
||||
} else {
|
||||
if (Z_LVAL_PP(ele_value) > INT32_MAX ||
|
||||
Z_LVAL_PP(ele_value) < INT32_MIN) {
|
||||
if (Z_LVAL_P(ele_value) > INT32_MAX ||
|
||||
Z_LVAL_P(ele_value) < INT32_MIN) {
|
||||
spprintf(&message, 0, "datefmt_format: value %ld is out of "
|
||||
"bounds for a 32-bit integer in key '%s'",
|
||||
Z_LVAL_PP(ele_value), key_name);
|
||||
Z_LVAL_P(ele_value), key_name);
|
||||
intl_errors_set(err, U_ILLEGAL_ARGUMENT_ERROR, message, 1 TSRMLS_CC);
|
||||
efree(message);
|
||||
} else {
|
||||
result = Z_LVAL_PP(ele_value);
|
||||
result = Z_LVAL_P(ele_value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -45,9 +45,9 @@ static const DateFormat::EStyle valid_styles[] = {
|
||||
DateFormat::kShortRelative,
|
||||
};
|
||||
|
||||
static bool valid_format(zval **z) {
|
||||
if (Z_TYPE_PP(z) == IS_LONG) {
|
||||
long lval = Z_LVAL_PP(z);
|
||||
static bool valid_format(zval *z) {
|
||||
if (Z_TYPE_P(z) == IS_LONG) {
|
||||
long lval = Z_LVAL_P(z);
|
||||
for (int i = 0; i < sizeof(valid_styles) / sizeof(*valid_styles); i++) {
|
||||
if ((long)valid_styles[i] == lval) {
|
||||
return true;
|
||||
@ -61,7 +61,7 @@ static bool valid_format(zval **z) {
|
||||
U_CFUNC PHP_FUNCTION(datefmt_format_object)
|
||||
{
|
||||
zval *object,
|
||||
**format = NULL;
|
||||
*format = NULL;
|
||||
const char *locale_str = NULL;
|
||||
int locale_len;
|
||||
bool pattern = false;
|
||||
@ -73,7 +73,7 @@ U_CFUNC PHP_FUNCTION(datefmt_format_object)
|
||||
DateFormat::EStyle dateStyle = DateFormat::kDefault,
|
||||
timeStyle = DateFormat::kDefault;
|
||||
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "o|Zs!",
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "o|zs!",
|
||||
&object, &format, &locale_str, &locale_len) == FAILURE) {
|
||||
RETURN_FALSE;
|
||||
}
|
||||
@ -82,12 +82,12 @@ U_CFUNC PHP_FUNCTION(datefmt_format_object)
|
||||
locale_str = intl_locale_get_default(TSRMLS_C);
|
||||
}
|
||||
|
||||
if (format == NULL || Z_TYPE_PP(format) == IS_NULL) {
|
||||
if (format == NULL || Z_TYPE_P(format) == IS_NULL) {
|
||||
//nothing
|
||||
} else if (Z_TYPE_PP(format) == IS_ARRAY) {
|
||||
HashTable *ht = Z_ARRVAL_PP(format);
|
||||
} else if (Z_TYPE_P(format) == IS_ARRAY) {
|
||||
HashTable *ht = Z_ARRVAL_P(format);
|
||||
HashPosition pos = {0};
|
||||
zval **z;
|
||||
zval *z;
|
||||
if (zend_hash_num_elements(ht) != 2) {
|
||||
intl_error_set(NULL, U_ILLEGAL_ARGUMENT_ERROR,
|
||||
"datefmt_format_object: bad format; if array, it must have "
|
||||
@ -96,35 +96,35 @@ U_CFUNC PHP_FUNCTION(datefmt_format_object)
|
||||
}
|
||||
|
||||
zend_hash_internal_pointer_reset_ex(ht, &pos);
|
||||
zend_hash_get_current_data_ex(ht, (void**)&z, &pos);
|
||||
z = zend_hash_get_current_data_ex(ht, &pos);
|
||||
if (!valid_format(z)) {
|
||||
intl_error_set(NULL, U_ILLEGAL_ARGUMENT_ERROR,
|
||||
"datefmt_format_object: bad format; the date format (first "
|
||||
"element of the array) is not valid", 0 TSRMLS_CC);
|
||||
RETURN_FALSE;
|
||||
}
|
||||
dateStyle = (DateFormat::EStyle)Z_LVAL_PP(z);
|
||||
dateStyle = (DateFormat::EStyle)Z_LVAL_P(z);
|
||||
|
||||
zend_hash_move_forward_ex(ht, &pos);
|
||||
zend_hash_get_current_data_ex(ht, (void**)&z, &pos);
|
||||
z = zend_hash_get_current_data_ex(ht, &pos);
|
||||
if (!valid_format(z)) {
|
||||
intl_error_set(NULL, U_ILLEGAL_ARGUMENT_ERROR,
|
||||
"datefmt_format_object: bad format; the time format ("
|
||||
"second element of the array) is not valid", 0 TSRMLS_CC);
|
||||
RETURN_FALSE;
|
||||
}
|
||||
timeStyle = (DateFormat::EStyle)Z_LVAL_PP(z);
|
||||
} else if (Z_TYPE_PP(format) == IS_LONG) {
|
||||
timeStyle = (DateFormat::EStyle)Z_LVAL_P(z);
|
||||
} else if (Z_TYPE_P(format) == IS_LONG) {
|
||||
if (!valid_format(format)) {
|
||||
intl_error_set(NULL, U_ILLEGAL_ARGUMENT_ERROR,
|
||||
"datefmt_format_object: the date/time format type is invalid",
|
||||
0 TSRMLS_CC);
|
||||
RETURN_FALSE;
|
||||
}
|
||||
dateStyle = timeStyle = (DateFormat::EStyle)Z_LVAL_PP(format);
|
||||
dateStyle = timeStyle = (DateFormat::EStyle)Z_LVAL_P(format);
|
||||
} else {
|
||||
convert_to_string_ex(format);
|
||||
if (Z_STRLEN_PP(format) == 0) {
|
||||
if (Z_STRLEN_P(format) == 0) {
|
||||
intl_error_set(NULL, U_ILLEGAL_ARGUMENT_ERROR,
|
||||
"datefmt_format_object: the format is empty", 0 TSRMLS_CC);
|
||||
RETURN_FALSE;
|
||||
@ -176,7 +176,7 @@ U_CFUNC PHP_FUNCTION(datefmt_format_object)
|
||||
|
||||
if (pattern) {
|
||||
df = new SimpleDateFormat(
|
||||
UnicodeString(Z_STRVAL_PP(format), Z_STRLEN_PP(format),
|
||||
UnicodeString(Z_STRVAL_P(format), Z_STRLEN_P(format),
|
||||
UnicodeString::kInvariant),
|
||||
Locale::createFromName(locale_str),
|
||||
status);
|
||||
@ -208,18 +208,21 @@ U_CFUNC PHP_FUNCTION(datefmt_format_object)
|
||||
timeZone = NULL;
|
||||
|
||||
{
|
||||
char *ret_str;
|
||||
int ret_str_len;
|
||||
UnicodeString result = UnicodeString();
|
||||
df->format(date, result);
|
||||
|
||||
Z_TYPE_P(return_value) = IS_STRING;
|
||||
if (intl_charFromString(result, &Z_STRVAL_P(return_value),
|
||||
&Z_STRLEN_P(return_value), &status) == FAILURE) {
|
||||
if (intl_charFromString(result, &ret_str, &ret_str_len, &status) == FAILURE) {
|
||||
intl_error_set(NULL, status,
|
||||
"datefmt_format_object: error converting result to UTF-8",
|
||||
0 TSRMLS_CC);
|
||||
RETVAL_FALSE;
|
||||
goto cleanup;
|
||||
}
|
||||
RETVAL_STRINGL(ret_str, ret_str_len);
|
||||
//???
|
||||
efree(ret_str);
|
||||
}
|
||||
|
||||
|
||||
|
@ -146,11 +146,11 @@ PHP_FUNCTION( numfmt_get_text_attribute )
|
||||
PHP_FUNCTION( numfmt_set_attribute )
|
||||
{
|
||||
long attribute;
|
||||
zval **value;
|
||||
zval *value;
|
||||
FORMATTER_METHOD_INIT_VARS;
|
||||
|
||||
/* Parse parameters. */
|
||||
if( zend_parse_method_parameters( ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "OlZ",
|
||||
if( zend_parse_method_parameters( ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Olz",
|
||||
&object, NumberFormatter_ce_ptr, &attribute, &value ) == FAILURE)
|
||||
{
|
||||
intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR,
|
||||
@ -183,11 +183,11 @@ PHP_FUNCTION( numfmt_set_attribute )
|
||||
case UNUM_MAX_SIGNIFICANT_DIGITS:
|
||||
case UNUM_LENIENT_PARSE:
|
||||
convert_to_long_ex(value);
|
||||
unum_setAttribute(FORMATTER_OBJECT(nfo), attribute, Z_LVAL_PP(value));
|
||||
unum_setAttribute(FORMATTER_OBJECT(nfo), attribute, Z_LVAL_P(value));
|
||||
break;
|
||||
case UNUM_ROUNDING_INCREMENT:
|
||||
convert_to_double_ex(value);
|
||||
unum_setDoubleAttribute(FORMATTER_OBJECT(nfo), attribute, Z_DVAL_PP(value));
|
||||
unum_setDoubleAttribute(FORMATTER_OBJECT(nfo), attribute, Z_DVAL_P(value));
|
||||
break;
|
||||
default:
|
||||
INTL_DATA_ERROR_CODE(nfo) = U_UNSUPPORTED_ERROR;
|
||||
@ -445,7 +445,7 @@ PHP_FUNCTION( numfmt_get_locale )
|
||||
|
||||
loc = (char *)unum_getLocaleByType(FORMATTER_OBJECT(nfo), type, &INTL_DATA_ERROR_CODE(nfo));
|
||||
INTL_METHOD_CHECK_STATUS( nfo, "Error getting locale" );
|
||||
RETURN_STRING(loc, 1);
|
||||
RETURN_STRING(loc);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
|
@ -35,61 +35,49 @@ static zend_object_handlers NumberFormatter_handlers;
|
||||
|
||||
/* {{{ NumberFormatter_objects_dtor */
|
||||
static void NumberFormatter_object_dtor(
|
||||
void *object,
|
||||
zend_object_handle handle TSRMLS_DC )
|
||||
zend_object *object
|
||||
TSRMLS_DC )
|
||||
{
|
||||
zend_objects_destroy_object( object, handle TSRMLS_CC );
|
||||
zend_objects_destroy_object( object TSRMLS_CC );
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ NumberFormatter_objects_free */
|
||||
void NumberFormatter_object_free( zend_object *object TSRMLS_DC )
|
||||
{
|
||||
NumberFormatter_object* nfo = (NumberFormatter_object*)object;
|
||||
NumberFormatter_object* nfo = php_intl_number_format_fetch_object(object);
|
||||
|
||||
zend_object_std_dtor( &nfo->zo TSRMLS_CC );
|
||||
|
||||
formatter_data_free( &nfo->nf_data TSRMLS_CC );
|
||||
|
||||
efree( nfo );
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ NumberFormatter_object_create */
|
||||
zend_object_value NumberFormatter_object_create(zend_class_entry *ce TSRMLS_DC)
|
||||
zend_object *NumberFormatter_object_create(zend_class_entry *ce TSRMLS_DC)
|
||||
{
|
||||
zend_object_value retval;
|
||||
NumberFormatter_object* intern;
|
||||
|
||||
intern = ecalloc( 1, sizeof(NumberFormatter_object) );
|
||||
intern = ecalloc( 1, sizeof(NumberFormatter_object) + sizeof(zval) * (ce->default_properties_count - 1) );
|
||||
formatter_data_init( &intern->nf_data TSRMLS_CC );
|
||||
zend_object_std_init( &intern->zo, ce TSRMLS_CC );
|
||||
object_properties_init(&intern->zo, ce);
|
||||
|
||||
retval.handle = zend_objects_store_put(
|
||||
intern,
|
||||
NumberFormatter_object_dtor,
|
||||
(zend_objects_free_object_storage_t)NumberFormatter_object_free,
|
||||
NULL TSRMLS_CC );
|
||||
intern->zo.handlers = &NumberFormatter_handlers;
|
||||
|
||||
retval.handlers = &NumberFormatter_handlers;
|
||||
|
||||
return retval;
|
||||
return &intern->zo;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ NumberFormatter_object_clone */
|
||||
zend_object_value NumberFormatter_object_clone(zval *object TSRMLS_DC)
|
||||
zend_object *NumberFormatter_object_clone(zval *object TSRMLS_DC)
|
||||
{
|
||||
zend_object_value new_obj_val;
|
||||
zend_object_handle handle = Z_OBJ_HANDLE_P(object);
|
||||
NumberFormatter_object *nfo, *new_nfo;
|
||||
|
||||
FORMATTER_METHOD_FETCH_OBJECT_NO_CHECK;
|
||||
new_obj_val = NumberFormatter_ce_ptr->create_object(Z_OBJCE_P(object) TSRMLS_CC);
|
||||
new_nfo = (NumberFormatter_object *)zend_object_store_get_object_by_handle(new_obj_val.handle TSRMLS_CC);
|
||||
new_nfo = NumberFormatter_ce_ptr->create_object(Z_OBJCE_P(object) TSRMLS_CC);
|
||||
/* clone standard parts */
|
||||
zend_objects_clone_members(&new_nfo->zo, new_obj_val, &nfo->zo, handle TSRMLS_CC);
|
||||
zend_objects_clone_members(&new_nfo->zo, &nfo->zo TSRMLS_CC);
|
||||
/* clone formatter object. It may fail, the destruction code must handle this case */
|
||||
if (FORMATTER_OBJECT(nfo) != NULL) {
|
||||
FORMATTER_OBJECT(new_nfo) = unum_clone(FORMATTER_OBJECT(nfo),
|
||||
@ -103,7 +91,7 @@ zend_object_value NumberFormatter_object_clone(zval *object TSRMLS_DC)
|
||||
} else {
|
||||
zend_throw_exception(NULL, "Cannot clone unconstructed NumberFormatter", 0 TSRMLS_CC);
|
||||
}
|
||||
return new_obj_val;
|
||||
return new_nfo;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
@ -205,7 +193,10 @@ void formatter_register_class( TSRMLS_D )
|
||||
|
||||
memcpy(&NumberFormatter_handlers, zend_get_std_object_handlers(),
|
||||
sizeof(NumberFormatter_handlers));
|
||||
NumberFormatter_handlers.offset = XtOffsetOf(NumberFormatter_object, zo);
|
||||
NumberFormatter_handlers.clone_obj = NumberFormatter_object_clone;
|
||||
NumberFormatter_handlers.dtor_obj = NumberFormatter_object_dtor;
|
||||
NumberFormatter_handlers.free_obj = NumberFormatter_object_free;
|
||||
|
||||
/* Declare 'NumberFormatter' class properties. */
|
||||
if( !NumberFormatter_ce_ptr )
|
||||
|
@ -25,10 +25,15 @@
|
||||
#include "formatter_data.h"
|
||||
|
||||
typedef struct {
|
||||
zend_object zo;
|
||||
formatter_data nf_data;
|
||||
zend_object zo;
|
||||
} NumberFormatter_object;
|
||||
|
||||
static inline NumberFormatter_object *php_intl_number_format_fetch_object(zend_object *obj) {
|
||||
return (NumberFormatter_object *)((char*)(obj) - XtOffsetOf(NumberFormatter_object, zo));
|
||||
}
|
||||
#define Z_INTL_NUMBERFORMATTER_P(zv) php_intl_number_format_fetch_object(Z_OBJ_P(zv))
|
||||
|
||||
void formatter_register_class( TSRMLS_D );
|
||||
extern zend_class_entry *NumberFormatter_ce_ptr;
|
||||
|
||||
@ -36,7 +41,7 @@ extern zend_class_entry *NumberFormatter_ce_ptr;
|
||||
|
||||
#define FORMATTER_METHOD_INIT_VARS INTL_METHOD_INIT_VARS(NumberFormatter, nfo)
|
||||
#define FORMATTER_OBJECT(nfo) (nfo)->nf_data.unum
|
||||
#define FORMATTER_METHOD_FETCH_OBJECT_NO_CHECK INTL_METHOD_FETCH_OBJECT(NumberFormatter, nfo)
|
||||
#define FORMATTER_METHOD_FETCH_OBJECT_NO_CHECK INTL_METHOD_FETCH_OBJECT(INTL_NUMBERFORMATTER, nfo)
|
||||
#define FORMATTER_METHOD_FETCH_OBJECT \
|
||||
FORMATTER_METHOD_FETCH_OBJECT_NO_CHECK; \
|
||||
if (FORMATTER_OBJECT(nfo) == NULL) \
|
||||
|
@ -32,7 +32,7 @@
|
||||
*/
|
||||
PHP_FUNCTION( numfmt_format )
|
||||
{
|
||||
zval **number;
|
||||
zval *number;
|
||||
long type = FORMAT_TYPE_DEFAULT;
|
||||
UChar format_buf[32];
|
||||
UChar* formatted = format_buf;
|
||||
@ -40,7 +40,7 @@ PHP_FUNCTION( numfmt_format )
|
||||
FORMATTER_METHOD_INIT_VARS;
|
||||
|
||||
/* Parse parameters. */
|
||||
if( zend_parse_method_parameters( ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "OZ|l",
|
||||
if( zend_parse_method_parameters( ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Oz|l",
|
||||
&object, NumberFormatter_ce_ptr, &number, &type ) == FAILURE )
|
||||
{
|
||||
intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR,
|
||||
@ -53,34 +53,34 @@ PHP_FUNCTION( numfmt_format )
|
||||
FORMATTER_METHOD_FETCH_OBJECT;
|
||||
|
||||
if(type == FORMAT_TYPE_DEFAULT) {
|
||||
if(Z_TYPE_PP(number) == IS_STRING) {
|
||||
if(Z_TYPE_P(number) == IS_STRING) {
|
||||
convert_scalar_to_number_ex(number);
|
||||
}
|
||||
|
||||
if(Z_TYPE_PP(number) == IS_LONG) {
|
||||
if(Z_TYPE_P(number) == IS_LONG) {
|
||||
/* take INT32 on 32-bit, int64 on 64-bit */
|
||||
type = (sizeof(long) == 8)?FORMAT_TYPE_INT64:FORMAT_TYPE_INT32;
|
||||
} else if(Z_TYPE_PP(number) == IS_DOUBLE) {
|
||||
} else if(Z_TYPE_P(number) == IS_DOUBLE) {
|
||||
type = FORMAT_TYPE_DOUBLE;
|
||||
} else {
|
||||
type = FORMAT_TYPE_INT32;
|
||||
}
|
||||
}
|
||||
|
||||
if(Z_TYPE_PP(number) != IS_DOUBLE && Z_TYPE_PP(number) != IS_LONG) {
|
||||
if(Z_TYPE_P(number) != IS_DOUBLE && Z_TYPE_P(number) != IS_LONG) {
|
||||
SEPARATE_ZVAL_IF_NOT_REF(number);
|
||||
convert_scalar_to_number( *number TSRMLS_CC );
|
||||
convert_scalar_to_number(number TSRMLS_CC );
|
||||
}
|
||||
|
||||
switch(type) {
|
||||
case FORMAT_TYPE_INT32:
|
||||
convert_to_long_ex(number);
|
||||
formatted_len = unum_format(FORMATTER_OBJECT(nfo), (int32_t)Z_LVAL_PP(number),
|
||||
formatted_len = unum_format(FORMATTER_OBJECT(nfo), (int32_t)Z_LVAL_P(number),
|
||||
formatted, formatted_len, NULL, &INTL_DATA_ERROR_CODE(nfo));
|
||||
if (INTL_DATA_ERROR_CODE(nfo) == U_BUFFER_OVERFLOW_ERROR) {
|
||||
intl_error_reset(INTL_DATA_ERROR_P(nfo) TSRMLS_CC);
|
||||
formatted = eumalloc(formatted_len);
|
||||
formatted_len = unum_format(FORMATTER_OBJECT(nfo), (int32_t)Z_LVAL_PP(number),
|
||||
formatted_len = unum_format(FORMATTER_OBJECT(nfo), (int32_t)Z_LVAL_P(number),
|
||||
formatted, formatted_len, NULL, &INTL_DATA_ERROR_CODE(nfo));
|
||||
if (U_FAILURE( INTL_DATA_ERROR_CODE(nfo) ) ) {
|
||||
efree(formatted);
|
||||
@ -91,7 +91,7 @@ PHP_FUNCTION( numfmt_format )
|
||||
|
||||
case FORMAT_TYPE_INT64:
|
||||
{
|
||||
int64_t value = (Z_TYPE_PP(number) == IS_DOUBLE)?(int64_t)Z_DVAL_PP(number):Z_LVAL_PP(number);
|
||||
int64_t value = (Z_TYPE_P(number) == IS_DOUBLE)?(int64_t)Z_DVAL_P(number):Z_LVAL_P(number);
|
||||
formatted_len = unum_formatInt64(FORMATTER_OBJECT(nfo), value, formatted, formatted_len, NULL, &INTL_DATA_ERROR_CODE(nfo));
|
||||
if (INTL_DATA_ERROR_CODE(nfo) == U_BUFFER_OVERFLOW_ERROR) {
|
||||
intl_error_reset(INTL_DATA_ERROR_P(nfo) TSRMLS_CC);
|
||||
@ -107,11 +107,11 @@ PHP_FUNCTION( numfmt_format )
|
||||
|
||||
case FORMAT_TYPE_DOUBLE:
|
||||
convert_to_double_ex(number);
|
||||
formatted_len = unum_formatDouble(FORMATTER_OBJECT(nfo), Z_DVAL_PP(number), formatted, formatted_len, NULL, &INTL_DATA_ERROR_CODE(nfo));
|
||||
formatted_len = unum_formatDouble(FORMATTER_OBJECT(nfo), Z_DVAL_P(number), formatted, formatted_len, NULL, &INTL_DATA_ERROR_CODE(nfo));
|
||||
if (INTL_DATA_ERROR_CODE(nfo) == U_BUFFER_OVERFLOW_ERROR) {
|
||||
intl_error_reset(INTL_DATA_ERROR_P(nfo) TSRMLS_CC);
|
||||
formatted = eumalloc(formatted_len);
|
||||
unum_formatDouble(FORMATTER_OBJECT(nfo), Z_DVAL_PP(number), formatted, formatted_len, NULL, &INTL_DATA_ERROR_CODE(nfo));
|
||||
unum_formatDouble(FORMATTER_OBJECT(nfo), Z_DVAL_P(number), formatted, formatted_len, NULL, &INTL_DATA_ERROR_CODE(nfo));
|
||||
if (U_FAILURE( INTL_DATA_ERROR_CODE(nfo) ) ) {
|
||||
efree(formatted);
|
||||
}
|
||||
|
@ -111,7 +111,7 @@ PHP_FUNCTION( numfmt_get_error_code )
|
||||
RETURN_FALSE;
|
||||
}
|
||||
|
||||
nfo = (NumberFormatter_object *) zend_object_store_get_object( object TSRMLS_CC );
|
||||
nfo = Z_INTL_NUMERFORMATTER_P(object);
|
||||
|
||||
/* Return formatter's last error code. */
|
||||
RETURN_LONG( INTL_DATA_ERROR_CODE(nfo) );
|
||||
@ -125,7 +125,7 @@ PHP_FUNCTION( numfmt_get_error_code )
|
||||
*/
|
||||
PHP_FUNCTION( numfmt_get_error_message )
|
||||
{
|
||||
char* message = NULL;
|
||||
zend_string *message = NULL;
|
||||
FORMATTER_METHOD_INIT_VARS
|
||||
|
||||
/* Parse parameters. */
|
||||
@ -138,11 +138,11 @@ PHP_FUNCTION( numfmt_get_error_message )
|
||||
RETURN_FALSE;
|
||||
}
|
||||
|
||||
nfo = (NumberFormatter_object *) zend_object_store_get_object( object TSRMLS_CC );
|
||||
nfo = Z_INTL_NUMERFORMATTER_P(object);
|
||||
|
||||
/* Return last error message. */
|
||||
message = intl_error_get_message( INTL_DATA_ERROR_P(nfo) TSRMLS_CC );
|
||||
RETURN_STRING( message, 0);
|
||||
RETURN_STR(message);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
|
@ -171,7 +171,9 @@ PHP_FUNCTION( numfmt_parse_currency )
|
||||
intl_convert_utf16_to_utf8(¤cy_str, ¤cy_len, currency, u_strlen(currency), &INTL_DATA_ERROR_CODE(nfo));
|
||||
INTL_METHOD_CHECK_STATUS( nfo, "Currency conversion to UTF-8 failed" );
|
||||
zval_dtor( zcurrency );
|
||||
ZVAL_STRINGL(zcurrency, currency_str, currency_len, 0);
|
||||
ZVAL_STRINGL(zcurrency, currency_str, currency_len);
|
||||
//????
|
||||
efree(currency_str);
|
||||
|
||||
RETVAL_DOUBLE( number );
|
||||
}
|
||||
|
@ -438,7 +438,7 @@ PHP_FUNCTION(grapheme_substr)
|
||||
RETURN_FALSE;
|
||||
}
|
||||
|
||||
RETURN_STRINGL(((char *)sub_str), sub_str_len, 1);
|
||||
RETURN_STRINGL(((char *)sub_str), sub_str_len);
|
||||
}
|
||||
|
||||
ustr = NULL;
|
||||
@ -528,7 +528,10 @@ PHP_FUNCTION(grapheme_substr)
|
||||
}
|
||||
|
||||
/* return the allocated string, not a duplicate */
|
||||
RETURN_STRINGL(((char *)sub_str), sub_str_len, 0);
|
||||
RETVAL_STRINGL(((char *)sub_str), sub_str_len);
|
||||
//???
|
||||
efree(sub_str);
|
||||
return;
|
||||
}
|
||||
|
||||
if(length == 0) {
|
||||
@ -604,7 +607,9 @@ PHP_FUNCTION(grapheme_substr)
|
||||
}
|
||||
|
||||
/* return the allocated string, not a duplicate */
|
||||
RETURN_STRINGL(((char *)sub_str), sub_str_len, 0);
|
||||
RETVAL_STRINGL(((char *)sub_str), sub_str_len);
|
||||
//????
|
||||
efree(sub_str);
|
||||
|
||||
}
|
||||
/* }}} */
|
||||
@ -650,9 +655,9 @@ static void strstr_common_handler(INTERNAL_FUNCTION_PARAMETERS, int f_ignore_cas
|
||||
size_t found_offset = found - haystack;
|
||||
|
||||
if (part) {
|
||||
RETURN_STRINGL(((char *)haystack) , found_offset, 1);
|
||||
RETURN_STRINGL(((char *)haystack) , found_offset);
|
||||
} else {
|
||||
RETURN_STRINGL(((char *)found), haystack_len - found_offset, 1);
|
||||
RETURN_STRINGL(((char *)found), haystack_len - found_offset);
|
||||
}
|
||||
}
|
||||
|
||||
@ -671,10 +676,10 @@ static void strstr_common_handler(INTERNAL_FUNCTION_PARAMETERS, int f_ignore_cas
|
||||
U8_FWD_N(haystack, ret_pos, haystack_len, uchar_pos);
|
||||
|
||||
if (part) {
|
||||
RETURN_STRINGL(((char *)haystack), ret_pos, 1);
|
||||
RETURN_STRINGL(((char *)haystack), ret_pos);
|
||||
}
|
||||
else {
|
||||
RETURN_STRINGL(((char *)haystack) + ret_pos, haystack_len - ret_pos, 1);
|
||||
RETURN_STRINGL(((char *)haystack) + ret_pos, haystack_len - ret_pos);
|
||||
}
|
||||
|
||||
}
|
||||
@ -895,7 +900,7 @@ PHP_FUNCTION(grapheme_extract)
|
||||
if ( NULL != next ) {
|
||||
ZVAL_LONG(next, start+nsize);
|
||||
}
|
||||
RETURN_STRINGL(((char *)pstr), nsize, 1);
|
||||
RETURN_STRINGL(((char *)pstr), nsize);
|
||||
}
|
||||
|
||||
/* convert the strings to UTF-16. */
|
||||
@ -939,7 +944,7 @@ PHP_FUNCTION(grapheme_extract)
|
||||
ZVAL_LONG(next, start+ret_pos);
|
||||
}
|
||||
|
||||
RETURN_STRINGL(((char *)pstr), ret_pos, 1);
|
||||
RETURN_STRINGL(((char *)pstr), ret_pos);
|
||||
}
|
||||
|
||||
/* }}} */
|
||||
|
@ -42,7 +42,7 @@ typedef struct _intl_data {
|
||||
#define INTL_DATA_ERROR_CODE(obj) INTL_ERROR_CODE(INTL_DATA_ERROR((obj)))
|
||||
|
||||
#define INTL_METHOD_FETCH_OBJECT(oclass, obj) \
|
||||
obj = (oclass##_object *) zend_object_store_get_object( object TSRMLS_CC ); \
|
||||
obj = Z_##oclass##_P( object ); \
|
||||
intl_error_reset( INTL_DATA_ERROR_P(obj) TSRMLS_CC ); \
|
||||
|
||||
/* Check status by error code, if error - exit */
|
||||
@ -82,7 +82,8 @@ typedef struct _intl_data {
|
||||
efree(ustring); \
|
||||
} \
|
||||
INTL_METHOD_CHECK_STATUS((obj), "Error converting value to UTF-8"); \
|
||||
RETVAL_STRINGL(u8value, u8len, 0); \
|
||||
RETVAL_STRINGL(u8value, u8len); \
|
||||
efree(u8value); \
|
||||
}
|
||||
|
||||
#define INTL_MAX_LOCALE_LEN 80
|
||||
|
@ -129,24 +129,24 @@ void intl_error_set_custom_msg( intl_error* err, char* msg, int copyMsg TSRMLS_D
|
||||
/* {{{ const char* intl_error_get_message( intl_error* err )
|
||||
* Create output message in format "<intl_error_text>: <extra_user_error_text>".
|
||||
*/
|
||||
char* intl_error_get_message( intl_error* err TSRMLS_DC )
|
||||
zend_string * intl_error_get_message( intl_error* err TSRMLS_DC )
|
||||
{
|
||||
const char* uErrorName = NULL;
|
||||
char* errMessage = 0;
|
||||
const char *uErrorName = NULL;
|
||||
zend_string *errMessage = 0;
|
||||
|
||||
if( !err && !( err = intl_g_error_get( TSRMLS_C ) ) )
|
||||
return estrdup( "" );
|
||||
return STR_EMPTY_ALLOC();
|
||||
|
||||
uErrorName = u_errorName( err->code );
|
||||
|
||||
/* Format output string */
|
||||
if( err->custom_error_message )
|
||||
{
|
||||
spprintf( &errMessage, 0, "%s: %s", err->custom_error_message, uErrorName );
|
||||
errMessage = strpprintf(0, "%s: %s", err->custom_error_message, uErrorName );
|
||||
}
|
||||
else
|
||||
{
|
||||
spprintf( &errMessage, 0, "%s", uErrorName );
|
||||
errMessage = strpprintf(0, "%s", uErrorName );
|
||||
}
|
||||
|
||||
return errMessage;
|
||||
|
@ -38,7 +38,7 @@ void intl_error_set_code( intl_error* err, UErrorCode err_code TSRMLS_DC
|
||||
void intl_error_set_custom_msg( intl_error* err, char* msg, int copyMsg TSRMLS_DC );
|
||||
void intl_error_set( intl_error* err, UErrorCode code, char* msg, int copyMsg TSRMLS_DC );
|
||||
UErrorCode intl_error_get_code( intl_error* err TSRMLS_DC );
|
||||
char* intl_error_get_message( intl_error* err TSRMLS_DC );
|
||||
zend_string* intl_error_get_message( intl_error* err TSRMLS_DC );
|
||||
|
||||
// Wrappers to synchonize object's and global error structures.
|
||||
void intl_errors_reset( intl_error* err TSRMLS_DC );
|
||||
|
@ -211,7 +211,7 @@ static int getSingletonPos(const char* str)
|
||||
Get default locale */
|
||||
PHP_NAMED_FUNCTION(zif_locale_get_default)
|
||||
{
|
||||
RETURN_STRING( intl_locale_get_default( TSRMLS_C ), TRUE );
|
||||
RETURN_STRING( intl_locale_get_default( TSRMLS_C ) );
|
||||
}
|
||||
|
||||
/* }}} */
|
||||
@ -225,6 +225,7 @@ PHP_NAMED_FUNCTION(zif_locale_set_default)
|
||||
{
|
||||
char* locale_name = NULL;
|
||||
int len=0;
|
||||
zend_string *ini_name;
|
||||
|
||||
if(zend_parse_parameters( ZEND_NUM_ARGS() TSRMLS_CC, "s",
|
||||
&locale_name ,&len ) == FAILURE)
|
||||
@ -239,8 +240,10 @@ PHP_NAMED_FUNCTION(zif_locale_set_default)
|
||||
locale_name = (char *)uloc_getDefault() ;
|
||||
len = strlen(locale_name);
|
||||
}
|
||||
|
||||
zend_alter_ini_entry(LOCALE_INI_NAME, sizeof(LOCALE_INI_NAME), locale_name, len, PHP_INI_USER, PHP_INI_STAGE_RUNTIME);
|
||||
|
||||
ini_name = STR_INIT(LOCALE_INI_NAME, sizeof(LOCALE_INI_NAME) - 1, 0);
|
||||
zend_alter_ini_entry(ini_name, locale_name, len, PHP_INI_USER, PHP_INI_STAGE_RUNTIME);
|
||||
STR_RELEASE(ini_name);
|
||||
|
||||
RETURN_TRUE;
|
||||
}
|
||||
@ -404,12 +407,15 @@ static void get_icu_value_src_php( char* tag_name, INTERNAL_FUNCTION_PARAMETERS)
|
||||
if( tag_value){
|
||||
efree( tag_value);
|
||||
}
|
||||
RETURN_STRING( empty_result , TRUE);
|
||||
RETURN_STRING( empty_result);
|
||||
}
|
||||
|
||||
/* value found */
|
||||
if( tag_value){
|
||||
RETURN_STRING( tag_value , FALSE);
|
||||
RETVAL_STRING( tag_value );
|
||||
//???
|
||||
efree(tag_value);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Error encountered while fetching the value */
|
||||
@ -586,7 +592,9 @@ static void get_icu_disp_value_src_php( char* tag_name, INTERNAL_FUNCTION_PARAME
|
||||
RETURN_FALSE;
|
||||
}
|
||||
|
||||
RETVAL_STRINGL( utf8value, utf8value_len , FALSE);
|
||||
RETVAL_STRINGL( utf8value, utf8value_len );
|
||||
//????
|
||||
efree(utf8value);
|
||||
|
||||
}
|
||||
/* }}} */
|
||||
@ -755,10 +763,10 @@ PHP_FUNCTION(locale_canonicalize)
|
||||
*/
|
||||
static int append_key_value(smart_str* loc_name, HashTable* hash_arr, char* key_name)
|
||||
{
|
||||
zval** ele_value = NULL;
|
||||
zval *ele_value;
|
||||
|
||||
if(zend_hash_find(hash_arr , key_name , strlen(key_name) + 1 ,(void **)&ele_value ) == SUCCESS ) {
|
||||
if(Z_TYPE_PP(ele_value)!= IS_STRING ){
|
||||
if ((ele_value = zend_hash_str_find(hash_arr , key_name, strlen(key_name))) != NULL ) {
|
||||
if(Z_TYPE_P(ele_value)!= IS_STRING ){
|
||||
/* element value is not a string */
|
||||
return FAILURE;
|
||||
}
|
||||
@ -767,7 +775,7 @@ static int append_key_value(smart_str* loc_name, HashTable* hash_arr, char* key_
|
||||
/* not lang or grandfathered tag */
|
||||
smart_str_appendl(loc_name, SEPARATOR , sizeof(SEPARATOR)-1);
|
||||
}
|
||||
smart_str_appendl(loc_name, Z_STRVAL_PP(ele_value) , Z_STRLEN_PP(ele_value));
|
||||
smart_str_appendl(loc_name, Z_STRVAL_P(ele_value) , Z_STRLEN_P(ele_value));
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
@ -796,36 +804,33 @@ static void add_prefix(smart_str* loc_name, char* key_name)
|
||||
*/
|
||||
static int append_multiple_key_values(smart_str* loc_name, HashTable* hash_arr, char* key_name TSRMLS_DC)
|
||||
{
|
||||
zval** ele_value = NULL;
|
||||
zval *ele_value;
|
||||
int i = 0;
|
||||
int isFirstSubtag = 0;
|
||||
int max_value = 0;
|
||||
|
||||
/* Variant/ Extlang/Private etc. */
|
||||
if( zend_hash_find( hash_arr , key_name , strlen(key_name) + 1 ,(void **)&ele_value ) == SUCCESS ) {
|
||||
if( Z_TYPE_PP(ele_value) == IS_STRING ){
|
||||
if ((ele_value = zend_hash_str_find( hash_arr , key_name , strlen(key_name))) != NULL) {
|
||||
if( Z_TYPE_P(ele_value) == IS_STRING ){
|
||||
add_prefix( loc_name , key_name);
|
||||
|
||||
smart_str_appendl(loc_name, SEPARATOR , sizeof(SEPARATOR)-1);
|
||||
smart_str_appendl(loc_name, Z_STRVAL_PP(ele_value) , Z_STRLEN_PP(ele_value));
|
||||
smart_str_appendl(loc_name, Z_STRVAL_P(ele_value) , Z_STRLEN_P(ele_value));
|
||||
return SUCCESS;
|
||||
} else if(Z_TYPE_PP(ele_value) == IS_ARRAY ) {
|
||||
HashPosition pos;
|
||||
HashTable *arr = HASH_OF(*ele_value);
|
||||
zval **data = NULL;
|
||||
} else if(Z_TYPE_P(ele_value) == IS_ARRAY ) {
|
||||
HashTable *arr = HASH_OF(ele_value);
|
||||
zval *data;
|
||||
|
||||
zend_hash_internal_pointer_reset_ex(arr, &pos);
|
||||
while(zend_hash_get_current_data_ex(arr, (void **)&data, &pos) != FAILURE) {
|
||||
if(Z_TYPE_PP(data) != IS_STRING) {
|
||||
ZEND_HASH_FOREACH_VAL(arr, data) {
|
||||
if(Z_TYPE_P(data) != IS_STRING) {
|
||||
return FAILURE;
|
||||
}
|
||||
if (isFirstSubtag++ == 0){
|
||||
add_prefix(loc_name , key_name);
|
||||
}
|
||||
smart_str_appendl(loc_name, SEPARATOR , sizeof(SEPARATOR)-1);
|
||||
smart_str_appendl(loc_name, Z_STRVAL_PP(data) , Z_STRLEN_PP(data));
|
||||
zend_hash_move_forward_ex(arr, &pos);
|
||||
}
|
||||
smart_str_appendl(loc_name, Z_STRVAL_P(data) , Z_STRLEN_P(data));
|
||||
} ZEND_HASH_FOREACH_END();
|
||||
return SUCCESS;
|
||||
} else {
|
||||
return FAILURE;
|
||||
@ -847,8 +852,8 @@ static int append_multiple_key_values(smart_str* loc_name, HashTable* hash_arr,
|
||||
isFirstSubtag = 0;
|
||||
for( i=0 ; i< max_value; i++ ){
|
||||
snprintf( cur_key_name , 30, "%s%d", key_name , i);
|
||||
if( zend_hash_find( hash_arr , cur_key_name , strlen(cur_key_name) + 1,(void **)&ele_value ) == SUCCESS ){
|
||||
if( Z_TYPE_PP(ele_value)!= IS_STRING ){
|
||||
if ((ele_value = zend_hash_str_find( hash_arr , cur_key_name , strlen(cur_key_name))) != NULL) {
|
||||
if( Z_TYPE_P(ele_value)!= IS_STRING ){
|
||||
/* variant is not a string */
|
||||
return FAILURE;
|
||||
}
|
||||
@ -857,7 +862,7 @@ static int append_multiple_key_values(smart_str* loc_name, HashTable* hash_arr,
|
||||
add_prefix(loc_name , cur_key_name);
|
||||
}
|
||||
smart_str_appendl(loc_name, SEPARATOR , sizeof(SEPARATOR)-1);
|
||||
smart_str_appendl(loc_name, Z_STRVAL_PP(ele_value) , Z_STRLEN_PP(ele_value));
|
||||
smart_str_appendl(loc_name, Z_STRVAL_P(ele_value) , Z_STRLEN_P(ele_value));
|
||||
}
|
||||
} /* end of for */
|
||||
} /* end of else */
|
||||
@ -884,7 +889,7 @@ static int handleAppendResult( int result, smart_str* loc_name TSRMLS_DC)
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
#define RETURN_SMART_STR(s) smart_str_0((s)); RETURN_STRINGL((s)->c, (s)->len, 0)
|
||||
#define RETURN_SMART_STR(str) smart_str_0((str)); RETURN_STR((str)->s)
|
||||
/* {{{ proto static string Locale::composeLocale($array)
|
||||
* Creates a locale by combining the parts of locale-ID passed
|
||||
* }}} */
|
||||
@ -1109,7 +1114,7 @@ PHP_FUNCTION(locale_parse)
|
||||
|
||||
grOffset = findOffset( LOC_GRANDFATHERED , loc_name );
|
||||
if( grOffset >= 0 ){
|
||||
add_assoc_string( return_value , LOC_GRANDFATHERED_LANG_TAG , loc_name);
|
||||
add_assoc_string( return_value , LOC_GRANDFATHERED_LANG_TAG, (char *)loc_name);
|
||||
}
|
||||
else{
|
||||
/* Not grandfathered */
|
||||
@ -1410,7 +1415,7 @@ static char* lookup_loc_range(const char* loc_range, HashTable* hash_arr, int ca
|
||||
int result = 0;
|
||||
|
||||
char* lang_tag = NULL;
|
||||
zval** ele_value = NULL;
|
||||
zval* ele_value = NULL;
|
||||
char** cur_arr = NULL;
|
||||
|
||||
char* cur_loc_range = NULL;
|
||||
@ -1420,29 +1425,22 @@ static char* lookup_loc_range(const char* loc_range, HashTable* hash_arr, int ca
|
||||
char* return_value = NULL;
|
||||
|
||||
cur_arr = ecalloc(zend_hash_num_elements(hash_arr)*2, sizeof(char *));
|
||||
ZEND_HASH_FOREACH_VAL(hash_arr, ele_value) {
|
||||
/* convert the array to lowercase , also replace hyphens with the underscore and store it in cur_arr */
|
||||
for(zend_hash_internal_pointer_reset(hash_arr);
|
||||
zend_hash_has_more_elements(hash_arr) == SUCCESS;
|
||||
zend_hash_move_forward(hash_arr)) {
|
||||
|
||||
if (zend_hash_get_current_data(hash_arr, (void**)&ele_value) == FAILURE) {
|
||||
/* Should never actually fail since the key is known to exist.*/
|
||||
continue;
|
||||
}
|
||||
if(Z_TYPE_PP(ele_value)!= IS_STRING) {
|
||||
if(Z_TYPE_P(ele_value)!= IS_STRING) {
|
||||
/* element value is not a string */
|
||||
intl_error_set(NULL, U_ILLEGAL_ARGUMENT_ERROR, "lookup_loc_range: locale array element is not a string", 0 TSRMLS_CC);
|
||||
LOOKUP_CLEAN_RETURN(NULL);
|
||||
}
|
||||
cur_arr[cur_arr_len*2] = estrndup(Z_STRVAL_PP(ele_value), Z_STRLEN_PP(ele_value));
|
||||
result = strToMatch(Z_STRVAL_PP(ele_value), cur_arr[cur_arr_len*2]);
|
||||
cur_arr[cur_arr_len*2] = estrndup(Z_STRVAL_P(ele_value), Z_STRLEN_P(ele_value));
|
||||
result = strToMatch(Z_STRVAL_P(ele_value), cur_arr[cur_arr_len*2]);
|
||||
if(result == 0) {
|
||||
intl_error_set(NULL, U_ILLEGAL_ARGUMENT_ERROR, "lookup_loc_range: unable to canonicalize lang_tag", 0 TSRMLS_CC);
|
||||
LOOKUP_CLEAN_RETURN(NULL);
|
||||
}
|
||||
cur_arr[cur_arr_len*2+1] = Z_STRVAL_PP(ele_value);
|
||||
cur_arr[cur_arr_len*2+1] = Z_STRVAL_P(ele_value);
|
||||
cur_arr_len++ ;
|
||||
} /* end of for */
|
||||
} ZEND_HASH_FOREACH_END(); /* end of for */
|
||||
|
||||
/* Canonicalize array elements */
|
||||
if(canonicalize) {
|
||||
@ -1560,7 +1558,9 @@ PHP_FUNCTION(locale_lookup)
|
||||
}
|
||||
}
|
||||
|
||||
RETVAL_STRINGL(result, strlen(result), 0);
|
||||
RETVAL_STRINGL(result, strlen(result));
|
||||
//????
|
||||
efree(result);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
@ -1597,7 +1597,7 @@ PHP_FUNCTION(locale_accept_from_http)
|
||||
if (len < 0 || outResult == ULOC_ACCEPT_FAILED) {
|
||||
RETURN_FALSE;
|
||||
}
|
||||
RETURN_STRINGL(resultLocale, len, 1);
|
||||
RETURN_STRINGL(resultLocale, len);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
|
@ -130,7 +130,7 @@ PHP_FUNCTION( msgfmt_get_error_code )
|
||||
RETURN_FALSE;
|
||||
}
|
||||
|
||||
mfo = (MessageFormatter_object *) zend_object_store_get_object( object TSRMLS_CC );
|
||||
mfo = Z_INTL_MESSAGEFORMATTER_P( object );
|
||||
|
||||
/* Return formatter's last error code. */
|
||||
RETURN_LONG( INTL_DATA_ERROR_CODE(mfo) );
|
||||
@ -144,7 +144,7 @@ PHP_FUNCTION( msgfmt_get_error_code )
|
||||
*/
|
||||
PHP_FUNCTION( msgfmt_get_error_message )
|
||||
{
|
||||
char* message = NULL;
|
||||
zend_string* message = NULL;
|
||||
zval* object = NULL;
|
||||
MessageFormatter_object* mfo = NULL;
|
||||
|
||||
@ -158,11 +158,11 @@ PHP_FUNCTION( msgfmt_get_error_message )
|
||||
RETURN_FALSE;
|
||||
}
|
||||
|
||||
mfo = (MessageFormatter_object *) zend_object_store_get_object( object TSRMLS_CC );
|
||||
mfo = Z_INTL_MESSAGEFORMATTER_P( object );
|
||||
|
||||
/* Return last error message. */
|
||||
message = intl_error_get_message( &mfo->mf_data.error TSRMLS_CC );
|
||||
RETURN_STRING( message, 0);
|
||||
RETURN_STR(message);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
|
@ -47,7 +47,7 @@ PHP_FUNCTION( msgfmt_get_pattern )
|
||||
MSG_FORMAT_METHOD_FETCH_OBJECT;
|
||||
|
||||
if(mfo->mf_data.orig_format) {
|
||||
RETURN_STRINGL(mfo->mf_data.orig_format, mfo->mf_data.orig_format_len, 1);
|
||||
RETURN_STRINGL(mfo->mf_data.orig_format, mfo->mf_data.orig_format_len);
|
||||
}
|
||||
|
||||
RETURN_FALSE;
|
||||
@ -137,7 +137,7 @@ PHP_FUNCTION( msgfmt_get_locale )
|
||||
MSG_FORMAT_METHOD_FETCH_OBJECT;
|
||||
|
||||
loc = (char *)umsg_getLocale(MSG_FORMAT_OBJECT(mfo));
|
||||
RETURN_STRING(loc, 1);
|
||||
RETURN_STRING(loc);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
|
@ -34,60 +34,50 @@ static zend_object_handlers MessageFormatter_handlers;
|
||||
*/
|
||||
|
||||
/* {{{ MessageFormatter_objects_dtor */
|
||||
static void MessageFormatter_object_dtor(void *object, zend_object_handle handle TSRMLS_DC )
|
||||
static void MessageFormatter_object_dtor(zend_object *object TSRMLS_DC )
|
||||
{
|
||||
zend_objects_destroy_object( object, handle TSRMLS_CC );
|
||||
zend_objects_destroy_object( object TSRMLS_CC );
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ MessageFormatter_objects_free */
|
||||
void MessageFormatter_object_free( zend_object *object TSRMLS_DC )
|
||||
{
|
||||
MessageFormatter_object* mfo = (MessageFormatter_object*)object;
|
||||
MessageFormatter_object* mfo = php_intl_messageformatter_fetch_object(object);
|
||||
|
||||
zend_object_std_dtor( &mfo->zo TSRMLS_CC );
|
||||
|
||||
msgformat_data_free( &mfo->mf_data TSRMLS_CC );
|
||||
|
||||
efree( mfo );
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ MessageFormatter_object_create */
|
||||
zend_object_value MessageFormatter_object_create(zend_class_entry *ce TSRMLS_DC)
|
||||
zend_object *MessageFormatter_object_create(zend_class_entry *ce TSRMLS_DC)
|
||||
{
|
||||
zend_object_value retval;
|
||||
MessageFormatter_object* intern;
|
||||
|
||||
intern = ecalloc( 1, sizeof(MessageFormatter_object) );
|
||||
intern = ecalloc( 1, sizeof(MessageFormatter_object) + sizeof(zval) * (ce->default_properties_count - 1));
|
||||
msgformat_data_init( &intern->mf_data TSRMLS_CC );
|
||||
zend_object_std_init( &intern->zo, ce TSRMLS_CC );
|
||||
object_properties_init(&intern->zo, ce);
|
||||
|
||||
retval.handle = zend_objects_store_put(
|
||||
intern,
|
||||
MessageFormatter_object_dtor,
|
||||
(zend_objects_free_object_storage_t)MessageFormatter_object_free,
|
||||
NULL TSRMLS_CC );
|
||||
intern->zo.handlers = &MessageFormatter_handlers;
|
||||
|
||||
retval.handlers = &MessageFormatter_handlers;
|
||||
|
||||
return retval;
|
||||
return &intern->zo;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ MessageFormatter_object_clone */
|
||||
zend_object_value MessageFormatter_object_clone(zval *object TSRMLS_DC)
|
||||
zend_object *MessageFormatter_object_clone(zval *object TSRMLS_DC)
|
||||
{
|
||||
zend_object_value new_obj_val;
|
||||
zend_object_handle handle = Z_OBJ_HANDLE_P(object);
|
||||
MessageFormatter_object *mfo, *new_mfo;
|
||||
zend_object *new_obj;
|
||||
|
||||
MSG_FORMAT_METHOD_FETCH_OBJECT_NO_CHECK;
|
||||
new_obj_val = MessageFormatter_ce_ptr->create_object(Z_OBJCE_P(object) TSRMLS_CC);
|
||||
new_mfo = (MessageFormatter_object *)zend_object_store_get_object_by_handle(new_obj_val.handle TSRMLS_CC);
|
||||
new_obj = MessageFormatter_ce_ptr->create_object(Z_OBJCE_P(object) TSRMLS_CC);
|
||||
new_mfo = php_intl_messageformatter_fetch_object(new_obj);
|
||||
/* clone standard parts */
|
||||
zend_objects_clone_members(&new_mfo->zo, new_obj_val, &mfo->zo, handle TSRMLS_CC);
|
||||
zend_objects_clone_members(&new_mfo->zo, &mfo->zo TSRMLS_CC);
|
||||
|
||||
/* clone formatter object */
|
||||
if (MSG_FORMAT_OBJECT(mfo) != NULL) {
|
||||
@ -102,7 +92,7 @@ zend_object_value MessageFormatter_object_clone(zval *object TSRMLS_DC)
|
||||
} else {
|
||||
zend_throw_exception_ex(NULL, 0 TSRMLS_CC, "Cannot clone unconstructed MessageFormatter");
|
||||
}
|
||||
return new_obj_val;
|
||||
return new_obj;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
@ -171,7 +161,11 @@ void msgformat_register_class( TSRMLS_D )
|
||||
|
||||
memcpy(&MessageFormatter_handlers, zend_get_std_object_handlers(),
|
||||
sizeof MessageFormatter_handlers);
|
||||
MessageFormatter_handlers.offset = XtOffsetOf(MessageFormatter_object, zo);
|
||||
MessageFormatter_handlers.clone_obj = MessageFormatter_object_clone;
|
||||
MessageFormatter_handlers.dtor_obj = MessageFormatter_object_dtor;
|
||||
MessageFormatter_handlers.free_obj = MessageFormatter_object_free;
|
||||
|
||||
|
||||
/* Declare 'MessageFormatter' class properties. */
|
||||
if( !MessageFormatter_ce_ptr )
|
||||
|
@ -27,17 +27,23 @@
|
||||
#include "msgformat_data.h"
|
||||
|
||||
typedef struct {
|
||||
zend_object zo;
|
||||
msgformat_data mf_data;
|
||||
zend_object zo;
|
||||
} MessageFormatter_object;
|
||||
|
||||
|
||||
static inline MessageFormatter_object *php_intl_messageformatter_fetch_object(zend_object *obj) {
|
||||
return (MessageFormatter_object *)((char*)(obj) - XtOffsetOf(MessageFormatter_object, zo));
|
||||
}
|
||||
#define Z_INTL_MESSAGEFORMATTER_P(zv) php_intl_messageformatter_fetch_object(Z_OBJ_P(zv))
|
||||
|
||||
void msgformat_register_class( TSRMLS_D );
|
||||
extern zend_class_entry *MessageFormatter_ce_ptr;
|
||||
|
||||
/* Auxiliary macros */
|
||||
|
||||
#define MSG_FORMAT_METHOD_INIT_VARS INTL_METHOD_INIT_VARS(MessageFormatter, mfo)
|
||||
#define MSG_FORMAT_METHOD_FETCH_OBJECT_NO_CHECK INTL_METHOD_FETCH_OBJECT(MessageFormatter, mfo)
|
||||
#define MSG_FORMAT_METHOD_FETCH_OBJECT_NO_CHECK INTL_METHOD_FETCH_OBJECT(INTL_MESSAGEFORMATTER, mfo)
|
||||
#define MSG_FORMAT_METHOD_FETCH_OBJECT \
|
||||
MSG_FORMAT_METHOD_FETCH_OBJECT_NO_CHECK; \
|
||||
if (MSG_FORMAT_OBJECT(mfo) == NULL) { \
|
||||
|
@ -43,8 +43,7 @@ static void msgfmt_do_format(MessageFormatter_object *mfo, zval *args, zval *ret
|
||||
|
||||
ALLOC_HASHTABLE(args_copy);
|
||||
zend_hash_init(args_copy, count, NULL, ZVAL_PTR_DTOR, 0);
|
||||
zend_hash_copy(args_copy, Z_ARRVAL_P(args), (copy_ctor_func_t)zval_add_ref,
|
||||
NULL, sizeof(zval*));
|
||||
zend_hash_copy(args_copy, Z_ARRVAL_P(args), (copy_ctor_func_t)zval_add_ref);
|
||||
|
||||
umsg_format_helper(mfo, args_copy, &formatted, &formatted_len TSRMLS_CC);
|
||||
|
||||
|
@ -108,8 +108,7 @@ static HashTable *umsg_get_numeric_types(MessageFormatter_object *mfo,
|
||||
|
||||
for (int i = 0; i < parts_count; i++) {
|
||||
const Formattable::Type t = types[i];
|
||||
if (zend_hash_index_update(ret, (ulong)i, (void*)&t, sizeof(t), NULL)
|
||||
== FAILURE) {
|
||||
if (zend_hash_index_update_mem(ret, (ulong)i, (void*)&t, sizeof(t)) == NULL) {
|
||||
intl_errors_set(&err, U_MEMORY_ALLOCATION_ERROR,
|
||||
"Write to argument types hash table failed", 0 TSRMLS_CC);
|
||||
break;
|
||||
@ -346,7 +345,7 @@ static void umsg_set_timezone(MessageFormatter_object *mfo,
|
||||
if (used_tz == NULL) {
|
||||
zval nullzv = zval_used_for_init,
|
||||
*zvptr = &nullzv;
|
||||
used_tz = timezone_process_timezone_argument(&zvptr, &err,
|
||||
used_tz = timezone_process_timezone_argument(zvptr, &err,
|
||||
"msgfmt_format" TSRMLS_CC);
|
||||
if (used_tz == NULL) {
|
||||
continue;
|
||||
@ -385,30 +384,22 @@ U_CFUNC void umsg_format_helper(MessageFormatter_object *mfo,
|
||||
farg_names.resize(arg_count);
|
||||
|
||||
int argNum = 0;
|
||||
HashPosition pos;
|
||||
zval **elem;
|
||||
zval *elem;
|
||||
|
||||
// Key related variables
|
||||
int key_type;
|
||||
char *str_index;
|
||||
uint str_len;
|
||||
zend_string *str_index;
|
||||
ulong num_index;
|
||||
|
||||
for (zend_hash_internal_pointer_reset_ex(args, &pos);
|
||||
U_SUCCESS(err.code) &&
|
||||
(key_type = zend_hash_get_current_key_ex(
|
||||
args, &str_index, &str_len, &num_index, 0, &pos),
|
||||
zend_hash_get_current_data_ex(args, (void **)&elem, &pos)
|
||||
) == SUCCESS;
|
||||
zend_hash_move_forward_ex(args, &pos), argNum++)
|
||||
{
|
||||
ZEND_HASH_FOREACH_KEY_VAL(args, num_index, str_index, elem) {
|
||||
Formattable& formattable = fargs[argNum];
|
||||
UnicodeString& key = farg_names[argNum];
|
||||
Formattable::Type argType = Formattable::kObject, //unknown
|
||||
*storedArgType = NULL;
|
||||
|
||||
if (!U_SUCCESS(err.code)) {
|
||||
break;
|
||||
}
|
||||
/* Process key and retrieve type */
|
||||
if (key_type == HASH_KEY_IS_LONG) {
|
||||
if (str_index == NULL) {
|
||||
/* includes case where index < 0 because it's exposed as unsigned */
|
||||
if (num_index > (ulong)INT32_MAX) {
|
||||
intl_errors_set(&err, U_ILLEGAL_ARGUMENT_ERROR,
|
||||
@ -420,21 +411,20 @@ U_CFUNC void umsg_format_helper(MessageFormatter_object *mfo,
|
||||
int32_t len = u_sprintf(temp, "%u", (uint32_t)num_index);
|
||||
key.append(temp, len);
|
||||
|
||||
zend_hash_index_find(types, (ulong)num_index, (void**)&storedArgType);
|
||||
storedArgType = (Formattable::Type*)zend_hash_index_find_ptr(types, (ulong)num_index);
|
||||
} else { //string; assumed to be in UTF-8
|
||||
intl_stringFromChar(key, str_index, str_len-1, &err.code);
|
||||
intl_stringFromChar(key, str_index->val, str_index->len, &err.code);
|
||||
|
||||
if (U_FAILURE(err.code)) {
|
||||
char *message;
|
||||
spprintf(&message, 0,
|
||||
"Invalid UTF-8 data in argument key: '%s'", str_index);
|
||||
"Invalid UTF-8 data in argument key: '%s'", str_index->val);
|
||||
intl_errors_set(&err, err.code, message, 1 TSRMLS_CC);
|
||||
efree(message);
|
||||
continue;
|
||||
}
|
||||
|
||||
zend_hash_find(types, (char*)key.getBuffer(), key.length(),
|
||||
(void**)&storedArgType);
|
||||
storedArgType = (Formattable::Type*)zend_hash_str_find_ptr(types, (char*)key.getBuffer(), key.length());
|
||||
}
|
||||
|
||||
if (storedArgType != NULL) {
|
||||
@ -457,12 +447,12 @@ U_CFUNC void umsg_format_helper(MessageFormatter_object *mfo,
|
||||
|
||||
UnicodeString *text = new UnicodeString();
|
||||
intl_stringFromChar(*text,
|
||||
Z_STRVAL_PP(elem), Z_STRLEN_PP(elem), &err.code);
|
||||
Z_STRVAL_P(elem), Z_STRLEN_P(elem), &err.code);
|
||||
|
||||
if (U_FAILURE(err.code)) {
|
||||
char *message;
|
||||
spprintf(&message, 0, "Invalid UTF-8 data in string argument: "
|
||||
"'%s'", Z_STRVAL_PP(elem));
|
||||
"'%s'", Z_STRVAL_P(elem));
|
||||
intl_errors_set(&err, err.code, message, 1 TSRMLS_CC);
|
||||
efree(message);
|
||||
delete text;
|
||||
@ -474,16 +464,16 @@ U_CFUNC void umsg_format_helper(MessageFormatter_object *mfo,
|
||||
case Formattable::kDouble:
|
||||
{
|
||||
double d;
|
||||
if (Z_TYPE_PP(elem) == IS_DOUBLE) {
|
||||
d = Z_DVAL_PP(elem);
|
||||
} else if (Z_TYPE_PP(elem) == IS_LONG) {
|
||||
d = (double)Z_LVAL_PP(elem);
|
||||
if (Z_TYPE_P(elem) == IS_DOUBLE) {
|
||||
d = Z_DVAL_P(elem);
|
||||
} else if (Z_TYPE_P(elem) == IS_LONG) {
|
||||
d = (double)Z_LVAL_P(elem);
|
||||
} else {
|
||||
SEPARATE_ZVAL_IF_NOT_REF(elem);
|
||||
convert_scalar_to_number(*elem TSRMLS_CC);
|
||||
d = (Z_TYPE_PP(elem) == IS_DOUBLE)
|
||||
? Z_DVAL_PP(elem)
|
||||
: (double)Z_LVAL_PP(elem);
|
||||
convert_scalar_to_number(elem TSRMLS_CC);
|
||||
d = (Z_TYPE_P(elem) == IS_DOUBLE)
|
||||
? Z_DVAL_P(elem)
|
||||
: (double)Z_LVAL_P(elem);
|
||||
}
|
||||
formattable.setDouble(d);
|
||||
break;
|
||||
@ -492,27 +482,27 @@ U_CFUNC void umsg_format_helper(MessageFormatter_object *mfo,
|
||||
{
|
||||
int32_t tInt32 = 0;
|
||||
retry_klong:
|
||||
if (Z_TYPE_PP(elem) == IS_DOUBLE) {
|
||||
if (Z_DVAL_PP(elem) > (double)INT32_MAX ||
|
||||
Z_DVAL_PP(elem) < (double)INT32_MIN) {
|
||||
if (Z_TYPE_P(elem) == IS_DOUBLE) {
|
||||
if (Z_DVAL_P(elem) > (double)INT32_MAX ||
|
||||
Z_DVAL_P(elem) < (double)INT32_MIN) {
|
||||
intl_errors_set(&err, U_ILLEGAL_ARGUMENT_ERROR,
|
||||
"Found PHP float with absolute value too large for "
|
||||
"32 bit integer argument", 0 TSRMLS_CC);
|
||||
} else {
|
||||
tInt32 = (int32_t)Z_DVAL_PP(elem);
|
||||
tInt32 = (int32_t)Z_DVAL_P(elem);
|
||||
}
|
||||
} else if (Z_TYPE_PP(elem) == IS_LONG) {
|
||||
if (Z_LVAL_PP(elem) > INT32_MAX ||
|
||||
Z_LVAL_PP(elem) < INT32_MIN) {
|
||||
} else if (Z_TYPE_P(elem) == IS_LONG) {
|
||||
if (Z_LVAL_P(elem) > INT32_MAX ||
|
||||
Z_LVAL_P(elem) < INT32_MIN) {
|
||||
intl_errors_set(&err, U_ILLEGAL_ARGUMENT_ERROR,
|
||||
"Found PHP integer with absolute value too large "
|
||||
"for 32 bit integer argument", 0 TSRMLS_CC);
|
||||
} else {
|
||||
tInt32 = (int32_t)Z_LVAL_PP(elem);
|
||||
tInt32 = (int32_t)Z_LVAL_P(elem);
|
||||
}
|
||||
} else {
|
||||
SEPARATE_ZVAL_IF_NOT_REF(elem);
|
||||
convert_scalar_to_number(*elem TSRMLS_CC);
|
||||
convert_scalar_to_number(elem TSRMLS_CC);
|
||||
goto retry_klong;
|
||||
}
|
||||
formattable.setLong(tInt32);
|
||||
@ -522,21 +512,21 @@ retry_klong:
|
||||
{
|
||||
int64_t tInt64 = 0;
|
||||
retry_kint64:
|
||||
if (Z_TYPE_PP(elem) == IS_DOUBLE) {
|
||||
if (Z_DVAL_PP(elem) > (double)U_INT64_MAX ||
|
||||
Z_DVAL_PP(elem) < (double)U_INT64_MIN) {
|
||||
if (Z_TYPE_P(elem) == IS_DOUBLE) {
|
||||
if (Z_DVAL_P(elem) > (double)U_INT64_MAX ||
|
||||
Z_DVAL_P(elem) < (double)U_INT64_MIN) {
|
||||
intl_errors_set(&err, U_ILLEGAL_ARGUMENT_ERROR,
|
||||
"Found PHP float with absolute value too large for "
|
||||
"64 bit integer argument", 0 TSRMLS_CC);
|
||||
} else {
|
||||
tInt64 = (int64_t)Z_DVAL_PP(elem);
|
||||
tInt64 = (int64_t)Z_DVAL_P(elem);
|
||||
}
|
||||
} else if (Z_TYPE_PP(elem) == IS_LONG) {
|
||||
} else if (Z_TYPE_P(elem) == IS_LONG) {
|
||||
/* assume long is not wider than 64 bits */
|
||||
tInt64 = (int64_t)Z_LVAL_PP(elem);
|
||||
tInt64 = (int64_t)Z_LVAL_P(elem);
|
||||
} else {
|
||||
SEPARATE_ZVAL_IF_NOT_REF(elem);
|
||||
convert_scalar_to_number(*elem TSRMLS_CC);
|
||||
convert_scalar_to_number(elem TSRMLS_CC);
|
||||
goto retry_kint64;
|
||||
}
|
||||
formattable.setInt64(tInt64);
|
||||
@ -544,7 +534,7 @@ retry_kint64:
|
||||
}
|
||||
case Formattable::kDate:
|
||||
{
|
||||
double dd = intl_zval_to_millis(*elem, &err, "msgfmt_format" TSRMLS_CC);
|
||||
double dd = intl_zval_to_millis(elem, &err, "msgfmt_format" TSRMLS_CC);
|
||||
if (U_FAILURE(err.code)) {
|
||||
char *message, *key_char;
|
||||
int key_len;
|
||||
@ -571,15 +561,16 @@ retry_kint64:
|
||||
/* We couldn't find any information about the argument in the pattern, this
|
||||
* means it's an extra argument. So convert it to a number if it's a number or
|
||||
* bool or null and to a string if it's anything else except arrays . */
|
||||
switch (Z_TYPE_PP(elem)) {
|
||||
switch (Z_TYPE_P(elem)) {
|
||||
case IS_DOUBLE:
|
||||
formattable.setDouble(Z_DVAL_PP(elem));
|
||||
formattable.setDouble(Z_DVAL_P(elem));
|
||||
break;
|
||||
case IS_BOOL:
|
||||
case IS_TRUE:
|
||||
case IS_FALSE:
|
||||
convert_to_long_ex(elem);
|
||||
/* Intentional fallthrough */
|
||||
case IS_LONG:
|
||||
formattable.setInt64((int64_t)Z_LVAL_PP(elem));
|
||||
formattable.setInt64((int64_t)Z_LVAL_P(elem));
|
||||
break;
|
||||
case IS_NULL:
|
||||
formattable.setInt64((int64_t)0);
|
||||
@ -605,7 +596,8 @@ retry_kint64:
|
||||
}
|
||||
}
|
||||
}
|
||||
} // visiting each argument
|
||||
argNum++;
|
||||
} ZEND_HASH_FOREACH_END(); // visiting each argument
|
||||
|
||||
if (U_FAILURE(err.code)) {
|
||||
return;
|
||||
@ -636,7 +628,7 @@ retry_kint64:
|
||||
|
||||
#define cleanup_zvals() for(int j=i;j>=0;j--) { zval_ptr_dtor((*args)+i); }
|
||||
|
||||
U_CFUNC void umsg_parse_helper(UMessageFormat *fmt, int *count, zval ***args, UChar *source, int source_len, UErrorCode *status)
|
||||
U_CFUNC void umsg_parse_helper(UMessageFormat *fmt, int *count, zval **args, UChar *source, int source_len, UErrorCode *status)
|
||||
{
|
||||
UnicodeString srcString(source, source_len);
|
||||
Formattable *fargs = ((const MessageFormat*)fmt)->parse(srcString, *count, *status);
|
||||
@ -645,7 +637,7 @@ U_CFUNC void umsg_parse_helper(UMessageFormat *fmt, int *count, zval ***args, UC
|
||||
return;
|
||||
}
|
||||
|
||||
*args = (zval **)safe_emalloc(*count, sizeof(zval *), 0);
|
||||
*args = (zval *)safe_emalloc(*count, sizeof(zval), 0);
|
||||
|
||||
// assign formattables to varargs
|
||||
for(int32_t i = 0; i < *count; i++) {
|
||||
@ -655,28 +647,26 @@ U_CFUNC void umsg_parse_helper(UMessageFormat *fmt, int *count, zval ***args, UC
|
||||
char *stmp;
|
||||
int stmp_len;
|
||||
|
||||
ALLOC_INIT_ZVAL((*args)[i]);
|
||||
|
||||
switch(fargs[i].getType()) {
|
||||
case Formattable::kDate:
|
||||
aDate = ((double)fargs[i].getDate())/U_MILLIS_PER_SECOND;
|
||||
ZVAL_DOUBLE((*args)[i], aDate);
|
||||
ZVAL_DOUBLE(&(*args)[i], aDate);
|
||||
break;
|
||||
|
||||
case Formattable::kDouble:
|
||||
ZVAL_DOUBLE((*args)[i], (double)fargs[i].getDouble());
|
||||
ZVAL_DOUBLE(&(*args)[i], (double)fargs[i].getDouble());
|
||||
break;
|
||||
|
||||
case Formattable::kLong:
|
||||
ZVAL_LONG((*args)[i], fargs[i].getLong());
|
||||
ZVAL_LONG(&(*args)[i], fargs[i].getLong());
|
||||
break;
|
||||
|
||||
case Formattable::kInt64:
|
||||
aInt64 = fargs[i].getInt64();
|
||||
if(aInt64 > LONG_MAX || aInt64 < -LONG_MAX) {
|
||||
ZVAL_DOUBLE((*args)[i], (double)aInt64);
|
||||
ZVAL_DOUBLE(&(*args)[i], (double)aInt64);
|
||||
} else {
|
||||
ZVAL_LONG((*args)[i], (long)aInt64);
|
||||
ZVAL_LONG(&(*args)[i], (long)aInt64);
|
||||
}
|
||||
break;
|
||||
|
||||
@ -687,7 +677,9 @@ U_CFUNC void umsg_parse_helper(UMessageFormat *fmt, int *count, zval ***args, UC
|
||||
cleanup_zvals();
|
||||
return;
|
||||
}
|
||||
ZVAL_STRINGL((*args)[i], stmp, stmp_len, 0);
|
||||
ZVAL_STRINGL(&(*args)[i], stmp, stmp_len);
|
||||
//???
|
||||
efree(stmp);
|
||||
break;
|
||||
|
||||
case Formattable::kObject:
|
||||
|
@ -20,6 +20,6 @@
|
||||
int32_t umsg_format_arg_count(UMessageFormat *fmt);
|
||||
void umsg_format_helper(MessageFormatter_object *mfo, HashTable *args,
|
||||
UChar **formatted, int *formatted_len TSRMLS_DC);
|
||||
void umsg_parse_helper(UMessageFormat *fmt, int *count, zval ***args,
|
||||
void umsg_parse_helper(UMessageFormat *fmt, int *count, zval **args,
|
||||
UChar *source, int source_len, UErrorCode *status);
|
||||
#endif // MSG_FORMAT_HELPERS_H
|
||||
|
@ -159,7 +159,9 @@ PHP_FUNCTION( normalizer_normalize )
|
||||
}
|
||||
|
||||
/* Return it. */
|
||||
RETVAL_STRINGL( ret_buf, ret_len, FALSE );
|
||||
RETVAL_STRINGL( ret_buf, ret_len );
|
||||
//???
|
||||
efree(ret_buf);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
|
@ -45,7 +45,7 @@ extern zend_module_entry intl_module_entry;
|
||||
#endif
|
||||
|
||||
ZEND_BEGIN_MODULE_GLOBALS(intl)
|
||||
zval* current_collator;
|
||||
zval current_collator;
|
||||
char* default_locale;
|
||||
collator_compare_func_t compare_func;
|
||||
UBreakIterator* grapheme_iterator;
|
||||
|
@ -47,7 +47,7 @@ void resourcebundle_extract_value( zval *return_value, ResourceBundle_object *so
|
||||
case URES_BINARY:
|
||||
bfield = ures_getBinary( source->child, &ilen, &INTL_DATA_ERROR_CODE(source) );
|
||||
INTL_METHOD_CHECK_STATUS(source, "Failed to retrieve binary value");
|
||||
ZVAL_STRINGL( return_value, (char *) bfield, ilen, 1 );
|
||||
ZVAL_STRINGL( return_value, (char *) bfield, ilen );
|
||||
break;
|
||||
|
||||
case URES_INT:
|
||||
|
@ -35,9 +35,9 @@ zend_class_entry *ResourceBundle_ce_ptr = NULL;
|
||||
static zend_object_handlers ResourceBundle_object_handlers;
|
||||
|
||||
/* {{{ ResourceBundle_object_dtor */
|
||||
static void ResourceBundle_object_destroy( void *object, zend_object_handle handle TSRMLS_DC )
|
||||
static void ResourceBundle_object_destroy( zend_object *object TSRMLS_DC )
|
||||
{
|
||||
ResourceBundle_object *rb = (ResourceBundle_object *) object;
|
||||
ResourceBundle_object *rb = php_intl_resourcebundle_fetch_object(object);
|
||||
|
||||
// only free local errors
|
||||
intl_error_reset( INTL_DATA_ERROR_P(rb) TSRMLS_CC );
|
||||
@ -50,29 +50,26 @@ static void ResourceBundle_object_destroy( void *object, zend_object_handle hand
|
||||
}
|
||||
|
||||
zend_object_std_dtor( object TSRMLS_CC );
|
||||
efree(object);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ ResourceBundle_object_create */
|
||||
static zend_object_value ResourceBundle_object_create( zend_class_entry *ce TSRMLS_DC )
|
||||
static zend_object *ResourceBundle_object_create( zend_class_entry *ce TSRMLS_DC )
|
||||
{
|
||||
zend_object_value retval;
|
||||
ResourceBundle_object *rb;
|
||||
|
||||
rb = ecalloc( 1, sizeof(ResourceBundle_object) );
|
||||
rb = ecalloc( 1, sizeof(ResourceBundle_object) + sizeof(zval) * (ce->default_properties_count - 1) );
|
||||
|
||||
zend_object_std_init( (zend_object *) rb, ce TSRMLS_CC );
|
||||
object_properties_init((zend_object *) rb, ce);
|
||||
zend_object_std_init( &rb->zend, ce TSRMLS_CC );
|
||||
object_properties_init( &rb->zend, ce);
|
||||
|
||||
intl_error_init( INTL_DATA_ERROR_P(rb) TSRMLS_CC );
|
||||
rb->me = NULL;
|
||||
rb->child = NULL;
|
||||
|
||||
retval.handlers = &ResourceBundle_object_handlers;
|
||||
retval.handle = zend_objects_store_put( rb, ResourceBundle_object_destroy, NULL, NULL TSRMLS_CC );
|
||||
rb->zend.handlers = &ResourceBundle_object_handlers;
|
||||
|
||||
return retval;
|
||||
return &rb->zend;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
@ -86,7 +83,7 @@ static void resourcebundle_ctor(INTERNAL_FUNCTION_PARAMETERS)
|
||||
zend_bool fallback = 1;
|
||||
|
||||
zval *object = return_value;
|
||||
ResourceBundle_object *rb = (ResourceBundle_object *) zend_object_store_get_object( object TSRMLS_CC);
|
||||
ResourceBundle_object *rb = Z_INTL_RESOURCEBUNDLE_P( object );
|
||||
|
||||
intl_error_reset( NULL TSRMLS_CC );
|
||||
|
||||
@ -367,7 +364,7 @@ PHP_FUNCTION( resourcebundle_get_error_code )
|
||||
RETURN_FALSE;
|
||||
}
|
||||
|
||||
rb = (ResourceBundle_object *) zend_object_store_get_object( object TSRMLS_CC );
|
||||
rb = Z_INTL_RESOURCEBUNDLE_P( object );
|
||||
|
||||
RETURN_LONG(INTL_DATA_ERROR_CODE(rb));
|
||||
}
|
||||
@ -384,7 +381,7 @@ ZEND_END_ARG_INFO()
|
||||
*/
|
||||
PHP_FUNCTION( resourcebundle_get_error_message )
|
||||
{
|
||||
char* message = NULL;
|
||||
zend_string* message = NULL;
|
||||
RESOURCEBUNDLE_METHOD_INIT_VARS;
|
||||
|
||||
if( zend_parse_method_parameters( ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O",
|
||||
@ -395,9 +392,9 @@ PHP_FUNCTION( resourcebundle_get_error_message )
|
||||
RETURN_FALSE;
|
||||
}
|
||||
|
||||
rb = (ResourceBundle_object *) zend_object_store_get_object( object TSRMLS_CC );
|
||||
message = (char *)intl_error_get_message(INTL_DATA_ERROR_P(rb) TSRMLS_CC);
|
||||
RETURN_STRING(message, 0);
|
||||
rb = Z_INTL_RESOURCEBUNDLE_P( object );
|
||||
message = intl_error_get_message(INTL_DATA_ERROR_P(rb) TSRMLS_CC);
|
||||
RETURN_STR(message);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
@ -437,7 +434,9 @@ void resourcebundle_register_class( TSRMLS_D )
|
||||
}
|
||||
|
||||
ResourceBundle_object_handlers = std_object_handlers;
|
||||
ResourceBundle_object_handlers.offset = XtOffsetOf(ResourceBundle_object, zend);
|
||||
ResourceBundle_object_handlers.clone_obj = NULL; /* ICU ResourceBundle has no clone implementation */
|
||||
ResourceBundle_object_handlers.dtor_obj = ResourceBundle_object_destroy;
|
||||
ResourceBundle_object_handlers.read_dimension = resourcebundle_array_get;
|
||||
ResourceBundle_object_handlers.count_elements = resourcebundle_array_count;
|
||||
|
||||
|
@ -25,17 +25,22 @@
|
||||
#include "intl_error.h"
|
||||
|
||||
typedef struct {
|
||||
zend_object zend;
|
||||
intl_error error;
|
||||
|
||||
UResourceBundle *me;
|
||||
UResourceBundle *child;
|
||||
zend_object zend;
|
||||
} ResourceBundle_object;
|
||||
|
||||
static inline ResourceBundle_object *php_intl_resourcebundle_fetch_object(zend_object *obj) {
|
||||
return (ResourceBundle_object *)((char*)(obj) - XtOffsetOf(ResourceBundle_object, zend));
|
||||
}
|
||||
#define Z_INTL_RESOURCEBUNDLE_P(zv) php_intl_resourcebundle_fetch_object(Z_OBJ_P(zv))
|
||||
|
||||
#define RESOURCEBUNDLE_METHOD_INIT_VARS INTL_METHOD_INIT_VARS(ResourceBundle, rb)
|
||||
#define RESOURCEBUNDLE_METHOD_FETCH_OBJECT_NO_CHECK INTL_METHOD_FETCH_OBJECT(ResourceBundle, rb)
|
||||
#define RESOURCEBUNDLE_METHOD_FETCH_OBJECT_NO_CHECK INTL_METHOD_FETCH_OBJECT(INTL_RESOURCEBUNDLE, rb)
|
||||
#define RESOURCEBUNDLE_METHOD_FETCH_OBJECT \
|
||||
INTL_METHOD_FETCH_OBJECT(ResourceBundle, rb); \
|
||||
INTL_METHOD_FETCH_OBJECT(INTL_RESOURCEBUNDLE, rb); \
|
||||
if (RESOURCEBUNDLE_OBJECT(rb) == NULL) { \
|
||||
intl_errors_set(&rb->error, U_ILLEGAL_ARGUMENT_ERROR, \
|
||||
"Found unconstructed ResourceBundle", 0 TSRMLS_CC); \
|
||||
|
@ -41,12 +41,11 @@ static void resourcebundle_iterator_read( ResourceBundle_iterator *iterator TSRM
|
||||
if (iterator->is_table) {
|
||||
iterator->currentkey = estrdup( ures_getKey( rb->child ) );
|
||||
}
|
||||
MAKE_STD_ZVAL( iterator->current );
|
||||
resourcebundle_extract_value( iterator->current, rb TSRMLS_CC );
|
||||
resourcebundle_extract_value( &iterator->current, rb TSRMLS_CC );
|
||||
}
|
||||
else {
|
||||
// zend_throw_exception( spl_ce_OutOfRangeException, "Running past end of ResourceBundle", 0 TSRMLS_CC);
|
||||
iterator->current = NULL;
|
||||
ZVAL_UNDEF(&iterator->current);
|
||||
}
|
||||
}
|
||||
/* }}} */
|
||||
@ -56,9 +55,9 @@ static void resourcebundle_iterator_invalidate( zend_object_iterator *iter TSRML
|
||||
{
|
||||
ResourceBundle_iterator *iterator = (ResourceBundle_iterator *) iter;
|
||||
|
||||
if (iterator->current) {
|
||||
if (!Z_ISUNDEF(iterator->current)) {
|
||||
zval_ptr_dtor( &iterator->current );
|
||||
iterator->current = NULL;
|
||||
ZVAL_UNDEF(&iterator->current);
|
||||
}
|
||||
if (iterator->currentkey) {
|
||||
efree( iterator->currentkey );
|
||||
@ -71,7 +70,7 @@ static void resourcebundle_iterator_invalidate( zend_object_iterator *iter TSRML
|
||||
static void resourcebundle_iterator_dtor( zend_object_iterator *iter TSRMLS_DC )
|
||||
{
|
||||
ResourceBundle_iterator *iterator = (ResourceBundle_iterator *) iter;
|
||||
zval *object = (zval *)iterator->intern.data;
|
||||
zval *object = &iterator->intern.data;
|
||||
|
||||
resourcebundle_iterator_invalidate( iter TSRMLS_CC );
|
||||
|
||||
@ -90,13 +89,13 @@ static int resourcebundle_iterator_has_more( zend_object_iterator *iter TSRMLS_D
|
||||
/* }}} */
|
||||
|
||||
/* {{{ resourcebundle_iterator_current */
|
||||
static void resourcebundle_iterator_current( zend_object_iterator *iter, zval ***data TSRMLS_DC )
|
||||
static zval *resourcebundle_iterator_current( zend_object_iterator *iter TSRMLS_DC )
|
||||
{
|
||||
ResourceBundle_iterator *iterator = (ResourceBundle_iterator *) iter;
|
||||
if (!iterator->current) {
|
||||
if (Z_ISUNDEF(iterator->current)) {
|
||||
resourcebundle_iterator_read( iterator TSRMLS_CC);
|
||||
}
|
||||
*data = &iterator->current;
|
||||
return &iterator->current;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
@ -105,12 +104,12 @@ static void resourcebundle_iterator_key( zend_object_iterator *iter, zval *key T
|
||||
{
|
||||
ResourceBundle_iterator *iterator = (ResourceBundle_iterator *) iter;
|
||||
|
||||
if (!iterator->current) {
|
||||
if (Z_ISUNDEF(iterator->current)) {
|
||||
resourcebundle_iterator_read( iterator TSRMLS_CC);
|
||||
}
|
||||
|
||||
if (iterator->is_table) {
|
||||
ZVAL_STRING(key, iterator->currentkey, 1);
|
||||
ZVAL_STRING(key, iterator->currentkey);
|
||||
} else {
|
||||
ZVAL_LONG(key, iterator->i);
|
||||
}
|
||||
@ -152,15 +151,15 @@ static zend_object_iterator_funcs resourcebundle_iterator_funcs = {
|
||||
/* {{{ resourcebundle_get_iterator */
|
||||
zend_object_iterator *resourcebundle_get_iterator( zend_class_entry *ce, zval *object, int byref TSRMLS_DC )
|
||||
{
|
||||
ResourceBundle_object *rb = (ResourceBundle_object *) zend_object_store_get_object( object TSRMLS_CC );
|
||||
ResourceBundle_object *rb = Z_INTL_RESOURCEBUNDLE_P(object );
|
||||
ResourceBundle_iterator *iterator = emalloc( sizeof( ResourceBundle_iterator ) );
|
||||
|
||||
if (byref) {
|
||||
php_error( E_ERROR, "ResourceBundle does not support writable iterators" );
|
||||
}
|
||||
|
||||
Z_ADDREF_P(object);
|
||||
iterator->intern.data = (void *) object;
|
||||
zend_iterator_init(&iterator->intern TSRMLS_CC);
|
||||
ZVAL_COPY(&iterator->intern.data, object);
|
||||
iterator->intern.funcs = &resourcebundle_iterator_funcs;
|
||||
|
||||
iterator->subject = rb;
|
||||
@ -171,7 +170,7 @@ zend_object_iterator *resourcebundle_get_iterator( zend_class_entry *ce, zval *o
|
||||
iterator->is_table = (ures_getType( rb->me ) == URES_TABLE);
|
||||
iterator->length = ures_getSize( rb->me );
|
||||
|
||||
iterator->current = NULL;
|
||||
ZVAL_UNDEF(&iterator->current);
|
||||
iterator->currentkey = NULL;
|
||||
iterator->i = 0;
|
||||
|
||||
|
@ -26,7 +26,7 @@ typedef struct {
|
||||
ResourceBundle_object *subject;
|
||||
zend_bool is_table;
|
||||
long length;
|
||||
zval *current;
|
||||
zval current;
|
||||
char *currentkey;
|
||||
long i;
|
||||
} ResourceBundle_iterator;
|
||||
|
@ -60,9 +60,8 @@ U_CFUNC void timezone_object_construct(const TimeZone *zone, zval *object, int o
|
||||
* Convert from TimeZone to DateTimeZone object */
|
||||
U_CFUNC zval *timezone_convert_to_datetimezone(const TimeZone *timeZone,
|
||||
intl_error *outside_error,
|
||||
const char *func TSRMLS_DC)
|
||||
const char *func, zval *ret TSRMLS_DC)
|
||||
{
|
||||
zval *ret = NULL;
|
||||
UnicodeString id;
|
||||
char *message = NULL;
|
||||
php_timezone_obj *tzobj;
|
||||
@ -76,9 +75,8 @@ U_CFUNC zval *timezone_convert_to_datetimezone(const TimeZone *timeZone,
|
||||
goto error;
|
||||
}
|
||||
|
||||
MAKE_STD_ZVAL(ret);
|
||||
object_init_ex(ret, php_date_get_timezone_ce());
|
||||
tzobj = (php_timezone_obj *)zend_objects_get_address(ret TSRMLS_CC);
|
||||
tzobj = Z_PHPTIMEZONE_P(ret);
|
||||
|
||||
if (id.compare(0, 3, UnicodeString("GMT", sizeof("GMT")-1, US_INV)) == 0) {
|
||||
/* The DateTimeZone constructor doesn't support offset time zones,
|
||||
@ -88,31 +86,35 @@ U_CFUNC zval *timezone_convert_to_datetimezone(const TimeZone *timeZone,
|
||||
//convert offset from milliseconds to minutes
|
||||
tzobj->tzi.utc_offset = -1 * timeZone->getRawOffset() / (60 * 1000);
|
||||
} else {
|
||||
char *str;
|
||||
int str_len;
|
||||
/* Call the constructor! */
|
||||
Z_TYPE(arg) = IS_STRING;
|
||||
if (intl_charFromString(id, &Z_STRVAL(arg), &Z_STRLEN(arg),
|
||||
&INTL_ERROR_CODE(*outside_error)) == FAILURE) {
|
||||
if (intl_charFromString(id, &str, &str_len, &INTL_ERROR_CODE(*outside_error)) == FAILURE) {
|
||||
spprintf(&message, 0, "%s: could not convert id to UTF-8", func);
|
||||
intl_errors_set(outside_error, INTL_ERROR_CODE(*outside_error),
|
||||
message, 1 TSRMLS_CC);
|
||||
goto error;
|
||||
}
|
||||
zend_call_method_with_1_params(&ret, NULL, NULL, "__construct",
|
||||
NULL, &arg);
|
||||
ZVAL_STRINGL(&arg, str, str_len);
|
||||
//???
|
||||
efree(str);
|
||||
zend_call_method_with_1_params(ret, NULL, NULL, "__construct", NULL, &arg);
|
||||
if (EG(exception)) {
|
||||
spprintf(&message, 0,
|
||||
"%s: DateTimeZone constructor threw exception", func);
|
||||
intl_errors_set(outside_error, U_ILLEGAL_ARGUMENT_ERROR,
|
||||
message, 1 TSRMLS_CC);
|
||||
zend_object_store_ctor_failed(ret TSRMLS_CC);
|
||||
zend_object_store_ctor_failed(Z_OBJ_P(ret) TSRMLS_CC);
|
||||
zval_ptr_dtor(&arg);
|
||||
goto error;
|
||||
}
|
||||
zval_ptr_dtor(&arg);
|
||||
}
|
||||
|
||||
if (0) {
|
||||
error:
|
||||
if (ret) {
|
||||
zval_ptr_dtor(&ret);
|
||||
zval_ptr_dtor(ret);
|
||||
}
|
||||
ret = NULL;
|
||||
}
|
||||
@ -120,34 +122,31 @@ error:
|
||||
if (message) {
|
||||
efree(message);
|
||||
}
|
||||
if (Z_TYPE(arg) == IS_STRING) {
|
||||
zval_dtor(&arg);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ timezone_process_timezone_argument
|
||||
* TimeZone argument processor. outside_error may be NULL (for static functions/constructors) */
|
||||
U_CFUNC TimeZone *timezone_process_timezone_argument(zval **zv_timezone,
|
||||
U_CFUNC TimeZone *timezone_process_timezone_argument(zval *zv_timezone,
|
||||
intl_error *outside_error,
|
||||
const char *func TSRMLS_DC)
|
||||
{
|
||||
zval local_zv_tz = zval_used_for_init,
|
||||
*local_zv_tz_p = &local_zv_tz;
|
||||
zval local_zv_tz = zval_used_for_init;
|
||||
char *message = NULL;
|
||||
TimeZone *timeZone;
|
||||
|
||||
if (zv_timezone == NULL || Z_TYPE_PP(zv_timezone) == IS_NULL) {
|
||||
if (zv_timezone == NULL || Z_TYPE_P(zv_timezone) == IS_NULL) {
|
||||
timelib_tzinfo *tzinfo = get_timezone_info(TSRMLS_C);
|
||||
ZVAL_STRING(&local_zv_tz, tzinfo->name, 0);
|
||||
zv_timezone = &local_zv_tz_p;
|
||||
ZVAL_STRING(&local_zv_tz, tzinfo->name);
|
||||
zv_timezone = &local_zv_tz;
|
||||
} else {
|
||||
ZVAL_UNDEF(&local_zv_tz);
|
||||
}
|
||||
|
||||
if (Z_TYPE_PP(zv_timezone) == IS_OBJECT &&
|
||||
instanceof_function(Z_OBJCE_PP(zv_timezone), TimeZone_ce_ptr TSRMLS_CC)) {
|
||||
TimeZone_object *to = (TimeZone_object*)zend_objects_get_address(
|
||||
*zv_timezone TSRMLS_CC);
|
||||
if (Z_TYPE_P(zv_timezone) == IS_OBJECT &&
|
||||
instanceof_function(Z_OBJCE_P(zv_timezone), TimeZone_ce_ptr TSRMLS_CC)) {
|
||||
TimeZone_object *to = Z_INTL_TIMEZONE_P(zv_timezone);
|
||||
if (to->utimezone == NULL) {
|
||||
spprintf(&message, 0, "%s: passed IntlTimeZone is not "
|
||||
"properly constructed", func);
|
||||
@ -155,6 +154,7 @@ U_CFUNC TimeZone *timezone_process_timezone_argument(zval **zv_timezone,
|
||||
intl_errors_set(outside_error, U_ILLEGAL_ARGUMENT_ERROR, message, 1 TSRMLS_CC);
|
||||
efree(message);
|
||||
}
|
||||
zval_dtor(&local_zv_tz);
|
||||
return NULL;
|
||||
}
|
||||
timeZone = to->utimezone->clone();
|
||||
@ -164,14 +164,15 @@ U_CFUNC TimeZone *timezone_process_timezone_argument(zval **zv_timezone,
|
||||
intl_errors_set(outside_error, U_MEMORY_ALLOCATION_ERROR, message, 1 TSRMLS_CC);
|
||||
efree(message);
|
||||
}
|
||||
zval_dtor(&local_zv_tz);
|
||||
return NULL;
|
||||
}
|
||||
} else if (Z_TYPE_PP(zv_timezone) == IS_OBJECT &&
|
||||
instanceof_function(Z_OBJCE_PP(zv_timezone), php_date_get_timezone_ce() TSRMLS_CC)) {
|
||||
} else if (Z_TYPE_P(zv_timezone) == IS_OBJECT &&
|
||||
instanceof_function(Z_OBJCE_P(zv_timezone), php_date_get_timezone_ce() TSRMLS_CC)) {
|
||||
|
||||
php_timezone_obj *tzobj = (php_timezone_obj *)zend_objects_get_address(
|
||||
*zv_timezone TSRMLS_CC);
|
||||
php_timezone_obj *tzobj = Z_PHPTIMEZONE_P(zv_timezone);
|
||||
|
||||
zval_dtor(&local_zv_tz);
|
||||
return timezone_convert_datetimezone(tzobj->type, tzobj, 0,
|
||||
outside_error, func TSRMLS_CC);
|
||||
} else {
|
||||
@ -179,7 +180,7 @@ U_CFUNC TimeZone *timezone_process_timezone_argument(zval **zv_timezone,
|
||||
gottenId;
|
||||
UErrorCode status = U_ZERO_ERROR; /* outside_error may be NULL */
|
||||
convert_to_string_ex(zv_timezone);
|
||||
if (intl_stringFromChar(id, Z_STRVAL_PP(zv_timezone), Z_STRLEN_PP(zv_timezone),
|
||||
if (intl_stringFromChar(id, Z_STRVAL_P(zv_timezone), Z_STRLEN_P(zv_timezone),
|
||||
&status) == FAILURE) {
|
||||
spprintf(&message, 0, "%s: Time zone identifier given is not a "
|
||||
"valid UTF-8 string", func);
|
||||
@ -187,6 +188,7 @@ U_CFUNC TimeZone *timezone_process_timezone_argument(zval **zv_timezone,
|
||||
intl_errors_set(outside_error, status, message, 1 TSRMLS_CC);
|
||||
efree(message);
|
||||
}
|
||||
zval_dtor(&local_zv_tz);
|
||||
return NULL;
|
||||
}
|
||||
timeZone = TimeZone::createTimeZone(id);
|
||||
@ -196,41 +198,43 @@ U_CFUNC TimeZone *timezone_process_timezone_argument(zval **zv_timezone,
|
||||
intl_errors_set(outside_error, U_MEMORY_ALLOCATION_ERROR, message, 1 TSRMLS_CC);
|
||||
efree(message);
|
||||
}
|
||||
zval_dtor(&local_zv_tz);
|
||||
return NULL;
|
||||
}
|
||||
if (timeZone->getID(gottenId) != id) {
|
||||
spprintf(&message, 0, "%s: no such time zone: '%s'",
|
||||
func, Z_STRVAL_PP(zv_timezone));
|
||||
func, Z_STRVAL_P(zv_timezone));
|
||||
if (message) {
|
||||
intl_errors_set(outside_error, U_ILLEGAL_ARGUMENT_ERROR, message, 1 TSRMLS_CC);
|
||||
efree(message);
|
||||
}
|
||||
zval_dtor(&local_zv_tz);
|
||||
delete timeZone;
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
zval_dtor(&local_zv_tz);
|
||||
|
||||
return timeZone;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ clone handler for TimeZone */
|
||||
static zend_object_value TimeZone_clone_obj(zval *object TSRMLS_DC)
|
||||
static zend_object *TimeZone_clone_obj(zval *object TSRMLS_DC)
|
||||
{
|
||||
TimeZone_object *to_orig,
|
||||
*to_new;
|
||||
zend_object_value ret_val;
|
||||
zend_object *ret_val;
|
||||
intl_error_reset(NULL TSRMLS_CC);
|
||||
|
||||
to_orig = (TimeZone_object*)zend_object_store_get_object(object TSRMLS_CC);
|
||||
to_orig = Z_INTL_TIMEZONE_P(object);
|
||||
intl_error_reset(TIMEZONE_ERROR_P(to_orig) TSRMLS_CC);
|
||||
|
||||
ret_val = TimeZone_ce_ptr->create_object(Z_OBJCE_P(object) TSRMLS_CC);
|
||||
to_new = (TimeZone_object*)zend_object_store_get_object_by_handle(
|
||||
ret_val.handle TSRMLS_CC);
|
||||
to_new = php_intl_timezone_fetch_object(ret_val);
|
||||
|
||||
zend_objects_clone_members(&to_new->zo, ret_val,
|
||||
&to_orig->zo, Z_OBJ_HANDLE_P(object) TSRMLS_CC);
|
||||
zend_objects_clone_members(&to_new->zo, &to_orig->zo TSRMLS_CC);
|
||||
|
||||
if (to_orig->utimezone != NULL) {
|
||||
TimeZone *newTimeZone;
|
||||
@ -238,14 +242,14 @@ static zend_object_value TimeZone_clone_obj(zval *object TSRMLS_DC)
|
||||
newTimeZone = to_orig->utimezone->clone();
|
||||
to_new->should_delete = 1;
|
||||
if (!newTimeZone) {
|
||||
char *err_msg;
|
||||
zend_string *err_msg;
|
||||
intl_errors_set_code(TIMEZONE_ERROR_P(to_orig),
|
||||
U_MEMORY_ALLOCATION_ERROR TSRMLS_CC);
|
||||
intl_errors_set_custom_msg(TIMEZONE_ERROR_P(to_orig),
|
||||
"Could not clone IntlTimeZone", 0 TSRMLS_CC);
|
||||
err_msg = intl_error_get_message(TIMEZONE_ERROR_P(to_orig) TSRMLS_CC);
|
||||
zend_throw_exception(NULL, err_msg, 0 TSRMLS_CC);
|
||||
efree(err_msg);
|
||||
zend_throw_exception(NULL, err_msg->val, 0 TSRMLS_CC);
|
||||
STR_FREE(err_msg);
|
||||
} else {
|
||||
to_new->utimezone = newTimeZone;
|
||||
}
|
||||
@ -263,8 +267,8 @@ static int TimeZone_compare_objects(zval *object1, zval *object2 TSRMLS_DC)
|
||||
{
|
||||
TimeZone_object *to1,
|
||||
*to2;
|
||||
to1 = (TimeZone_object*)zend_object_store_get_object(object1 TSRMLS_CC);
|
||||
to2 = (TimeZone_object*)zend_object_store_get_object(object2 TSRMLS_CC);
|
||||
to1 = Z_INTL_TIMEZONE_P(object1);
|
||||
to2 = Z_INTL_TIMEZONE_P(object2);
|
||||
|
||||
if (to1->utimezone == NULL || to2->utimezone == NULL) {
|
||||
zend_throw_exception(NULL, "Comparison with at least one unconstructed "
|
||||
@ -295,7 +299,7 @@ static HashTable *TimeZone_get_debug_info(zval *object, int *is_temp TSRMLS_DC)
|
||||
|
||||
array_init_size(&zv, 4);
|
||||
|
||||
to = (TimeZone_object*)zend_object_store_get_object(object TSRMLS_CC);
|
||||
to = Z_INTL_TIMEZONE_P(object);
|
||||
tz = to->utimezone;
|
||||
|
||||
if (tz == NULL) {
|
||||
@ -342,17 +346,16 @@ static void TimeZone_object_init(TimeZone_object *to TSRMLS_DC)
|
||||
/* }}} */
|
||||
|
||||
/* {{{ TimeZone_objects_dtor */
|
||||
static void TimeZone_objects_dtor(zend_object *object,
|
||||
zend_object_handle handle TSRMLS_DC)
|
||||
static void TimeZone_objects_dtor(zend_object *object TSRMLS_DC)
|
||||
{
|
||||
zend_objects_destroy_object(object, handle TSRMLS_CC);
|
||||
zend_objects_destroy_object(object TSRMLS_CC);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ TimeZone_objects_free */
|
||||
static void TimeZone_objects_free(zend_object *object TSRMLS_DC)
|
||||
{
|
||||
TimeZone_object* to = (TimeZone_object*) object;
|
||||
TimeZone_object* to = php_intl_timezone_fetch_object(object);
|
||||
|
||||
if (to->utimezone && to->should_delete) {
|
||||
delete to->utimezone;
|
||||
@ -361,37 +364,23 @@ static void TimeZone_objects_free(zend_object *object TSRMLS_DC)
|
||||
intl_error_reset(TIMEZONE_ERROR_P(to) TSRMLS_CC);
|
||||
|
||||
zend_object_std_dtor(&to->zo TSRMLS_CC);
|
||||
|
||||
efree(to);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ TimeZone_object_create */
|
||||
static zend_object_value TimeZone_object_create(zend_class_entry *ce TSRMLS_DC)
|
||||
static zend_object *TimeZone_object_create(zend_class_entry *ce TSRMLS_DC)
|
||||
{
|
||||
zend_object_value retval;
|
||||
TimeZone_object* intern;
|
||||
|
||||
intern = (TimeZone_object*)ecalloc(1, sizeof(TimeZone_object));
|
||||
intern = (TimeZone_object*)ecalloc(1, sizeof(TimeZone_object) + sizeof(zval) * (ce->default_properties_count - 1));
|
||||
|
||||
zend_object_std_init(&intern->zo, ce TSRMLS_CC);
|
||||
#if PHP_VERSION_ID < 50399
|
||||
zend_hash_copy(intern->zo.properties, &(ce->default_properties),
|
||||
(copy_ctor_func_t) zval_add_ref, NULL, sizeof(zval*));
|
||||
#else
|
||||
object_properties_init((zend_object*) intern, ce);
|
||||
#endif
|
||||
TimeZone_object_init(intern TSRMLS_CC);
|
||||
|
||||
retval.handle = zend_objects_store_put(
|
||||
intern,
|
||||
(zend_objects_store_dtor_t) TimeZone_objects_dtor,
|
||||
(zend_objects_free_object_storage_t) TimeZone_objects_free,
|
||||
NULL TSRMLS_CC);
|
||||
intern->zo.handlers = &TimeZone_handlers;
|
||||
|
||||
retval.handlers = &TimeZone_handlers;
|
||||
|
||||
return retval;
|
||||
return &intern->zo;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
@ -509,9 +498,13 @@ U_CFUNC void timezone_register_IntlTimeZone_class(TSRMLS_D)
|
||||
|
||||
memcpy(&TimeZone_handlers, zend_get_std_object_handlers(),
|
||||
sizeof TimeZone_handlers);
|
||||
TimeZone_handlers.offset = XtOffsetOf(TimeZone_object, zo);
|
||||
TimeZone_handlers.clone_obj = TimeZone_clone_obj;
|
||||
TimeZone_handlers.compare_objects = TimeZone_compare_objects;
|
||||
TimeZone_handlers.get_debug_info = TimeZone_get_debug_info;
|
||||
TimeZone_handlers.dtor_obj = TimeZone_objects_dtor;
|
||||
TimeZone_handlers.free_obj = TimeZone_objects_free;
|
||||
|
||||
|
||||
/* Declare 'IntlTimeZone' class constants */
|
||||
#define TIMEZONE_DECL_LONG_CONST(name, val) \
|
||||
|
@ -32,8 +32,6 @@ typedef void TimeZone;
|
||||
#endif
|
||||
|
||||
typedef struct {
|
||||
zend_object zo;
|
||||
|
||||
// error handling
|
||||
intl_error err;
|
||||
|
||||
@ -42,8 +40,15 @@ typedef struct {
|
||||
|
||||
//whether to delete the timezone on object free
|
||||
zend_bool should_delete;
|
||||
|
||||
zend_object zo;
|
||||
} TimeZone_object;
|
||||
|
||||
static inline TimeZone_object *php_intl_timezone_fetch_object(zend_object *obj) {
|
||||
return (TimeZone_object *)((char*)(obj) - XtOffsetOf(TimeZone_object, zo));
|
||||
}
|
||||
#define Z_INTL_TIMEZONE_P(zv) php_intl_timezone_fetch_object(Z_OBJ_P(zv))
|
||||
|
||||
#define TIMEZONE_ERROR(to) (to)->err
|
||||
#define TIMEZONE_ERROR_P(to) &(TIMEZONE_ERROR(to))
|
||||
|
||||
@ -51,7 +56,7 @@ typedef struct {
|
||||
#define TIMEZONE_ERROR_CODE_P(co) &(INTL_ERROR_CODE(TIMEZONE_ERROR(to)))
|
||||
|
||||
#define TIMEZONE_METHOD_INIT_VARS INTL_METHOD_INIT_VARS(TimeZone, to)
|
||||
#define TIMEZONE_METHOD_FETCH_OBJECT_NO_CHECK INTL_METHOD_FETCH_OBJECT(TimeZone, to)
|
||||
#define TIMEZONE_METHOD_FETCH_OBJECT_NO_CHECK INTL_METHOD_FETCH_OBJECT(INTL_TIMEZONE, to)
|
||||
#define TIMEZONE_METHOD_FETCH_OBJECT\
|
||||
TIMEZONE_METHOD_FETCH_OBJECT_NO_CHECK; \
|
||||
if (to->utimezone == NULL) { \
|
||||
@ -59,8 +64,8 @@ typedef struct {
|
||||
RETURN_FALSE; \
|
||||
}
|
||||
|
||||
zval *timezone_convert_to_datetimezone(const TimeZone *timeZone, intl_error *outside_error, const char *func TSRMLS_DC);
|
||||
TimeZone *timezone_process_timezone_argument(zval **zv_timezone, intl_error *error, const char *func TSRMLS_DC);
|
||||
zval *timezone_convert_to_datetimezone(const TimeZone *timeZone, intl_error *outside_error, const char *func, zval *ret TSRMLS_DC);
|
||||
TimeZone *timezone_process_timezone_argument(zval *zv_timezone, intl_error *error, const char *func TSRMLS_DC);
|
||||
|
||||
void timezone_object_construct(const TimeZone *zone, zval *object, int owned TSRMLS_DC);
|
||||
|
||||
|
@ -84,7 +84,7 @@ U_CFUNC PHP_FUNCTION(intltz_from_date_time_zone)
|
||||
RETURN_NULL();
|
||||
}
|
||||
|
||||
tzobj = (php_timezone_obj *)zend_objects_get_address(zv_timezone TSRMLS_CC);
|
||||
tzobj = Z_PHPTIMEZONE_P(zv_timezone);
|
||||
if (!tzobj->initialized) {
|
||||
intl_error_set(NULL, U_ILLEGAL_ARGUMENT_ERROR,
|
||||
"intltz_from_date_time_zone: DateTimeZone object is unconstructed",
|
||||
@ -145,54 +145,52 @@ U_CFUNC PHP_FUNCTION(intltz_get_unknown)
|
||||
|
||||
U_CFUNC PHP_FUNCTION(intltz_create_enumeration)
|
||||
{
|
||||
zval **arg = NULL;
|
||||
zval *arg = NULL;
|
||||
StringEnumeration *se = NULL;
|
||||
intl_error_reset(NULL TSRMLS_CC);
|
||||
|
||||
/* double indirection to have the zend engine destroy the new zval that
|
||||
* results from separation */
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|Z", &arg) == FAILURE) {
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|z", &arg) == FAILURE) {
|
||||
intl_error_set(NULL, U_ILLEGAL_ARGUMENT_ERROR,
|
||||
"intltz_create_enumeration: bad arguments", 0 TSRMLS_CC);
|
||||
RETURN_FALSE;
|
||||
}
|
||||
|
||||
if (arg == NULL || Z_TYPE_PP(arg) == IS_NULL) {
|
||||
if (arg == NULL || Z_TYPE_P(arg) == IS_NULL) {
|
||||
se = TimeZone::createEnumeration();
|
||||
} else if (Z_TYPE_PP(arg) == IS_LONG) {
|
||||
} else if (Z_TYPE_P(arg) == IS_LONG) {
|
||||
int_offset:
|
||||
if (Z_LVAL_PP(arg) < (long)INT32_MIN ||
|
||||
Z_LVAL_PP(arg) > (long)INT32_MAX) {
|
||||
if (Z_LVAL_P(arg) < (long)INT32_MIN ||
|
||||
Z_LVAL_P(arg) > (long)INT32_MAX) {
|
||||
intl_error_set(NULL, U_ILLEGAL_ARGUMENT_ERROR,
|
||||
"intltz_create_enumeration: value is out of range", 0 TSRMLS_CC);
|
||||
RETURN_FALSE;
|
||||
} else {
|
||||
se = TimeZone::createEnumeration((int32_t) Z_LVAL_PP(arg));
|
||||
se = TimeZone::createEnumeration((int32_t) Z_LVAL_P(arg));
|
||||
}
|
||||
} else if (Z_TYPE_PP(arg) == IS_DOUBLE) {
|
||||
} else if (Z_TYPE_P(arg) == IS_DOUBLE) {
|
||||
double_offset:
|
||||
convert_to_long_ex(arg);
|
||||
goto int_offset;
|
||||
} else if (Z_TYPE_PP(arg) == IS_OBJECT || Z_TYPE_PP(arg) == IS_STRING) {
|
||||
} else if (Z_TYPE_P(arg) == IS_OBJECT || Z_TYPE_P(arg) == IS_STRING) {
|
||||
long lval;
|
||||
double dval;
|
||||
convert_to_string_ex(arg);
|
||||
switch (is_numeric_string(Z_STRVAL_PP(arg), Z_STRLEN_PP(arg), &lval, &dval, 0)) {
|
||||
switch (is_numeric_string(Z_STRVAL_P(arg), Z_STRLEN_P(arg), &lval, &dval, 0)) {
|
||||
case IS_DOUBLE:
|
||||
SEPARATE_ZVAL(arg);
|
||||
zval_dtor(*arg);
|
||||
Z_TYPE_PP(arg) = IS_DOUBLE;
|
||||
Z_DVAL_PP(arg) = dval;
|
||||
zval_dtor(arg);
|
||||
ZVAL_DOUBLE(arg, dval);
|
||||
goto double_offset;
|
||||
case IS_LONG:
|
||||
SEPARATE_ZVAL(arg);
|
||||
zval_dtor(*arg);
|
||||
Z_TYPE_PP(arg) = IS_LONG;
|
||||
Z_LVAL_PP(arg) = lval;
|
||||
zval_dtor(arg);
|
||||
ZVAL_LONG(arg, lval);
|
||||
goto int_offset;
|
||||
}
|
||||
/* else call string version */
|
||||
se = TimeZone::createEnumeration(Z_STRVAL_PP(arg));
|
||||
se = TimeZone::createEnumeration(Z_STRVAL_P(arg));
|
||||
} else {
|
||||
intl_error_set(NULL, U_ILLEGAL_ARGUMENT_ERROR,
|
||||
"intltz_create_enumeration: invalid argument type", 0 TSRMLS_CC);
|
||||
@ -317,11 +315,14 @@ U_CFUNC PHP_FUNCTION(intltz_get_canonical_id)
|
||||
TimeZone::getCanonicalID(id, result, isSystemID, status);
|
||||
INTL_CHECK_STATUS(status, "intltz_get_canonical_id: error obtaining canonical ID");
|
||||
|
||||
intl_convert_utf16_to_utf8(&Z_STRVAL_P(return_value), &Z_STRLEN_P(return_value),
|
||||
result.getBuffer(), result.length(), &status);
|
||||
char *str;
|
||||
int str_len;
|
||||
intl_convert_utf16_to_utf8(&str, &str_len, result.getBuffer(), result.length(), &status);
|
||||
INTL_CHECK_STATUS(status,
|
||||
"intltz_get_canonical_id: could not convert time zone id to UTF-16");
|
||||
Z_TYPE_P(return_value) = IS_STRING;
|
||||
RETVAL_STRINGL(str, str_len);
|
||||
//????
|
||||
efree(str);
|
||||
|
||||
if (is_systemid) { /* by-ref argument passed */
|
||||
zval_dtor(is_systemid);
|
||||
@ -355,7 +356,7 @@ U_CFUNC PHP_FUNCTION(intltz_get_region)
|
||||
int32_t region_len = TimeZone::getRegion(id, outbuf, sizeof(outbuf), status);
|
||||
INTL_CHECK_STATUS(status, "intltz_get_region: Error obtaining region");
|
||||
|
||||
RETURN_STRINGL(outbuf, region_len, 1);
|
||||
RETURN_STRINGL(outbuf, region_len);
|
||||
}
|
||||
#endif
|
||||
|
||||
@ -374,7 +375,7 @@ U_CFUNC PHP_FUNCTION(intltz_get_tz_data_version)
|
||||
INTL_CHECK_STATUS(status, "intltz_get_tz_data_version: "
|
||||
"Error obtaining time zone data version");
|
||||
|
||||
RETURN_STRING(res, 1);
|
||||
RETURN_STRING(res);
|
||||
}
|
||||
|
||||
U_CFUNC PHP_FUNCTION(intltz_get_equivalent_id)
|
||||
@ -401,11 +402,15 @@ U_CFUNC PHP_FUNCTION(intltz_get_equivalent_id)
|
||||
}
|
||||
|
||||
const UnicodeString result = TimeZone::getEquivalentID(id, (int32_t)index);
|
||||
intl_convert_utf16_to_utf8(&Z_STRVAL_P(return_value), &Z_STRLEN_P(return_value),
|
||||
result.getBuffer(), result.length(), &status);
|
||||
char *str;
|
||||
int str_len;
|
||||
|
||||
intl_convert_utf16_to_utf8(&str, &str_len, result.getBuffer(), result.length(), &status);
|
||||
INTL_CHECK_STATUS(status, "intltz_get_equivalent_id: "
|
||||
"could not convert resulting time zone id to UTF-16");
|
||||
Z_TYPE_P(return_value) = IS_STRING;
|
||||
RETVAL_STRINGL(str, str_len);
|
||||
//????
|
||||
efree(str);
|
||||
}
|
||||
|
||||
U_CFUNC PHP_FUNCTION(intltz_get_id)
|
||||
@ -431,7 +436,9 @@ U_CFUNC PHP_FUNCTION(intltz_get_id)
|
||||
id_us.getBuffer(), id_us.length(), TIMEZONE_ERROR_CODE_P(to));
|
||||
INTL_METHOD_CHECK_STATUS(to, "intltz_get_id: Could not convert id to UTF-8");
|
||||
|
||||
RETURN_STRINGL(id, id_len, 0);
|
||||
RETURN_STRINGL(id, id_len);
|
||||
//???
|
||||
efree(id);
|
||||
}
|
||||
|
||||
U_CFUNC PHP_FUNCTION(intltz_use_daylight_time)
|
||||
@ -513,7 +520,7 @@ U_CFUNC PHP_FUNCTION(intltz_has_same_rules)
|
||||
RETURN_FALSE;
|
||||
}
|
||||
TIMEZONE_METHOD_FETCH_OBJECT;
|
||||
other_to = (TimeZone_object *) zend_object_store_get_object(other_object TSRMLS_CC);
|
||||
other_to = Z_INTL_TIMEZONE_P(other_object);
|
||||
if (other_to->utimezone == NULL) {
|
||||
intl_errors_set(&to->err, U_ILLEGAL_ARGUMENT_ERROR,
|
||||
"intltz_has_same_rules: The second IntlTimeZone is unconstructed", 0 TSRMLS_CC);
|
||||
@ -569,12 +576,15 @@ U_CFUNC PHP_FUNCTION(intltz_get_display_name)
|
||||
to->utimezone->getDisplayName((UBool)daylight, (TimeZone::EDisplayType)display_type,
|
||||
Locale::createFromName(locale_str), result);
|
||||
|
||||
intl_convert_utf16_to_utf8(&Z_STRVAL_P(return_value), &Z_STRLEN_P(return_value),
|
||||
result.getBuffer(), result.length(), TIMEZONE_ERROR_CODE_P(to));
|
||||
char *str;
|
||||
int str_len;
|
||||
intl_convert_utf16_to_utf8(&str, &str_len, result.getBuffer(), result.length(), TIMEZONE_ERROR_CODE_P(to));
|
||||
INTL_METHOD_CHECK_STATUS(to, "intltz_get_display_name: "
|
||||
"could not convert resulting time zone id to UTF-16");
|
||||
|
||||
Z_TYPE_P(return_value) = IS_STRING;
|
||||
RETVAL_STRINGL(str, str_len);
|
||||
//????
|
||||
efree(str);
|
||||
}
|
||||
|
||||
U_CFUNC PHP_FUNCTION(intltz_get_dst_savings)
|
||||
@ -595,6 +605,7 @@ U_CFUNC PHP_FUNCTION(intltz_get_dst_savings)
|
||||
|
||||
U_CFUNC PHP_FUNCTION(intltz_to_date_time_zone)
|
||||
{
|
||||
zval tmp;
|
||||
TIMEZONE_METHOD_INIT_VARS;
|
||||
|
||||
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(),
|
||||
@ -607,7 +618,7 @@ U_CFUNC PHP_FUNCTION(intltz_to_date_time_zone)
|
||||
TIMEZONE_METHOD_FETCH_OBJECT;
|
||||
|
||||
zval *ret = timezone_convert_to_datetimezone(to->utimezone,
|
||||
&TIMEZONE_ERROR(to), "intltz_to_date_time_zone" TSRMLS_CC);
|
||||
&TIMEZONE_ERROR(to), "intltz_to_date_time_zone", &tmp TSRMLS_CC);
|
||||
|
||||
if (ret) {
|
||||
RETURN_ZVAL(ret, 1, 1);
|
||||
@ -628,7 +639,7 @@ U_CFUNC PHP_FUNCTION(intltz_get_error_code)
|
||||
}
|
||||
|
||||
/* Fetch the object (without resetting its last error code ). */
|
||||
to = (TimeZone_object*)zend_object_store_get_object(object TSRMLS_CC);
|
||||
to = Z_INTL_TIMEZONE_P(object);
|
||||
if (to == NULL)
|
||||
RETURN_FALSE;
|
||||
|
||||
@ -637,7 +648,7 @@ U_CFUNC PHP_FUNCTION(intltz_get_error_code)
|
||||
|
||||
U_CFUNC PHP_FUNCTION(intltz_get_error_message)
|
||||
{
|
||||
const char* message = NULL;
|
||||
zend_string* message = NULL;
|
||||
TIMEZONE_METHOD_INIT_VARS
|
||||
|
||||
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O",
|
||||
@ -649,11 +660,11 @@ U_CFUNC PHP_FUNCTION(intltz_get_error_message)
|
||||
|
||||
|
||||
/* Fetch the object (without resetting its last error code ). */
|
||||
to = (TimeZone_object*)zend_object_store_get_object(object TSRMLS_CC);
|
||||
to = Z_INTL_TIMEZONE_P(object);
|
||||
if (to == NULL)
|
||||
RETURN_FALSE;
|
||||
|
||||
/* Return last error message. */
|
||||
message = intl_error_get_message(TIMEZONE_ERROR_P(to) TSRMLS_CC);
|
||||
RETURN_STRING(message, 0);
|
||||
RETURN_STR(message);
|
||||
}
|
||||
|
@ -98,53 +98,38 @@ static void transliterator_object_destroy( Transliterator_object* to TSRMLS_DC )
|
||||
|
||||
/* {{{ Transliterator_objects_dtor */
|
||||
static void Transliterator_objects_dtor(
|
||||
void *object,
|
||||
zend_object_handle handle TSRMLS_DC )
|
||||
zend_object *object TSRMLS_DC )
|
||||
{
|
||||
zend_objects_destroy_object( object, handle TSRMLS_CC );
|
||||
zend_objects_destroy_object( object TSRMLS_CC );
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ Transliterator_objects_free */
|
||||
static void Transliterator_objects_free( zend_object *object TSRMLS_DC )
|
||||
{
|
||||
Transliterator_object* to = (Transliterator_object*) object;
|
||||
Transliterator_object* to = php_intl_transliterator_fetch_object(object);
|
||||
|
||||
zend_object_std_dtor( &to->zo TSRMLS_CC );
|
||||
|
||||
transliterator_object_destroy( to TSRMLS_CC );
|
||||
|
||||
efree( to );
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ Transliterator_object_create */
|
||||
static zend_object_value Transliterator_object_create(
|
||||
static zend_object *Transliterator_object_create(
|
||||
zend_class_entry *ce TSRMLS_DC )
|
||||
{
|
||||
zend_object_value retval;
|
||||
Transliterator_object* intern;
|
||||
|
||||
intern = ecalloc( 1, sizeof( Transliterator_object ) );
|
||||
intern = ecalloc( 1, sizeof( Transliterator_object ) + sizeof(zval) * (ce->default_properties_count - 1));
|
||||
|
||||
zend_object_std_init( &intern->zo, ce TSRMLS_CC );
|
||||
#if PHP_VERSION_ID < 50399
|
||||
zend_hash_copy( intern->zo.properties, &(ce->default_properties ),
|
||||
(copy_ctor_func_t) zval_add_ref, NULL, sizeof( zval* ) );
|
||||
#else
|
||||
object_properties_init( (zend_object*) intern, ce );
|
||||
#endif
|
||||
transliterator_object_init( intern TSRMLS_CC );
|
||||
|
||||
retval.handle = zend_objects_store_put(
|
||||
intern,
|
||||
Transliterator_objects_dtor,
|
||||
(zend_objects_free_object_storage_t) Transliterator_objects_free,
|
||||
NULL TSRMLS_CC );
|
||||
intern->zo.handlers = &Transliterator_handlers;
|
||||
|
||||
retval.handlers = &Transliterator_handlers;
|
||||
|
||||
return retval;
|
||||
return &intern->zo;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
@ -153,20 +138,19 @@ static zend_object_value Transliterator_object_create(
|
||||
*/
|
||||
|
||||
/* {{{ clone handler for Transliterator */
|
||||
static zend_object_value Transliterator_clone_obj( zval *object TSRMLS_DC )
|
||||
static zend_object *Transliterator_clone_obj( zval *object TSRMLS_DC )
|
||||
{
|
||||
Transliterator_object *to_orig,
|
||||
*to_new;
|
||||
zend_object_value ret_val;
|
||||
zend_object *ret_val;
|
||||
intl_error_reset( NULL TSRMLS_CC );
|
||||
|
||||
to_orig = zend_object_store_get_object( object TSRMLS_CC );
|
||||
to_orig = Z_INTL_TRANSLITERATOR_P( object );
|
||||
intl_error_reset( INTL_DATA_ERROR_P( to_orig ) TSRMLS_CC );
|
||||
ret_val = Transliterator_ce_ptr->create_object( Z_OBJCE_P( object ) TSRMLS_CC );
|
||||
to_new = zend_object_store_get_object_by_handle( ret_val.handle TSRMLS_CC );
|
||||
to_new = php_intl_transliterator_fetch_object( ret_val );
|
||||
|
||||
zend_objects_clone_members( &to_new->zo, ret_val,
|
||||
&to_orig->zo, Z_OBJ_HANDLE_P( object ) TSRMLS_CC );
|
||||
zend_objects_clone_members( &to_new->zo, &to_orig->zo TSRMLS_CC );
|
||||
|
||||
if( to_orig->utrans != NULL )
|
||||
{
|
||||
@ -179,13 +163,13 @@ static zend_object_value Transliterator_clone_obj( zval *object TSRMLS_DC )
|
||||
if( U_FAILURE( TRANSLITERATOR_ERROR_CODE( to_orig ) ) )
|
||||
goto err;
|
||||
|
||||
Z_OBJVAL( tempz ) = ret_val;
|
||||
ZVAL_OBJ(&tempz, ret_val);
|
||||
transliterator_object_construct( &tempz, utrans,
|
||||
TRANSLITERATOR_ERROR_CODE_P( to_orig ) TSRMLS_CC );
|
||||
|
||||
if( U_FAILURE( TRANSLITERATOR_ERROR_CODE( to_orig ) ) )
|
||||
{
|
||||
char *err_msg;
|
||||
zend_string *err_msg;
|
||||
err:
|
||||
|
||||
if( utrans != NULL )
|
||||
@ -198,8 +182,8 @@ err:
|
||||
"Could not clone transliterator", 0 TSRMLS_CC );
|
||||
|
||||
err_msg = intl_error_get_message( TRANSLITERATOR_ERROR_P( to_orig ) TSRMLS_CC );
|
||||
php_error_docref( NULL TSRMLS_CC, E_ERROR, "%s", err_msg );
|
||||
efree( err_msg ); /* if it's changed into a warning */
|
||||
php_error_docref( NULL TSRMLS_CC, E_ERROR, "%s", err_msg->val );
|
||||
STR_FREE( err_msg ); /* if it's changed into a warning */
|
||||
/* do not destroy tempz; we need to return something */
|
||||
}
|
||||
}
|
||||
@ -214,8 +198,7 @@ err:
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
#if PHP_VERSION_ID >= 50399
|
||||
# define TRANSLITERATOR_PROPERTY_HANDLER_PROLOG \
|
||||
#define TRANSLITERATOR_PROPERTY_HANDLER_PROLOG \
|
||||
zval tmp_member; \
|
||||
if( Z_TYPE_P( member ) != IS_STRING ) \
|
||||
{ \
|
||||
@ -223,35 +206,19 @@ err:
|
||||
zval_copy_ctor( &tmp_member ); \
|
||||
convert_to_string( &tmp_member ); \
|
||||
member = &tmp_member; \
|
||||
key = NULL; \
|
||||
cache_slot = -1; \
|
||||
}
|
||||
#else
|
||||
# define TRANSLITERATOR_PROPERTY_HANDLER_PROLOG \
|
||||
zval tmp_member; \
|
||||
if( Z_TYPE_P( member ) != IS_STRING ) \
|
||||
{ \
|
||||
tmp_member = *member; \
|
||||
zval_copy_ctor( &tmp_member ); \
|
||||
convert_to_string( &tmp_member ); \
|
||||
member = &tmp_member; \
|
||||
}
|
||||
#endif
|
||||
|
||||
#define TRANSLITERATOR_PROPERTY_HANDLER_EPILOG \
|
||||
if( member == &tmp_member ) \
|
||||
if( member == &tmp_member ) \
|
||||
{ \
|
||||
zval_dtor( &tmp_member ); \
|
||||
}
|
||||
|
||||
/* {{{ get_property_ptr_ptr handler */
|
||||
#if PHP_VERSION_ID < 50399
|
||||
static zval **Transliterator_get_property_ptr_ptr( zval *object, zval *member TSRMLS_DC )
|
||||
#else
|
||||
static zval **Transliterator_get_property_ptr_ptr( zval *object, zval *member, int type,
|
||||
const struct _zend_literal *key TSRMLS_DC )
|
||||
#endif
|
||||
static zval *Transliterator_get_property_ptr_ptr( zval *object, zval *member, int type, zend_uint cache_slot TSRMLS_DC )
|
||||
{
|
||||
zval **retval;
|
||||
zval *retval;
|
||||
|
||||
TRANSLITERATOR_PROPERTY_HANDLER_PROLOG;
|
||||
|
||||
@ -262,11 +229,7 @@ static zval **Transliterator_get_property_ptr_ptr( zval *object, zval *member, i
|
||||
}
|
||||
else
|
||||
{
|
||||
#if PHP_VERSION_ID < 50399
|
||||
retval = std_object_handlers.get_property_ptr_ptr( object, member TSRMLS_CC );
|
||||
#else
|
||||
retval = std_object_handlers.get_property_ptr_ptr( object, member, type, key TSRMLS_CC );
|
||||
#endif
|
||||
retval = std_object_handlers.get_property_ptr_ptr( object, member, type, cache_slot TSRMLS_CC );
|
||||
}
|
||||
|
||||
TRANSLITERATOR_PROPERTY_HANDLER_EPILOG;
|
||||
@ -276,12 +239,7 @@ static zval **Transliterator_get_property_ptr_ptr( zval *object, zval *member, i
|
||||
/* }}} */
|
||||
|
||||
/* {{{ read_property handler */
|
||||
#if PHP_VERSION_ID < 50399
|
||||
static zval *Transliterator_read_property( zval *object, zval *member, int type TSRMLS_DC ) /* {{{ */
|
||||
#else
|
||||
static zval *Transliterator_read_property( zval *object, zval *member, int type,
|
||||
const struct _zend_literal *key TSRMLS_DC ) /* {{{ */
|
||||
#endif
|
||||
static zval *Transliterator_read_property( zval *object, zval *member, int type, zend_uint cache_slot, zval *rv TSRMLS_DC )
|
||||
{
|
||||
zval *retval;
|
||||
|
||||
@ -296,11 +254,7 @@ static zval *Transliterator_read_property( zval *object, zval *member, int type,
|
||||
}
|
||||
else
|
||||
{
|
||||
#if PHP_VERSION_ID < 50399
|
||||
retval = std_object_handlers.read_property( object, member, type TSRMLS_CC );
|
||||
#else
|
||||
retval = std_object_handlers.read_property( object, member, type, key TSRMLS_CC );
|
||||
#endif
|
||||
retval = std_object_handlers.read_property( object, member, type, cache_slot, rv TSRMLS_CC );
|
||||
}
|
||||
|
||||
TRANSLITERATOR_PROPERTY_HANDLER_EPILOG;
|
||||
@ -311,12 +265,8 @@ static zval *Transliterator_read_property( zval *object, zval *member, int type,
|
||||
/* }}} */
|
||||
|
||||
/* {{{ write_property handler */
|
||||
#if PHP_VERSION_ID < 50399
|
||||
static void Transliterator_write_property( zval *object, zval *member, zval *value TSRMLS_DC )
|
||||
#else
|
||||
static void Transliterator_write_property( zval *object, zval *member, zval *value,
|
||||
const struct _zend_literal *key TSRMLS_DC )
|
||||
#endif
|
||||
zend_uint cache_slot TSRMLS_DC )
|
||||
{
|
||||
TRANSLITERATOR_PROPERTY_HANDLER_PROLOG;
|
||||
|
||||
@ -328,11 +278,7 @@ static void Transliterator_write_property( zval *object, zval *member, zval *val
|
||||
}
|
||||
else
|
||||
{
|
||||
#if PHP_VERSION_ID < 50399
|
||||
std_object_handlers.write_property( object, member, value TSRMLS_CC );
|
||||
#else
|
||||
std_object_handlers.write_property( object, member, value, key TSRMLS_CC );
|
||||
#endif
|
||||
std_object_handlers.write_property( object, member, value, cache_slot TSRMLS_CC );
|
||||
}
|
||||
|
||||
TRANSLITERATOR_PROPERTY_HANDLER_EPILOG;
|
||||
@ -403,6 +349,9 @@ void transliterator_register_Transliterator_class( TSRMLS_D )
|
||||
Transliterator_ce_ptr = zend_register_internal_class( &ce TSRMLS_CC );
|
||||
memcpy( &Transliterator_handlers, zend_get_std_object_handlers(),
|
||||
sizeof Transliterator_handlers );
|
||||
Transliterator_handlers.offset = XtOffsetOf(Transliterator_object, zo);
|
||||
Transliterator_handlers.dtor_obj = Transliterator_objects_dtor;
|
||||
Transliterator_handlers.free_obj = Transliterator_objects_free;
|
||||
Transliterator_handlers.clone_obj = Transliterator_clone_obj;
|
||||
Transliterator_handlers.get_property_ptr_ptr = Transliterator_get_property_ptr_ptr;
|
||||
Transliterator_handlers.read_property = Transliterator_read_property;
|
||||
|
@ -25,15 +25,20 @@
|
||||
#include <unicode/utrans.h>
|
||||
|
||||
typedef struct {
|
||||
zend_object zo;
|
||||
|
||||
// error handling
|
||||
intl_error err;
|
||||
|
||||
// ICU transliterator
|
||||
UTransliterator* utrans;
|
||||
|
||||
zend_object zo;
|
||||
} Transliterator_object;
|
||||
|
||||
static inline Transliterator_object *php_intl_transliterator_fetch_object(zend_object *obj) {
|
||||
return (Transliterator_object *)((char*)(obj) - XtOffsetOf(Transliterator_object, zo));
|
||||
}
|
||||
#define Z_INTL_TRANSLITERATOR_P(zv) php_intl_transliterator_fetch_object(Z_OBJ_P(zv))
|
||||
|
||||
#define TRANSLITERATOR_FORWARD UTRANS_FORWARD
|
||||
#define TRANSLITERATOR_REVERSE UTRANS_REVERSE
|
||||
|
||||
@ -44,7 +49,7 @@ typedef struct {
|
||||
#define TRANSLITERATOR_ERROR_CODE_P( co ) &(INTL_ERROR_CODE(TRANSLITERATOR_ERROR( co )))
|
||||
|
||||
#define TRANSLITERATOR_METHOD_INIT_VARS INTL_METHOD_INIT_VARS( Transliterator, to )
|
||||
#define TRANSLITERATOR_METHOD_FETCH_OBJECT_NO_CHECK INTL_METHOD_FETCH_OBJECT( Transliterator, to )
|
||||
#define TRANSLITERATOR_METHOD_FETCH_OBJECT_NO_CHECK INTL_METHOD_FETCH_OBJECT( INTL_TRANSLITERATOR, to )
|
||||
#define TRANSLITERATOR_METHOD_FETCH_OBJECT\
|
||||
TRANSLITERATOR_METHOD_FETCH_OBJECT_NO_CHECK; \
|
||||
if( to->utrans == NULL ) \
|
||||
|
@ -185,7 +185,7 @@ PHP_FUNCTION( transliterator_create_from_rules )
|
||||
smart_str parse_error_str;
|
||||
parse_error_str = intl_parse_error_to_string( &parse_error );
|
||||
spprintf( &msg, 0, "transliterator_create_from_rules: unable to "
|
||||
"create ICU transliterator from rules (%s)", parse_error_str.c );
|
||||
"create ICU transliterator from rules (%s)", parse_error_str.s? parse_error_str.s->val : "" );
|
||||
smart_str_free( &parse_error_str );
|
||||
if( msg != NULL )
|
||||
{
|
||||
@ -309,17 +309,18 @@ PHP_FUNCTION( transliterator_transliterate )
|
||||
uresult_len;
|
||||
long start = 0,
|
||||
limit = -1;
|
||||
int success = 0,
|
||||
temp_trans = 0;
|
||||
int success = 0;
|
||||
zval tmp_object;
|
||||
TRANSLITERATOR_METHOD_INIT_VARS;
|
||||
|
||||
object = getThis();
|
||||
ZVAL_UNDEF(&tmp_object);
|
||||
|
||||
if( object == NULL )
|
||||
{
|
||||
/* in non-OOP version, accept both a transliterator and a string */
|
||||
zval **arg1;
|
||||
if( zend_parse_parameters( ZEND_NUM_ARGS() TSRMLS_CC, "Zs|ll",
|
||||
zval *arg1;
|
||||
if( zend_parse_parameters( ZEND_NUM_ARGS() TSRMLS_CC, "zs|ll",
|
||||
&arg1, &str, &str_len, &start, &limit ) == FAILURE )
|
||||
{
|
||||
intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR,
|
||||
@ -327,29 +328,28 @@ PHP_FUNCTION( transliterator_transliterate )
|
||||
RETURN_FALSE;
|
||||
}
|
||||
|
||||
if( Z_TYPE_PP( arg1 ) == IS_OBJECT &&
|
||||
instanceof_function( Z_OBJCE_PP( arg1 ), Transliterator_ce_ptr TSRMLS_CC ) )
|
||||
if( Z_TYPE_P( arg1 ) == IS_OBJECT &&
|
||||
instanceof_function( Z_OBJCE_P( arg1 ), Transliterator_ce_ptr TSRMLS_CC ) )
|
||||
{
|
||||
object = *arg1;
|
||||
object = arg1;
|
||||
}
|
||||
else
|
||||
{ /* not a transliterator object as first argument */
|
||||
int res;
|
||||
if(Z_TYPE_PP( arg1 ) != IS_STRING )
|
||||
if(Z_TYPE_P( arg1 ) != IS_STRING )
|
||||
{
|
||||
SEPARATE_ZVAL( arg1 );
|
||||
convert_to_string( *arg1 );
|
||||
convert_to_string( arg1 );
|
||||
}
|
||||
ALLOC_INIT_ZVAL( object );
|
||||
temp_trans = 1;
|
||||
res = create_transliterator( Z_STRVAL_PP( arg1 ), Z_STRLEN_PP( arg1 ),
|
||||
object = &tmp_object;
|
||||
res = create_transliterator( Z_STRVAL_P( arg1 ), Z_STRLEN_P( arg1 ),
|
||||
TRANSLITERATOR_FORWARD, object TSRMLS_CC );
|
||||
if( res == FAILURE )
|
||||
{
|
||||
char *message = intl_error_get_message( NULL TSRMLS_CC );
|
||||
zend_string *message = intl_error_get_message( NULL TSRMLS_CC );
|
||||
php_error_docref0( NULL TSRMLS_CC, E_WARNING, "Could not create "
|
||||
"transliterator with ID \"%s\" (%s)", Z_STRVAL_PP( arg1 ), message );
|
||||
efree( message );
|
||||
"transliterator with ID \"%s\" (%s)", Z_STRVAL_P( arg1 ), message->val );
|
||||
STR_FREE( message );
|
||||
/* don't set U_ILLEGAL_ARGUMENT_ERROR to allow fetching of inner error */
|
||||
goto cleanup;
|
||||
}
|
||||
@ -463,8 +463,7 @@ cleanup:
|
||||
RETVAL_FALSE;
|
||||
}
|
||||
|
||||
if (temp_trans )
|
||||
zval_ptr_dtor( &object );
|
||||
zval_ptr_dtor( &tmp_object );
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
@ -494,7 +493,7 @@ PHP_FUNCTION( transliterator_get_error_code )
|
||||
}
|
||||
|
||||
/* Fetch the object (without resetting its last error code ). */
|
||||
to = zend_object_store_get_object( object TSRMLS_CC );
|
||||
to = Z_INTL_TRANSLITERATOR_P( object );
|
||||
if (to == NULL )
|
||||
RETURN_FALSE;
|
||||
|
||||
@ -509,7 +508,7 @@ PHP_FUNCTION( transliterator_get_error_code )
|
||||
*/
|
||||
PHP_FUNCTION( transliterator_get_error_message )
|
||||
{
|
||||
const char* message = NULL;
|
||||
zend_string* message = NULL;
|
||||
TRANSLITERATOR_METHOD_INIT_VARS
|
||||
|
||||
if( zend_parse_method_parameters( ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O",
|
||||
@ -523,13 +522,13 @@ PHP_FUNCTION( transliterator_get_error_message )
|
||||
|
||||
|
||||
/* Fetch the object (without resetting its last error code ). */
|
||||
to = zend_object_store_get_object( object TSRMLS_CC );
|
||||
to = Z_INTL_TRANSLITERATOR_P( object );
|
||||
if (to == NULL )
|
||||
RETURN_FALSE;
|
||||
|
||||
/* Return last error message. */
|
||||
message = intl_error_get_message( TRANSLITERATOR_ERROR_P( to ) TSRMLS_CC );
|
||||
RETURN_STRING( message, 0 );
|
||||
RETURN_STR( message );
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user