Annotation of embedaddon/php/ext/intl/dateformat/dateformat_attr.c, revision 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: #ifdef HAVE_CONFIG_H
! 17: #include "config.h"
! 18: #endif
! 19:
! 20: #include "php_intl.h"
! 21: #include "intl_convert.h"
! 22: #include "dateformat_class.h"
! 23: #include "dateformat_attr.h"
! 24:
! 25: #include <unicode/ustring.h>
! 26: #include <unicode/udat.h>
! 27: #include <unicode/ucal.h>
! 28:
! 29: static void internal_set_calendar(IntlDateFormatter_object *dfo, char* timezone_id, int timezone_id_len, int calendar, zval* return_value TSRMLS_DC){
! 30: int timezone_utf16_len = 0;
! 31: UChar* timezone_utf16 = NULL; /* timezone_id in UTF-16 */
! 32: char* locale = NULL;
! 33:
! 34: UCalendar* ucal_obj = NULL;
! 35:
! 36: /* check for the validity of value of calendar passed */
! 37: intl_error_reset( NULL TSRMLS_CC );
! 38: if( calendar > 1){
! 39: intl_error_set(NULL, U_ILLEGAL_ARGUMENT_ERROR,
! 40: "datefmt_set_calendar: calendar value specified is out of valid range", 0 TSRMLS_CC);
! 41: RETURN_FALSE;
! 42: }
! 43:
! 44: /* Convert timezone to UTF-16. */
! 45: intl_convert_utf8_to_utf16(&timezone_utf16, &timezone_utf16_len, timezone_id, timezone_id_len, &INTL_DATA_ERROR_CODE(dfo));
! 46: INTL_METHOD_CHECK_STATUS(dfo, "Error converting timezone to UTF-16" );
! 47:
! 48: /* Get the locale for the dateformatter */
! 49: locale = (char *)udat_getLocaleByType(DATE_FORMAT_OBJECT(dfo), ULOC_ACTUAL_LOCALE, &INTL_DATA_ERROR_CODE(dfo));
! 50:
! 51: /* Set the calendar if passed */
! 52: ucal_obj = ucal_open(timezone_utf16, timezone_utf16_len, locale, calendar, &INTL_DATA_ERROR_CODE(dfo) );
! 53: udat_setCalendar( DATE_FORMAT_OBJECT(dfo), ucal_obj );
! 54: INTL_METHOD_CHECK_STATUS(dfo, "Error setting the calendar.");
! 55:
! 56: if( timezone_utf16){
! 57: efree(timezone_utf16);
! 58: }
! 59: }
! 60:
! 61: /* {{{ proto unicode IntlDateFormatter::getDateType( )
! 62: * Get formatter datetype. }}} */
! 63: /* {{{ proto string datefmt_get_datetype( IntlDateFormatter $mf )
! 64: * Get formatter datetype.
! 65: */
! 66: PHP_FUNCTION( datefmt_get_datetype )
! 67: {
! 68: DATE_FORMAT_METHOD_INIT_VARS;
! 69:
! 70: /* Parse parameters. */
! 71: if( zend_parse_method_parameters( ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &object, IntlDateFormatter_ce_ptr ) == FAILURE )
! 72: {
! 73: intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR,
! 74: "datefmt_get_datetype: unable to parse input params", 0 TSRMLS_CC );
! 75: RETURN_FALSE;
! 76: }
! 77:
! 78: /* Fetch the object. */
! 79: DATE_FORMAT_METHOD_FETCH_OBJECT;
! 80:
! 81: INTL_METHOD_CHECK_STATUS(dfo, "Error getting formatter datetype." );
! 82:
! 83: RETURN_LONG(dfo->date_type );
! 84: }
! 85: /* }}} */
! 86:
! 87: /* {{{ proto unicode IntlDateFormatter::getTimeType( )
! 88: * Get formatter timetype. }}} */
! 89: /* {{{ proto string datefmt_get_timetype( IntlDateFormatter $mf )
! 90: * Get formatter timetype.
! 91: */
! 92: PHP_FUNCTION( datefmt_get_timetype )
! 93: {
! 94: DATE_FORMAT_METHOD_INIT_VARS;
! 95:
! 96: /* Parse parameters. */
! 97: if( zend_parse_method_parameters( ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &object, IntlDateFormatter_ce_ptr ) == FAILURE )
! 98: {
! 99: intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR,
! 100: "datefmt_get_timetype: unable to parse input params", 0 TSRMLS_CC );
! 101: RETURN_FALSE;
! 102: }
! 103:
! 104: /* Fetch the object. */
! 105: DATE_FORMAT_METHOD_FETCH_OBJECT;
! 106:
! 107: INTL_METHOD_CHECK_STATUS(dfo, "Error getting formatter timetype." );
! 108:
! 109: RETURN_LONG(dfo->time_type );
! 110: }
! 111: /* }}} */
! 112:
! 113:
! 114: /* {{{ proto unicode IntlDateFormatter::getCalendar( )
! 115: * Get formatter calendar. }}} */
! 116: /* {{{ proto string datefmt_get_calendar( IntlDateFormatter $mf )
! 117: * Get formatter calendar.
! 118: */
! 119: PHP_FUNCTION( datefmt_get_calendar )
! 120: {
! 121: DATE_FORMAT_METHOD_INIT_VARS;
! 122:
! 123: /* Parse parameters. */
! 124: if( zend_parse_method_parameters( ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &object, IntlDateFormatter_ce_ptr ) == FAILURE )
! 125: {
! 126: intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR,
! 127: "datefmt_get_calendar: unable to parse input params", 0 TSRMLS_CC );
! 128: RETURN_FALSE;
! 129: }
! 130:
! 131: /* Fetch the object. */
! 132: DATE_FORMAT_METHOD_FETCH_OBJECT;
! 133:
! 134: INTL_METHOD_CHECK_STATUS(dfo, "Error getting formatter calendar." );
! 135:
! 136: RETURN_LONG(dfo->calendar);
! 137: }
! 138: /* }}} */
! 139:
! 140: /* {{{ proto unicode IntlDateFormatter::getTimeZoneId( )
! 141: * Get formatter timezone_id. }}} */
! 142: /* {{{ proto string datefmt_get_timezone_id( IntlDateFormatter $mf )
! 143: * Get formatter timezone_id.
! 144: */
! 145: PHP_FUNCTION( datefmt_get_timezone_id )
! 146: {
! 147: DATE_FORMAT_METHOD_INIT_VARS;
! 148:
! 149: /* Parse parameters. */
! 150: if( zend_parse_method_parameters( ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &object, IntlDateFormatter_ce_ptr ) == FAILURE )
! 151: {
! 152: intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR,
! 153: "datefmt_get_timezone_id: unable to parse input params", 0 TSRMLS_CC );
! 154: RETURN_FALSE;
! 155: }
! 156:
! 157: /* Fetch the object. */
! 158: DATE_FORMAT_METHOD_FETCH_OBJECT;
! 159:
! 160: INTL_METHOD_CHECK_STATUS(dfo, "Error getting formatter timezone_id." );
! 161:
! 162: if( dfo->timezone_id ){
! 163: RETURN_STRING((char*)dfo->timezone_id, TRUE );
! 164: }else{
! 165: RETURN_NULL();
! 166: }
! 167: }
! 168:
! 169: /* {{{ proto boolean IntlDateFormatter::setTimeZoneId( $timezone_id)
! 170: * Set formatter timezone_id. }}} */
! 171: /* {{{ proto boolean datefmt_set_timezone_id( IntlDateFormatter $mf,$timezone_id)
! 172: * Set formatter timezone_id.
! 173: */
! 174: PHP_FUNCTION( datefmt_set_timezone_id )
! 175: {
! 176: char* timezone_id = NULL;
! 177: int timezone_id_len = 0;
! 178:
! 179: DATE_FORMAT_METHOD_INIT_VARS;
! 180:
! 181: /* Parse parameters. */
! 182: if( zend_parse_method_parameters( ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os", &object, IntlDateFormatter_ce_ptr,&timezone_id, &timezone_id_len) == FAILURE )
! 183: {
! 184: intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR,
! 185: "datefmt_set_timezone_id: unable to parse input params", 0 TSRMLS_CC );
! 186: RETURN_FALSE;
! 187: }
! 188:
! 189: /* Fetch the object. */
! 190: DATE_FORMAT_METHOD_FETCH_OBJECT;
! 191:
! 192: /* set the timezone for the calendar */
! 193: internal_set_calendar( dfo, timezone_id, timezone_id_len, dfo->calendar, return_value TSRMLS_CC );
! 194:
! 195: /* Set the IntlDateFormatter variable */
! 196: if( dfo->timezone_id ){
! 197: efree(dfo->timezone_id);
! 198: }
! 199: dfo->timezone_id = estrndup(timezone_id, timezone_id_len);
! 200:
! 201: RETURN_TRUE;
! 202: }
! 203:
! 204: /* {{{ proto string IntlDateFormatter::getPattern( )
! 205: * Get formatter pattern. }}} */
! 206: /* {{{ proto string datefmt_get_pattern( IntlDateFormatter $mf )
! 207: * Get formatter pattern.
! 208: */
! 209: PHP_FUNCTION( datefmt_get_pattern )
! 210: {
! 211: UChar value_buf[64];
! 212: int length = USIZE( value_buf );
! 213: UChar* value = value_buf;
! 214: zend_bool is_pattern_localized =FALSE;
! 215:
! 216: DATE_FORMAT_METHOD_INIT_VARS;
! 217:
! 218: /* Parse parameters. */
! 219: if( zend_parse_method_parameters( ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &object, IntlDateFormatter_ce_ptr ) == FAILURE )
! 220: {
! 221: intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR,
! 222: "datefmt_get_pattern: unable to parse input params", 0 TSRMLS_CC );
! 223: RETURN_FALSE;
! 224: }
! 225:
! 226: /* Fetch the object. */
! 227: DATE_FORMAT_METHOD_FETCH_OBJECT;
! 228:
! 229: length = udat_toPattern(DATE_FORMAT_OBJECT(dfo), is_pattern_localized, value, length, &INTL_DATA_ERROR_CODE(dfo));
! 230: if(INTL_DATA_ERROR_CODE(dfo) == U_BUFFER_OVERFLOW_ERROR && length >= USIZE( value_buf )) {
! 231: ++length; /* to avoid U_STRING_NOT_TERMINATED_WARNING */
! 232: INTL_DATA_ERROR_CODE(dfo) = U_ZERO_ERROR;
! 233: value = eumalloc(length);
! 234: length = udat_toPattern(DATE_FORMAT_OBJECT(dfo), is_pattern_localized, value, length, &INTL_DATA_ERROR_CODE(dfo) );
! 235: if(U_FAILURE(INTL_DATA_ERROR_CODE(dfo))) {
! 236: efree(value);
! 237: value = value_buf;
! 238: }
! 239: }
! 240: INTL_METHOD_CHECK_STATUS(dfo, "Error getting formatter pattern" );
! 241:
! 242: INTL_METHOD_RETVAL_UTF8( dfo, value, length, ( value != value_buf ) );
! 243: }
! 244: /* }}} */
! 245:
! 246: /* {{{ proto bool IntlDateFormatter::setPattern( string $pattern )
! 247: * Set formatter pattern. }}} */
! 248: /* {{{ proto bool datefmt_set_pattern( IntlDateFormatter $mf, string $pattern )
! 249: * Set formatter pattern.
! 250: */
! 251: PHP_FUNCTION( datefmt_set_pattern )
! 252: {
! 253: char* value = NULL;
! 254: int value_len = 0;
! 255: int slength = 0;
! 256: UChar* svalue = NULL;
! 257: zend_bool is_pattern_localized =FALSE;
! 258:
! 259:
! 260: DATE_FORMAT_METHOD_INIT_VARS;
! 261:
! 262: /* Parse parameters. */
! 263: if( zend_parse_method_parameters( ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os",
! 264: &object, IntlDateFormatter_ce_ptr, &value, &value_len ) == FAILURE )
! 265: {
! 266: intl_error_set(NULL, U_ILLEGAL_ARGUMENT_ERROR,
! 267: "datefmt_set_pattern: unable to parse input params", 0 TSRMLS_CC);
! 268: RETURN_FALSE;
! 269: }
! 270:
! 271: DATE_FORMAT_METHOD_FETCH_OBJECT;
! 272:
! 273: /* Convert given pattern to UTF-16. */
! 274: intl_convert_utf8_to_utf16(&svalue, &slength, value, value_len, &INTL_DATA_ERROR_CODE(dfo));
! 275: INTL_METHOD_CHECK_STATUS(dfo, "Error converting pattern to UTF-16" );
! 276:
! 277: udat_applyPattern(DATE_FORMAT_OBJECT(dfo), (UBool)is_pattern_localized, svalue, slength);
! 278:
! 279: if (svalue) {
! 280: efree(svalue);
! 281: }
! 282: INTL_METHOD_CHECK_STATUS(dfo, "Error setting symbol value");
! 283:
! 284: RETURN_TRUE;
! 285: }
! 286: /* }}} */
! 287:
! 288: /* {{{ proto string IntlDateFormatter::getLocale()
! 289: * Get formatter locale. }}} */
! 290: /* {{{ proto string datefmt_get_locale(IntlDateFormatter $mf)
! 291: * Get formatter locale.
! 292: */
! 293: PHP_FUNCTION( datefmt_get_locale )
! 294: {
! 295: char *loc;
! 296: long loc_type =ULOC_ACTUAL_LOCALE;
! 297:
! 298: DATE_FORMAT_METHOD_INIT_VARS;
! 299:
! 300: /* Parse parameters. */
! 301: if( zend_parse_method_parameters( ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O|l",
! 302: &object, IntlDateFormatter_ce_ptr,&loc_type) == FAILURE )
! 303: {
! 304: intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR,
! 305: "datefmt_get_locale: unable to parse input params", 0 TSRMLS_CC );
! 306:
! 307: RETURN_FALSE;
! 308: }
! 309:
! 310: /* Fetch the object. */
! 311: DATE_FORMAT_METHOD_FETCH_OBJECT;
! 312:
! 313: loc = (char *)udat_getLocaleByType(DATE_FORMAT_OBJECT(dfo), loc_type,&INTL_DATA_ERROR_CODE(dfo));
! 314: INTL_METHOD_CHECK_STATUS(dfo, "Error getting locale");
! 315: RETURN_STRING(loc, 1);
! 316: }
! 317: /* }}} */
! 318:
! 319: /* {{{ proto string IntlDateFormatter::isLenient()
! 320: * Get formatter isLenient. }}} */
! 321: /* {{{ proto string datefmt_isLenient(IntlDateFormatter $mf)
! 322: * Get formatter locale.
! 323: */
! 324: PHP_FUNCTION( datefmt_is_lenient )
! 325: {
! 326:
! 327: DATE_FORMAT_METHOD_INIT_VARS;
! 328:
! 329: /* Parse parameters. */
! 330: if( zend_parse_method_parameters( ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O",
! 331: &object, IntlDateFormatter_ce_ptr ) == FAILURE )
! 332: {
! 333: intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR,
! 334: "datefmt_is_lenient: unable to parse input params", 0 TSRMLS_CC );
! 335:
! 336: RETURN_FALSE;
! 337: }
! 338:
! 339: /* Fetch the object. */
! 340: DATE_FORMAT_METHOD_FETCH_OBJECT;
! 341:
! 342: RETVAL_BOOL(udat_isLenient(DATE_FORMAT_OBJECT(dfo)));
! 343: }
! 344: /* }}} */
! 345:
! 346: /* {{{ proto string IntlDateFormatter::setLenient()
! 347: * Set formatter lenient. }}} */
! 348: /* {{{ proto string datefmt_setLenient(IntlDateFormatter $mf)
! 349: * Set formatter lenient.
! 350: */
! 351: PHP_FUNCTION( datefmt_set_lenient )
! 352: {
! 353: zend_bool isLenient = FALSE;
! 354:
! 355: DATE_FORMAT_METHOD_INIT_VARS;
! 356:
! 357: /* Parse parameters. */
! 358: if( zend_parse_method_parameters( ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Ob",
! 359: &object, IntlDateFormatter_ce_ptr,&isLenient ) == FAILURE )
! 360: {
! 361: intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR,
! 362: "datefmt_set_lenient: unable to parse input params", 0 TSRMLS_CC );
! 363: RETURN_FALSE;
! 364: }
! 365:
! 366: /* Fetch the object. */
! 367: DATE_FORMAT_METHOD_FETCH_OBJECT;
! 368:
! 369: udat_setLenient(DATE_FORMAT_OBJECT(dfo), (UBool)isLenient );
! 370: }
! 371: /* }}} */
! 372:
! 373: /* {{{ proto bool IntlDateFormatter::setPattern( int $calendar )
! 374: * Set formatter calendar. }}} */
! 375: /* {{{ proto bool datefmt_set_calendar( IntlDateFormatter $mf, int $calendar )
! 376: * Set formatter calendar.
! 377: */
! 378: PHP_FUNCTION( datefmt_set_calendar )
! 379: {
! 380: long calendar = 0;
! 381:
! 382: DATE_FORMAT_METHOD_INIT_VARS;
! 383:
! 384: /* Parse parameters. */
! 385: if( zend_parse_method_parameters( ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Ol",
! 386: &object, IntlDateFormatter_ce_ptr, &calendar ) == FAILURE ) {
! 387: intl_error_set(NULL, U_ILLEGAL_ARGUMENT_ERROR,
! 388: "datefmt_set_calendar: unable to parse input params", 0 TSRMLS_CC);
! 389: RETURN_FALSE;
! 390: }
! 391:
! 392: /* check for the validity of value of calendar passed */
! 393: intl_error_reset( NULL TSRMLS_CC );
! 394: if (calendar > 1) {
! 395: intl_error_set(NULL, U_ILLEGAL_ARGUMENT_ERROR,
! 396: "datefmt_set_calendar: calendar value specified is out of valid range", 0 TSRMLS_CC);
! 397: RETURN_FALSE;
! 398: }
! 399:
! 400: DATE_FORMAT_METHOD_FETCH_OBJECT;
! 401:
! 402: internal_set_calendar( dfo, dfo->timezone_id, strlen(dfo->timezone_id), calendar, return_value TSRMLS_CC );
! 403:
! 404: /* Set the calendar value in the IntlDateFormatter object */
! 405: dfo->calendar = calendar;
! 406:
! 407: RETURN_TRUE;
! 408: }
! 409: /* }}} */
! 410:
! 411:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>