stas Thu Sep 4 00:15:25 2008 UTC Modified files: (Branch: PHP_5_3) /php-src/ext/intl/dateformat dateformat_format.c dateformat_parse.c Log: fix formatting/parsing
http://cvs.php.net/viewvc.cgi/php-src/ext/intl/dateformat/dateformat_format.c?r1=1.1.2.3&r2=1.1.2.4&diff_format=u Index: php-src/ext/intl/dateformat/dateformat_format.c diff -u php-src/ext/intl/dateformat/dateformat_format.c:1.1.2.3 php-src/ext/intl/dateformat/dateformat_format.c:1.1.2.4 --- php-src/ext/intl/dateformat/dateformat_format.c:1.1.2.3 Mon Aug 11 19:47:59 2008 +++ php-src/ext/intl/dateformat/dateformat_format.c Thu Sep 4 00:15:25 2008 @@ -31,7 +31,8 @@ /* {{{ * Internal function which calls the udat_format */ -static void internal_format(IntlDateFormatter_object *dfo, UDate timestamp , zval *return_value TSRMLS_DC){ +static void internal_format(IntlDateFormatter_object *dfo, UDate timestamp, zval *return_value TSRMLS_DC) +{ UChar* formatted = NULL; int32_t resultlengthneeded =0 ; @@ -57,11 +58,12 @@ /* {{{ * Internal function which fetches an element from the passed array for the key_name passed */ -static double internal_get_arr_ele(IntlDateFormatter_object *dfo , HashTable* hash_arr ,char* key_name TSRMLS_DC){ +static double internal_get_arr_ele(IntlDateFormatter_object *dfo, HashTable* hash_arr, char* key_name TSRMLS_DC) +{ zval** ele_value = NULL; UDate result = -1; - if( zend_hash_find( hash_arr , key_name , strlen(key_name) + 1 ,(void **)&ele_value ) == SUCCESS ){ + if( zend_hash_find( hash_arr, key_name, strlen(key_name) + 1, (void **)&ele_value ) == SUCCESS ){ if( Z_TYPE_PP(ele_value)!= IS_LONG ){ intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR, "datefmt_format: parameter array does not contain a long element.", 0 TSRMLS_CC ); @@ -69,15 +71,16 @@ result = Z_LVAL_PP(ele_value); } } - /* printf("\n Inside internal_get_arr_ele key_name= %s , result = %g \n" , key_name, result); */ + /* printf("\n Inside internal_get_arr_ele key_name= %s, result = %g \n", key_name, result); */ return result; } /* }}} */ /* {{{ - * Internal function which creates a UCalendar from the passed array + * Internal function which sets UCalendar from the passed array and retrieves timestamp */ -static void internal_create_ucal(IntlDateFormatter_object *dfo, HashTable* hash_arr , UCalendar* pcal TSRMLS_DC){ +static UDate internal_get_timestamp(IntlDateFormatter_object *dfo, HashTable* hash_arr TSRMLS_DC) +{ long year =0; long month =0; long hour =0; @@ -87,31 +90,30 @@ long yday =0; long mday =0; UBool isInDST = FALSE; + UCalendar *pcal; /* Fetch values from the incoming array */ - year = internal_get_arr_ele( dfo , hash_arr , CALENDAR_YEAR TSRMLS_CC) + 1900; /* tm_year is years since 1900 */ + year = internal_get_arr_ele( dfo, hash_arr, CALENDAR_YEAR TSRMLS_CC) + 1900; /* tm_year is years since 1900 */ /* Month in ICU and PHP starts from January =0 */ - month = internal_get_arr_ele( dfo , hash_arr , CALENDAR_MON TSRMLS_CC); - hour = internal_get_arr_ele( dfo , hash_arr , CALENDAR_HOUR TSRMLS_CC); - minute = internal_get_arr_ele( dfo , hash_arr , CALENDAR_MIN TSRMLS_CC); - second = internal_get_arr_ele( dfo , hash_arr , CALENDAR_SEC TSRMLS_CC); - wday = internal_get_arr_ele( dfo , hash_arr , CALENDAR_WDAY TSRMLS_CC); - yday = internal_get_arr_ele( dfo , hash_arr , CALENDAR_YDAY TSRMLS_CC); - isInDST = internal_get_arr_ele( dfo , hash_arr , CALENDAR_ISDST TSRMLS_CC); - /* For the ucal_setDateTime() function , this is the 'date' value */ - mday = internal_get_arr_ele( dfo , hash_arr , CALENDAR_MDAY TSRMLS_CC); + month = internal_get_arr_ele( dfo, hash_arr, CALENDAR_MON TSRMLS_CC); + hour = internal_get_arr_ele( dfo, hash_arr, CALENDAR_HOUR TSRMLS_CC); + minute = internal_get_arr_ele( dfo, hash_arr, CALENDAR_MIN TSRMLS_CC); + second = internal_get_arr_ele( dfo, hash_arr, CALENDAR_SEC TSRMLS_CC); + wday = internal_get_arr_ele( dfo, hash_arr, CALENDAR_WDAY TSRMLS_CC); + yday = internal_get_arr_ele( dfo, hash_arr, CALENDAR_YDAY TSRMLS_CC); + isInDST = internal_get_arr_ele( dfo, hash_arr, CALENDAR_ISDST TSRMLS_CC); + /* For the ucal_setDateTime() function, this is the 'date' value */ + mday = internal_get_arr_ele( dfo, hash_arr, CALENDAR_MDAY TSRMLS_CC); + pcal = udat_getCalendar(DATE_FORMAT_OBJECT(dfo)); /* set the incoming values for the calendar */ - ucal_setDateTime( pcal, year, month , mday , hour , minute , second , &INTL_DATA_ERROR_CODE(dfo)); + ucal_setDateTime( pcal, year, month, mday, hour, minute, second, &INTL_DATA_ERROR_CODE(dfo)); if( INTL_DATA_ERROR_CODE(dfo) != U_ZERO_ERROR){ - return; + return 0; } - /* ICU UCAL_DAY_OF_WEEK starts from SUNDAY=1 thru SATURDAY=7 - * whereas PHP localtime has tm_wday SUNDAY=0 thru SATURDAY=6 */ - ucal_set( pcal, UCAL_DAY_OF_WEEK , (wday+1)); - ucal_set( pcal, UCAL_DAY_OF_YEAR , yday); - /* TO DO: How to set the isInDST field?Is it required to set */ + /* Fetch the timestamp from the UCalendar */ + return ucal_getMillis(pcal, &INTL_DATA_ERROR_CODE(dfo) ); } @@ -123,14 +125,13 @@ { UDate timestamp =0; UDate p_timestamp =0; - UCalendar* temp_cal ; HashTable* hash_arr = NULL; zval* zarg = NULL; DATE_FORMAT_METHOD_INIT_VARS; /* Parse parameters. */ - if( zend_parse_method_parameters( ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Oz", &object, IntlDateFormatter_ce_ptr ,&zarg ) == FAILURE ) + if( zend_parse_method_parameters( ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Oz", &object, IntlDateFormatter_ce_ptr,&zarg ) == FAILURE ) { intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR, "datefmt_format: unable to parse input params", 0 TSRMLS_CC ); RETURN_FALSE; @@ -153,27 +154,17 @@ hash_arr = Z_ARRVAL_P(zarg); if( !hash_arr || zend_hash_num_elements( hash_arr ) == 0 ) RETURN_FALSE; - /* Create a UCalendar object from the array and then format it */ - temp_cal = ucal_open(NULL, -1, NULL, UCAL_GREGORIAN, &INTL_DATA_ERROR_CODE(dfo)); - ucal_clear(temp_cal); - INTL_METHOD_CHECK_STATUS( dfo, "datefmt_format: Date formatting failed while creating calendar from the array" ) - internal_create_ucal( dfo , hash_arr , temp_cal TSRMLS_CC); - INTL_METHOD_CHECK_STATUS( dfo, "datefmt_format: Date formatting failed while creating calendar from the array" ) - /* Fetch the timestamp from the created UCalendar */ - timestamp = ucal_getMillis(temp_cal , &INTL_DATA_ERROR_CODE(dfo) ); + + timestamp = internal_get_timestamp(dfo, hash_arr TSRMLS_CC); INTL_METHOD_CHECK_STATUS( dfo, "datefmt_format: Date formatting failed" ) break; -/* - case IS_OBJECT: - break; -*/ default: intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR, - "datefmt_format: takes either an array or an integer TimeStamp value ", 0 TSRMLS_CC ); + "datefmt_format: takes either an array or an integer timestamp value ", 0 TSRMLS_CC ); RETURN_FALSE; } - internal_format( dfo, timestamp ,return_value TSRMLS_CC); + internal_format( dfo, timestamp, return_value TSRMLS_CC); } http://cvs.php.net/viewvc.cgi/php-src/ext/intl/dateformat/dateformat_parse.c?r1=1.1.2.4&r2=1.1.2.5&diff_format=u Index: php-src/ext/intl/dateformat/dateformat_parse.c diff -u php-src/ext/intl/dateformat/dateformat_parse.c:1.1.2.4 php-src/ext/intl/dateformat/dateformat_parse.c:1.1.2.5 --- php-src/ext/intl/dateformat/dateformat_parse.c:1.1.2.4 Mon Aug 11 19:47:59 2008 +++ php-src/ext/intl/dateformat/dateformat_parse.c Thu Sep 4 00:15:25 2008 @@ -33,17 +33,18 @@ * if set to 1 - store any error encountered in the parameter parse_error * if set to 0 - no need to store any error encountered in the parameter parse_error */ -static void internal_parse_to_timestamp(IntlDateFormatter_object *dfo, char* text_to_parse , int32_t text_len, int32_t *parse_pos , zval *return_value TSRMLS_DC){ +static void internal_parse_to_timestamp(IntlDateFormatter_object *dfo, char* text_to_parse, int32_t text_len, int32_t *parse_pos, zval *return_value TSRMLS_DC) +{ long result = 0; UDate timestamp =0; UChar* text_utf16 = NULL; int32_t text_utf16_len = 0; /* Convert timezone to UTF-16. */ - intl_convert_utf8_to_utf16(&text_utf16 , &text_utf16_len , text_to_parse , text_len, &INTL_DATA_ERROR_CODE(dfo)); + intl_convert_utf8_to_utf16(&text_utf16, &text_utf16_len, text_to_parse, text_len, &INTL_DATA_ERROR_CODE(dfo)); INTL_METHOD_CHECK_STATUS(dfo, "Error converting timezone to UTF-16" ); - timestamp = udat_parse( DATE_FORMAT_OBJECT(dfo), text_utf16 , text_utf16_len , parse_pos , &INTL_DATA_ERROR_CODE(dfo)); + timestamp = udat_parse( DATE_FORMAT_OBJECT(dfo), text_utf16, text_utf16_len, parse_pos, &INTL_DATA_ERROR_CODE(dfo)); if( text_utf16 ){ efree(text_utf16); } @@ -60,36 +61,38 @@ } /* }}} */ -static void add_to_localtime_arr( IntlDateFormatter_object *dfo, zval* return_value ,UCalendar parsed_calendar , long calendar_field , char* key_name TSRMLS_DC){ - long calendar_field_val = ucal_get( parsed_calendar , calendar_field , &INTL_DATA_ERROR_CODE(dfo)); +static void add_to_localtime_arr( IntlDateFormatter_object *dfo, zval* return_value, UCalendar parsed_calendar, long calendar_field, char* key_name TSRMLS_DC) +{ + long calendar_field_val = ucal_get( parsed_calendar, calendar_field, &INTL_DATA_ERROR_CODE(dfo)); INTL_METHOD_CHECK_STATUS( dfo, "Date parsing - localtime failed : could not get a field from calendar" ); - if( strcmp(key_name , CALENDAR_YEAR )==0 ){ + if( strcmp(key_name, CALENDAR_YEAR )==0 ){ /* since tm_year is years from 1900 */ - add_assoc_long( return_value, key_name ,( calendar_field_val-1900) ); - }else if( strcmp(key_name , CALENDAR_WDAY )==0 ){ + add_assoc_long( return_value, key_name,( calendar_field_val-1900) ); + }else if( strcmp(key_name, CALENDAR_WDAY )==0 ){ /* since tm_wday starts from 0 whereas ICU WDAY start from 1 */ - add_assoc_long( return_value, key_name ,( calendar_field_val-1) ); + add_assoc_long( return_value, key_name,( calendar_field_val-1) ); }else{ - add_assoc_long( return_value, key_name , calendar_field_val ); + add_assoc_long( return_value, key_name, calendar_field_val ); } } /* {{{ * Internal function which calls the udat_parseCalendar */ -static void internal_parse_to_localtime(IntlDateFormatter_object *dfo, char* text_to_parse , int32_t text_len, int32_t *parse_pos , zval *return_value TSRMLS_DC){ +static void internal_parse_to_localtime(IntlDateFormatter_object *dfo, char* text_to_parse, int32_t text_len, int32_t *parse_pos, zval *return_value TSRMLS_DC) +{ UCalendar* parsed_calendar = NULL; UChar* text_utf16 = NULL; int32_t text_utf16_len = 0; long isInDST = 0; /* Convert timezone to UTF-16. */ - intl_convert_utf8_to_utf16(&text_utf16 , &text_utf16_len , text_to_parse , text_len, &INTL_DATA_ERROR_CODE(dfo)); + intl_convert_utf8_to_utf16(&text_utf16, &text_utf16_len, text_to_parse, text_len, &INTL_DATA_ERROR_CODE(dfo)); INTL_METHOD_CHECK_STATUS(dfo, "Error converting timezone to UTF-16" ); - parsed_calendar = ucal_open(NULL, -1, NULL, UCAL_GREGORIAN, &INTL_DATA_ERROR_CODE(dfo)); - udat_parseCalendar( DATE_FORMAT_OBJECT(dfo), parsed_calendar , text_utf16 , text_utf16_len , parse_pos , &INTL_DATA_ERROR_CODE(dfo)); + parsed_calendar = udat_getCalendar(DATE_FORMAT_OBJECT(dfo)); + udat_parseCalendar( DATE_FORMAT_OBJECT(dfo), parsed_calendar, text_utf16, text_utf16_len, parse_pos, &INTL_DATA_ERROR_CODE(dfo)); if (text_utf16) { efree(text_utf16); @@ -100,19 +103,19 @@ array_init( return_value ); /* Add entries from various fields of the obtained parsed_calendar */ - add_to_localtime_arr( dfo , return_value , parsed_calendar , UCAL_SECOND , CALENDAR_SEC TSRMLS_CC); - add_to_localtime_arr( dfo , return_value , parsed_calendar , UCAL_MINUTE , CALENDAR_MIN TSRMLS_CC); - add_to_localtime_arr( dfo , return_value , parsed_calendar , UCAL_HOUR_OF_DAY , CALENDAR_HOUR TSRMLS_CC); - add_to_localtime_arr( dfo , return_value , parsed_calendar , UCAL_YEAR , CALENDAR_YEAR TSRMLS_CC); - add_to_localtime_arr( dfo , return_value , parsed_calendar , UCAL_DAY_OF_MONTH , CALENDAR_MDAY TSRMLS_CC); - add_to_localtime_arr( dfo , return_value , parsed_calendar , UCAL_DAY_OF_WEEK , CALENDAR_WDAY TSRMLS_CC); - add_to_localtime_arr( dfo , return_value , parsed_calendar , UCAL_DAY_OF_YEAR , CALENDAR_YDAY TSRMLS_CC); - add_to_localtime_arr( dfo , return_value , parsed_calendar , UCAL_MONTH , CALENDAR_MON TSRMLS_CC); + add_to_localtime_arr( dfo, return_value, parsed_calendar, UCAL_SECOND, CALENDAR_SEC TSRMLS_CC); + add_to_localtime_arr( dfo, return_value, parsed_calendar, UCAL_MINUTE, CALENDAR_MIN TSRMLS_CC); + add_to_localtime_arr( dfo, return_value, parsed_calendar, UCAL_HOUR_OF_DAY, CALENDAR_HOUR TSRMLS_CC); + add_to_localtime_arr( dfo, return_value, parsed_calendar, UCAL_YEAR, CALENDAR_YEAR TSRMLS_CC); + add_to_localtime_arr( dfo, return_value, parsed_calendar, UCAL_DAY_OF_MONTH, CALENDAR_MDAY TSRMLS_CC); + add_to_localtime_arr( dfo, return_value, parsed_calendar, UCAL_DAY_OF_WEEK, CALENDAR_WDAY TSRMLS_CC); + add_to_localtime_arr( dfo, return_value, parsed_calendar, UCAL_DAY_OF_YEAR, CALENDAR_YDAY TSRMLS_CC); + add_to_localtime_arr( dfo, return_value, parsed_calendar, UCAL_MONTH, CALENDAR_MON TSRMLS_CC); /* Is in DST? */ - isInDST = ucal_inDaylightTime(parsed_calendar , &INTL_DATA_ERROR_CODE(dfo)); + isInDST = ucal_inDaylightTime(parsed_calendar , &INTL_DATA_ERROR_CODE(dfo)); INTL_METHOD_CHECK_STATUS( dfo, "Date parsing - localtime failed : while checking if currently in DST." ); - add_assoc_long( return_value, CALENDAR_ISDST ,(isInDST==1?1:0)); + add_assoc_long( return_value, CALENDAR_ISDST,(isInDST==1?1:0)); } /* }}} */ @@ -132,7 +135,7 @@ /* Parse parameters. */ if( zend_parse_method_parameters( ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os|z!", - &object, IntlDateFormatter_ce_ptr, &text_to_parse , &text_len , &z_parse_pos ) == FAILURE ){ + &object, IntlDateFormatter_ce_ptr, &text_to_parse, &text_len, &z_parse_pos ) == FAILURE ){ intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR, "datefmt_parse: unable to parse input params", 0 TSRMLS_CC ); RETURN_FALSE; } @@ -147,7 +150,7 @@ RETURN_FALSE; } } - internal_parse_to_timestamp( dfo, text_to_parse, text_len, z_parse_pos?&parse_pos:NULL, return_value TSRMLS_CC); + internal_parse_to_timestamp( dfo, text_to_parse, text_len, z_parse_pos?&parse_pos:NULL, return_value TSRMLS_CC); if(z_parse_pos) { zval_dtor(z_parse_pos); ZVAL_LONG(z_parse_pos, parse_pos); @@ -170,7 +173,7 @@ /* Parse parameters. */ if( zend_parse_method_parameters( ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os|z!", - &object, IntlDateFormatter_ce_ptr, &text_to_parse , &text_len , &z_parse_pos ) == FAILURE ){ + &object, IntlDateFormatter_ce_ptr, &text_to_parse, &text_len, &z_parse_pos ) == FAILURE ){ intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR, "datefmt_parse_to_localtime: unable to parse input params", 0 TSRMLS_CC ); RETURN_FALSE; } @@ -185,7 +188,7 @@ RETURN_FALSE; } } - internal_parse_to_localtime( dfo, text_to_parse , text_len , z_parse_pos?&parse_pos:NULL, return_value TSRMLS_CC); + internal_parse_to_localtime( dfo, text_to_parse, text_len, z_parse_pos?&parse_pos:NULL, return_value TSRMLS_CC); if(z_parse_pos) { zval_dtor(z_parse_pos); ZVAL_LONG(z_parse_pos, parse_pos);
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php