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

Reply via email to