Annotation of embedaddon/php/ext/intl/dateformat/dateformat_format.c, revision 1.1.1.1

1.1       misho       1: /*
                      2:    +----------------------------------------------------------------------+
                      3:    | PHP Version 5                                                        |
                      4:    +----------------------------------------------------------------------+
                      5:    | This source file is subject to version 3.01 of the PHP license,      |
                      6:    | that is bundled with this package in the file LICENSE, and is        |
                      7:    | available through the world-wide-web at the following url:           |
                      8:    | http://www.php.net/license/3_01.txt                                  |
                      9:    | If you did not receive a copy of the PHP license and are unable to   |
                     10:    | obtain it through the world-wide-web, please send a note to          |
                     11:    | license@php.net so we can mail you a copy immediately.               |
                     12:    +----------------------------------------------------------------------+
                     13:    | Authors: Kirti Velankar <kirtig@yahoo-inc.com>                       |
                     14:    +----------------------------------------------------------------------+
                     15: */
                     16: 
                     17: #ifdef HAVE_CONFIG_H
                     18: #include "config.h"
                     19: #endif
                     20: 
                     21: #include <unicode/ustring.h>
                     22: #include <unicode/ucal.h>
                     23: 
                     24: #include "php_intl.h"
                     25: #include "intl_convert.h"
                     26: #include "dateformat.h"
                     27: #include "dateformat_class.h"
                     28: #include "dateformat_format.h"
                     29: #include "dateformat_data.h"
                     30: #include "ext/date/php_date.h"
                     31: 
                     32: /* {{{ 
                     33:  * Internal function which calls the udat_format
                     34: */
                     35: static void internal_format(IntlDateFormatter_object *dfo, UDate timestamp, zval *return_value TSRMLS_DC)
                     36: {
                     37:        UChar*  formatted =  NULL;
                     38:        int32_t resultlengthneeded =0 ;
                     39:        
                     40:        resultlengthneeded=udat_format( DATE_FORMAT_OBJECT(dfo), timestamp, NULL, resultlengthneeded, NULL, &INTL_DATA_ERROR_CODE(dfo));
                     41:        if(INTL_DATA_ERROR_CODE(dfo)==U_BUFFER_OVERFLOW_ERROR)
                     42:        {
                     43:                INTL_DATA_ERROR_CODE(dfo)=U_ZERO_ERROR;
                     44:                formatted=(UChar*)emalloc(sizeof(UChar) * resultlengthneeded); 
                     45:                udat_format( DATE_FORMAT_OBJECT(dfo), timestamp, formatted, resultlengthneeded, NULL, &INTL_DATA_ERROR_CODE(dfo));
                     46:        }
                     47: 
                     48:        if (formatted && U_FAILURE( INTL_DATA_ERROR_CODE(dfo) ) ) {
                     49:                        efree(formatted);
                     50:        }
                     51: 
                     52:        INTL_METHOD_CHECK_STATUS( dfo, "Date formatting failed" );
                     53:        INTL_METHOD_RETVAL_UTF8( dfo, formatted, resultlengthneeded, 1 );
                     54: 
                     55: }
                     56: /* }}} */
                     57: 
                     58: 
                     59: /* {{{ 
                     60:  * Internal function which fetches an element from the passed array for the key_name passed 
                     61: */
                     62: static double internal_get_arr_ele(IntlDateFormatter_object *dfo, HashTable* hash_arr, char* key_name TSRMLS_DC)
                     63: {
                     64:        zval**  ele_value       = NULL;
                     65:        UDate result = -1;
                     66: 
                     67:         if( zend_hash_find( hash_arr, key_name, strlen(key_name) + 1, (void **)&ele_value ) == SUCCESS ){
                     68:                 if( Z_TYPE_PP(ele_value)!= IS_LONG ){
                     69:                        intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR,
                     70:                                "datefmt_format: parameter array does not contain a long element.", 0 TSRMLS_CC );
                     71:                 }else{
                     72:                        result =  Z_LVAL_PP(ele_value);
                     73:                }
                     74:        }
                     75:        /* printf("\n Inside internal_get_arr_ele key_name= %s, result = %g \n", key_name, result); */
                     76:        return result;
                     77: }
                     78: /* }}} */
                     79: 
                     80: /* {{{ 
                     81:  * Internal function which sets UCalendar  from the passed array and retrieves timestamp
                     82: */
                     83: static UDate internal_get_timestamp(IntlDateFormatter_object *dfo, HashTable* hash_arr  TSRMLS_DC)
                     84: {
                     85:        long year =0;
                     86:        long month =0;
                     87:        long hour =0;
                     88:        long minute =0;
                     89:        long second =0;
                     90:        long wday =0;
                     91:        long yday =0;
                     92:        long mday =0;
                     93:        UBool isInDST = FALSE;
                     94:        UCalendar *pcal;
                     95: 
                     96:        /* Fetch  values from the incoming array */
                     97:        year = internal_get_arr_ele( dfo, hash_arr, CALENDAR_YEAR TSRMLS_CC) + 1900; /* tm_year is years since 1900 */
                     98:        /* Month in ICU and PHP starts from January =0 */
                     99:        month = internal_get_arr_ele( dfo, hash_arr, CALENDAR_MON TSRMLS_CC);
                    100:        hour = internal_get_arr_ele( dfo, hash_arr, CALENDAR_HOUR TSRMLS_CC);
                    101:        minute = internal_get_arr_ele( dfo, hash_arr, CALENDAR_MIN TSRMLS_CC);
                    102:        second = internal_get_arr_ele( dfo, hash_arr, CALENDAR_SEC TSRMLS_CC);
                    103:        wday = internal_get_arr_ele( dfo, hash_arr, CALENDAR_WDAY TSRMLS_CC);
                    104:        yday = internal_get_arr_ele( dfo, hash_arr, CALENDAR_YDAY TSRMLS_CC);
                    105:        isInDST = internal_get_arr_ele( dfo, hash_arr, CALENDAR_ISDST TSRMLS_CC);
                    106:        /* For the ucal_setDateTime() function, this is the 'date'  value */
                    107:        mday = internal_get_arr_ele( dfo, hash_arr, CALENDAR_MDAY TSRMLS_CC);
                    108: 
                    109:        pcal = udat_getCalendar(DATE_FORMAT_OBJECT(dfo));
                    110:        /* set the incoming values for the calendar */
                    111:        ucal_setDateTime( pcal, year, month, mday, hour, minute, second, &INTL_DATA_ERROR_CODE(dfo));
                    112:        if( INTL_DATA_ERROR_CODE(dfo) != U_ZERO_ERROR){
                    113:                return 0;
                    114:        }
                    115:        
                    116:        /* Fetch the timestamp from the UCalendar */
                    117:        return ucal_getMillis(pcal, &INTL_DATA_ERROR_CODE(dfo) );
                    118: }
                    119: 
                    120: 
                    121: /* {{{ proto string IntlDateFormatter::format( [mixed]int $args or array $args )
                    122:  * Format the time value as a string. }}}*/
                    123: /* {{{ proto string datefmt_format( [mixed]int $args or array $args )
                    124:  * Format the time value as a string. }}}*/
                    125: PHP_FUNCTION(datefmt_format) 
                    126: {
                    127:        UDate           timestamp =0;
                    128:        UDate           p_timestamp =0;
                    129:        HashTable*      hash_arr        = NULL;
                    130:        zval*           zarg    = NULL;
                    131: 
                    132:        DATE_FORMAT_METHOD_INIT_VARS;
                    133: 
                    134:        /* Parse parameters. */
                    135:        if( zend_parse_method_parameters( ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Oz", &object, IntlDateFormatter_ce_ptr,&zarg ) == FAILURE )
                    136:        {
                    137:                intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR, "datefmt_format: unable to parse input params", 0 TSRMLS_CC );
                    138:                RETURN_FALSE;
                    139:        }
                    140: 
                    141:        /* Fetch the object. */
                    142:        DATE_FORMAT_METHOD_FETCH_OBJECT;
                    143: 
                    144:        switch(Z_TYPE_P(zarg) ){
                    145:                case IS_LONG:
                    146:                        p_timestamp = Z_LVAL_P(zarg) ;
                    147:                        timestamp = p_timestamp * 1000;
                    148:                        break;
                    149:                case IS_DOUBLE:
                    150:                        /* timestamp*1000 since ICU expects it in milliseconds */
                    151:                        p_timestamp = Z_DVAL_P(zarg) ;
                    152:                        timestamp = p_timestamp * 1000;
                    153:                        break;
                    154:                case IS_ARRAY:
                    155:                        hash_arr = Z_ARRVAL_P(zarg);
                    156:                        if( !hash_arr || zend_hash_num_elements( hash_arr ) == 0 )
                    157:                                RETURN_FALSE;
                    158: 
                    159:                        timestamp = internal_get_timestamp(dfo, hash_arr TSRMLS_CC);
                    160:                        INTL_METHOD_CHECK_STATUS( dfo, "datefmt_format: Date formatting failed" )
                    161:                        break;
                    162:                case IS_OBJECT: {
                    163:                        zend_class_entry *date_ce = php_date_get_date_ce();
                    164:                        zval retval;
                    165:                        zval *zfuncname;
                    166:                        if(!instanceof_function(Z_OBJCE_P(zarg), date_ce TSRMLS_CC)) {
                    167:                                intl_errors_set(INTL_DATA_ERROR_P(dfo), U_ILLEGAL_ARGUMENT_ERROR, "datefmt_format: object must be an instance of DateTime", 0 TSRMLS_CC );
                    168:                                RETURN_FALSE;
                    169:                        }
                    170:                        INIT_ZVAL(retval);
                    171:                        MAKE_STD_ZVAL(zfuncname);
                    172:                        ZVAL_STRING(zfuncname, "getTimestamp", 1);
                    173:                        if(call_user_function(NULL, &zarg, zfuncname, &retval, 0, NULL TSRMLS_CC) != SUCCESS || Z_TYPE(retval) != IS_LONG) {
                    174:                                intl_errors_set(INTL_DATA_ERROR_P(dfo), U_ILLEGAL_ARGUMENT_ERROR, "datefmt_format: cannot get timestamp", 0 TSRMLS_CC );
                    175:                                zval_ptr_dtor(&zfuncname);
                    176:                                RETURN_FALSE;
                    177:                        }
                    178:                        zval_ptr_dtor(&zfuncname);
                    179:                        p_timestamp = Z_LVAL(retval);
                    180:                        timestamp = p_timestamp*1000;
                    181:                }
                    182:                        break;
                    183:                default:
                    184:                        intl_errors_set( INTL_DATA_ERROR_P(dfo), U_ILLEGAL_ARGUMENT_ERROR,
                    185:                                "datefmt_format: takes either an array or an integer timestamp value or a DateTime object", 0 TSRMLS_CC );
                    186:                        RETURN_FALSE;
                    187:        }
                    188: 
                    189:        internal_format( dfo, timestamp, return_value TSRMLS_CC);
                    190:        
                    191: }
                    192: 
                    193: /* }}} */
                    194: 

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>