Annotation of embedaddon/php/ext/intl/formatter/formatter_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: Stanislav Malyshev <stas@zend.com> |
! 14: +----------------------------------------------------------------------+
! 15: */
! 16:
! 17: #ifdef HAVE_CONFIG_H
! 18: #include "config.h"
! 19: #endif
! 20:
! 21: #include "php_intl.h"
! 22: #include "formatter_class.h"
! 23: #include "formatter_attr.h"
! 24: #include "intl_convert.h"
! 25:
! 26: #include <unicode/ustring.h>
! 27:
! 28: /* {{{ proto mixed NumberFormatter::getAttribute( int $attr )
! 29: * Get formatter attribute value. }}} */
! 30: /* {{{ proto mixed numfmt_get_attribute( NumberFormatter $nf, int $attr )
! 31: * Get formatter attribute value.
! 32: */
! 33: PHP_FUNCTION( numfmt_get_attribute )
! 34: {
! 35: long attribute, value;
! 36: FORMATTER_METHOD_INIT_VARS;
! 37:
! 38: /* Parse parameters. */
! 39: if( zend_parse_method_parameters( ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Ol",
! 40: &object, NumberFormatter_ce_ptr, &attribute ) == FAILURE )
! 41: {
! 42: intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR,
! 43: "numfmt_get_attribute: unable to parse input params", 0 TSRMLS_CC );
! 44:
! 45: RETURN_FALSE;
! 46: }
! 47:
! 48: /* Fetch the object. */
! 49: FORMATTER_METHOD_FETCH_OBJECT;
! 50:
! 51: switch(attribute) {
! 52: case UNUM_PARSE_INT_ONLY:
! 53: case UNUM_GROUPING_USED:
! 54: case UNUM_DECIMAL_ALWAYS_SHOWN:
! 55: case UNUM_MAX_INTEGER_DIGITS:
! 56: case UNUM_MIN_INTEGER_DIGITS:
! 57: case UNUM_INTEGER_DIGITS:
! 58: case UNUM_MAX_FRACTION_DIGITS:
! 59: case UNUM_MIN_FRACTION_DIGITS:
! 60: case UNUM_FRACTION_DIGITS:
! 61: case UNUM_MULTIPLIER:
! 62: case UNUM_GROUPING_SIZE:
! 63: case UNUM_ROUNDING_MODE:
! 64: case UNUM_FORMAT_WIDTH:
! 65: case UNUM_PADDING_POSITION:
! 66: case UNUM_SECONDARY_GROUPING_SIZE:
! 67: case UNUM_SIGNIFICANT_DIGITS_USED:
! 68: case UNUM_MIN_SIGNIFICANT_DIGITS:
! 69: case UNUM_MAX_SIGNIFICANT_DIGITS:
! 70: case UNUM_LENIENT_PARSE:
! 71: value = unum_getAttribute(FORMATTER_OBJECT(nfo), attribute);
! 72: if(value == -1) {
! 73: INTL_DATA_ERROR_CODE(nfo) = U_UNSUPPORTED_ERROR;
! 74: } else {
! 75: RETVAL_LONG(value);
! 76: }
! 77: break;
! 78: case UNUM_ROUNDING_INCREMENT:
! 79: {
! 80: double value_double = unum_getDoubleAttribute(FORMATTER_OBJECT(nfo), attribute);
! 81: if(value_double == -1) {
! 82: INTL_DATA_ERROR_CODE(nfo) = U_UNSUPPORTED_ERROR;
! 83: } else {
! 84: RETVAL_DOUBLE(value_double);
! 85: }
! 86: }
! 87: break;
! 88: default:
! 89: INTL_DATA_ERROR_CODE(nfo) = U_UNSUPPORTED_ERROR;
! 90: break;
! 91: }
! 92:
! 93: INTL_METHOD_CHECK_STATUS( nfo, "Error getting attribute value" );
! 94: }
! 95: /* }}} */
! 96:
! 97: /* {{{ proto string NumberFormatter::getTextAttribute( int $attr )
! 98: * Get formatter attribute value. }}} */
! 99: /* {{{ proto string numfmt_get_text_attribute( NumberFormatter $nf, int $attr )
! 100: * Get formatter attribute value.
! 101: */
! 102: PHP_FUNCTION( numfmt_get_text_attribute )
! 103: {
! 104: long attribute;
! 105: UChar value_buf[64];
! 106: int value_buf_size = USIZE( value_buf );
! 107: UChar* value = value_buf;
! 108: int length = 0;
! 109: FORMATTER_METHOD_INIT_VARS;
! 110:
! 111: /* Parse parameters. */
! 112: if( zend_parse_method_parameters( ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Ol",
! 113: &object, NumberFormatter_ce_ptr, &attribute ) == FAILURE )
! 114: {
! 115: intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR,
! 116: "numfmt_get_text_attribute: unable to parse input params", 0 TSRMLS_CC );
! 117:
! 118: RETURN_FALSE;
! 119: }
! 120:
! 121: /* Fetch the object. */
! 122: FORMATTER_METHOD_FETCH_OBJECT;
! 123:
! 124: length = unum_getTextAttribute( FORMATTER_OBJECT(nfo), attribute, value, value_buf_size, &INTL_DATA_ERROR_CODE(nfo) );
! 125: if(INTL_DATA_ERROR_CODE(nfo) == U_BUFFER_OVERFLOW_ERROR && length >= value_buf_size) {
! 126: ++length; /* to avoid U_STRING_NOT_TERMINATED_WARNING */
! 127: INTL_DATA_ERROR_CODE(nfo) = U_ZERO_ERROR;
! 128: value = eumalloc(length);
! 129: length = unum_getTextAttribute( FORMATTER_OBJECT(nfo), attribute, value, length, &INTL_DATA_ERROR_CODE(nfo) );
! 130: if(U_FAILURE(INTL_DATA_ERROR_CODE(nfo))) {
! 131: efree(value);
! 132: value = value_buf;
! 133: }
! 134: }
! 135: INTL_METHOD_CHECK_STATUS( nfo, "Error getting attribute value" );
! 136:
! 137: INTL_METHOD_RETVAL_UTF8( nfo, value, length, ( value != value_buf ) );
! 138: }
! 139: /* }}} */
! 140:
! 141: /* {{{ proto bool NumberFormatter::setAttribute( int $attr, mixed $value )
! 142: * Get formatter attribute value. }}} */
! 143: /* {{{ proto bool numfmt_set_attribute( NumberFormatter $nf, int $attr, mixed $value )
! 144: * Get formatter attribute value.
! 145: */
! 146: PHP_FUNCTION( numfmt_set_attribute )
! 147: {
! 148: long attribute;
! 149: zval **value;
! 150: FORMATTER_METHOD_INIT_VARS;
! 151:
! 152: /* Parse parameters. */
! 153: if( zend_parse_method_parameters( ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "OlZ",
! 154: &object, NumberFormatter_ce_ptr, &attribute, &value ) == FAILURE)
! 155: {
! 156: intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR,
! 157: "numfmt_set_attribute: unable to parse input params", 0 TSRMLS_CC );
! 158:
! 159: RETURN_FALSE;
! 160: }
! 161:
! 162: /* Fetch the object. */
! 163: FORMATTER_METHOD_FETCH_OBJECT;
! 164:
! 165: switch(attribute) {
! 166: case UNUM_PARSE_INT_ONLY:
! 167: case UNUM_GROUPING_USED:
! 168: case UNUM_DECIMAL_ALWAYS_SHOWN:
! 169: case UNUM_MAX_INTEGER_DIGITS:
! 170: case UNUM_MIN_INTEGER_DIGITS:
! 171: case UNUM_INTEGER_DIGITS:
! 172: case UNUM_MAX_FRACTION_DIGITS:
! 173: case UNUM_MIN_FRACTION_DIGITS:
! 174: case UNUM_FRACTION_DIGITS:
! 175: case UNUM_MULTIPLIER:
! 176: case UNUM_GROUPING_SIZE:
! 177: case UNUM_ROUNDING_MODE:
! 178: case UNUM_FORMAT_WIDTH:
! 179: case UNUM_PADDING_POSITION:
! 180: case UNUM_SECONDARY_GROUPING_SIZE:
! 181: case UNUM_SIGNIFICANT_DIGITS_USED:
! 182: case UNUM_MIN_SIGNIFICANT_DIGITS:
! 183: case UNUM_MAX_SIGNIFICANT_DIGITS:
! 184: case UNUM_LENIENT_PARSE:
! 185: convert_to_long_ex(value);
! 186: unum_setAttribute(FORMATTER_OBJECT(nfo), attribute, Z_LVAL_PP(value));
! 187: break;
! 188: case UNUM_ROUNDING_INCREMENT:
! 189: convert_to_double_ex(value);
! 190: unum_setDoubleAttribute(FORMATTER_OBJECT(nfo), attribute, Z_DVAL_PP(value));
! 191: break;
! 192: default:
! 193: INTL_DATA_ERROR_CODE(nfo) = U_UNSUPPORTED_ERROR;
! 194: break;
! 195: }
! 196:
! 197: INTL_METHOD_CHECK_STATUS( nfo, "Error setting attribute value" );
! 198:
! 199: RETURN_TRUE;
! 200: }
! 201: /* }}} */
! 202:
! 203: /* {{{ proto bool NumberFormatter::setTextAttribute( int $attr, string $value )
! 204: * Get formatter attribute value. }}} */
! 205: /* {{{ proto bool numfmt_set_text_attribute( NumberFormatter $nf, int $attr, string $value )
! 206: * Get formatter attribute value.
! 207: */
! 208: PHP_FUNCTION( numfmt_set_text_attribute )
! 209: {
! 210: int slength = 0;
! 211: UChar *svalue = NULL;
! 212: long attribute;
! 213: char *value;
! 214: int len;
! 215: FORMATTER_METHOD_INIT_VARS;
! 216:
! 217: /* Parse parameters. */
! 218: if( zend_parse_method_parameters( ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Ols",
! 219: &object, NumberFormatter_ce_ptr, &attribute, &value, &len ) == FAILURE)
! 220: {
! 221: intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR,
! 222: "numfmt_set_text_attribute: unable to parse input params", 0 TSRMLS_CC );
! 223:
! 224: RETURN_FALSE;
! 225: }
! 226:
! 227: /* Fetch the object. */
! 228: FORMATTER_METHOD_FETCH_OBJECT;
! 229:
! 230: /* Convert given attribute value to UTF-16. */
! 231: intl_convert_utf8_to_utf16(&svalue, &slength, value, len, &INTL_DATA_ERROR_CODE(nfo));
! 232: INTL_METHOD_CHECK_STATUS( nfo, "Error converting attribute value to UTF-16" );
! 233:
! 234: /* Actually set new attribute value. */
! 235: unum_setTextAttribute(FORMATTER_OBJECT(nfo), attribute, svalue, slength, &INTL_DATA_ERROR_CODE(nfo));
! 236: if (svalue) {
! 237: efree(svalue);
! 238: }
! 239: INTL_METHOD_CHECK_STATUS( nfo, "Error setting text attribute" );
! 240:
! 241: RETURN_TRUE;
! 242: }
! 243: /* }}} */
! 244:
! 245: /* {{{ proto string NumberFormatter::getSymbol( int $attr )
! 246: * Get formatter symbol value. }}} */
! 247: /* {{{ proto string numfmt_get_symbol( NumberFormatter $nf, int $attr )
! 248: * Get formatter symbol value.
! 249: */
! 250: PHP_FUNCTION( numfmt_get_symbol )
! 251: {
! 252: long symbol;
! 253: UChar value_buf[4];
! 254: UChar *value = value_buf;
! 255: int length = USIZE(value_buf);
! 256: FORMATTER_METHOD_INIT_VARS;
! 257:
! 258: /* Parse parameters. */
! 259: if( zend_parse_method_parameters( ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Ol",
! 260: &object, NumberFormatter_ce_ptr, &symbol ) == FAILURE )
! 261: {
! 262: intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR,
! 263: "numfmt_get_symbol: unable to parse input params", 0 TSRMLS_CC );
! 264:
! 265: RETURN_FALSE;
! 266: }
! 267:
! 268: if(symbol >= UNUM_FORMAT_SYMBOL_COUNT || symbol < 0) {
! 269: intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR, "numfmt_get_symbol: invalid symbol value", 0 TSRMLS_CC );
! 270: RETURN_FALSE;
! 271: }
! 272:
! 273: /* Fetch the object. */
! 274: FORMATTER_METHOD_FETCH_OBJECT;
! 275:
! 276: length = unum_getSymbol(FORMATTER_OBJECT(nfo), symbol, value_buf, length, &INTL_DATA_ERROR_CODE(nfo));
! 277: if(INTL_DATA_ERROR_CODE(nfo) == U_BUFFER_OVERFLOW_ERROR && length >= USIZE( value_buf )) {
! 278: ++length; /* to avoid U_STRING_NOT_TERMINATED_WARNING */
! 279: INTL_DATA_ERROR_CODE(nfo) = U_ZERO_ERROR;
! 280: value = eumalloc(length);
! 281: length = unum_getSymbol(FORMATTER_OBJECT(nfo), symbol, value, length, &INTL_DATA_ERROR_CODE(nfo));
! 282: if(U_FAILURE(INTL_DATA_ERROR_CODE(nfo))) {
! 283: efree(value);
! 284: value = value_buf;
! 285: }
! 286: }
! 287: INTL_METHOD_CHECK_STATUS( nfo, "Error getting symbol value" );
! 288:
! 289: INTL_METHOD_RETVAL_UTF8( nfo, value, length, ( value_buf != value ) );
! 290: }
! 291: /* }}} */
! 292:
! 293: /* {{{ proto bool NumberFormatter::setSymbol( int $attr, string $symbol )
! 294: * Set formatter symbol value. }}} */
! 295: /* {{{ proto bool numfmt_set_symbol( NumberFormatter $nf, int $attr, string $symbol )
! 296: * Set formatter symbol value.
! 297: */
! 298: PHP_FUNCTION( numfmt_set_symbol )
! 299: {
! 300: long symbol;
! 301: char* value = NULL;
! 302: int value_len = 0;
! 303: UChar* svalue = 0;
! 304: int slength = 0;
! 305: FORMATTER_METHOD_INIT_VARS;
! 306:
! 307: /* Parse parameters. */
! 308: if( zend_parse_method_parameters( ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Ols",
! 309: &object, NumberFormatter_ce_ptr, &symbol, &value, &value_len ) == FAILURE )
! 310: {
! 311: intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR,
! 312: "numfmt_set_symbol: unable to parse input params", 0 TSRMLS_CC );
! 313:
! 314: RETURN_FALSE;
! 315: }
! 316:
! 317: if (symbol >= UNUM_FORMAT_SYMBOL_COUNT || symbol < 0) {
! 318: intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR, "numfmt_set_symbol: invalid symbol value", 0 TSRMLS_CC );
! 319: RETURN_FALSE;
! 320: }
! 321:
! 322: /* Fetch the object. */
! 323: FORMATTER_METHOD_FETCH_OBJECT;
! 324:
! 325: /* Convert given symbol to UTF-16. */
! 326: intl_convert_utf8_to_utf16(&svalue, &slength, value, value_len, &INTL_DATA_ERROR_CODE(nfo));
! 327: INTL_METHOD_CHECK_STATUS( nfo, "Error converting symbol value to UTF-16" );
! 328:
! 329: /* Actually set the symbol. */
! 330: unum_setSymbol(FORMATTER_OBJECT(nfo), symbol, svalue, slength, &INTL_DATA_ERROR_CODE(nfo));
! 331: if (svalue) {
! 332: efree(svalue);
! 333: }
! 334: INTL_METHOD_CHECK_STATUS( nfo, "Error setting symbol value" );
! 335:
! 336: RETURN_TRUE;
! 337: }
! 338: /* }}} */
! 339:
! 340: /* {{{ proto string NumberFormatter::getPattern( )
! 341: * Get formatter pattern. }}} */
! 342: /* {{{ proto string numfmt_get_pattern( NumberFormatter $nf )
! 343: * Get formatter pattern.
! 344: */
! 345: PHP_FUNCTION( numfmt_get_pattern )
! 346: {
! 347: UChar value_buf[64];
! 348: int length = USIZE( value_buf );
! 349: UChar* value = value_buf;
! 350: FORMATTER_METHOD_INIT_VARS;
! 351:
! 352: /* Parse parameters. */
! 353: if( zend_parse_method_parameters( ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O",
! 354: &object, NumberFormatter_ce_ptr ) == FAILURE )
! 355: {
! 356: intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR,
! 357: "numfmt_get_pattern: unable to parse input params", 0 TSRMLS_CC );
! 358:
! 359: RETURN_FALSE;
! 360: }
! 361:
! 362: /* Fetch the object. */
! 363: FORMATTER_METHOD_FETCH_OBJECT;
! 364:
! 365: length = unum_toPattern(FORMATTER_OBJECT(nfo), 0, value, length, &INTL_DATA_ERROR_CODE(nfo));
! 366: if(INTL_DATA_ERROR_CODE(nfo) == U_BUFFER_OVERFLOW_ERROR && length >= USIZE( value_buf )) {
! 367: ++length; /* to avoid U_STRING_NOT_TERMINATED_WARNING */
! 368: INTL_DATA_ERROR_CODE(nfo) = U_ZERO_ERROR;
! 369: value = eumalloc(length);
! 370: length = unum_toPattern( FORMATTER_OBJECT(nfo), 0, value, length, &INTL_DATA_ERROR_CODE(nfo) );
! 371: if(U_FAILURE(INTL_DATA_ERROR_CODE(nfo))) {
! 372: efree(value);
! 373: value = value_buf;
! 374: }
! 375: }
! 376: INTL_METHOD_CHECK_STATUS( nfo, "Error getting formatter pattern" );
! 377:
! 378: INTL_METHOD_RETVAL_UTF8( nfo, value, length, ( value != value_buf ) );
! 379: }
! 380: /* }}} */
! 381:
! 382: /* {{{ proto bool NumberFormatter::setPattern( string $pattern )
! 383: * Set formatter pattern. }}} */
! 384: /* {{{ proto bool numfmt_set_pattern( NumberFormatter $nf, string $pattern )
! 385: * Set formatter pattern.
! 386: */
! 387: PHP_FUNCTION( numfmt_set_pattern )
! 388: {
! 389: char* value = NULL;
! 390: int value_len = 0;
! 391: int slength = 0;
! 392: UChar* svalue = NULL;
! 393: FORMATTER_METHOD_INIT_VARS;
! 394:
! 395: /* Parse parameters. */
! 396: if( zend_parse_method_parameters( ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os",
! 397: &object, NumberFormatter_ce_ptr, &value, &value_len ) == FAILURE )
! 398: {
! 399: intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR,
! 400: "numfmt_set_pattern: unable to parse input params", 0 TSRMLS_CC );
! 401:
! 402: RETURN_FALSE;
! 403: }
! 404:
! 405: FORMATTER_METHOD_FETCH_OBJECT;
! 406:
! 407: /* Convert given pattern to UTF-16. */
! 408: intl_convert_utf8_to_utf16(&svalue, &slength, value, value_len, &INTL_DATA_ERROR_CODE(nfo));
! 409: INTL_METHOD_CHECK_STATUS( nfo, "Error converting pattern to UTF-16" );
! 410:
! 411: /* TODO: add parse error information */
! 412: unum_applyPattern(FORMATTER_OBJECT(nfo), 0, svalue, slength, NULL, &INTL_DATA_ERROR_CODE(nfo));
! 413: if (svalue) {
! 414: efree(svalue);
! 415: }
! 416: INTL_METHOD_CHECK_STATUS( nfo, "Error setting pattern value" );
! 417:
! 418: RETURN_TRUE;
! 419: }
! 420: /* }}} */
! 421:
! 422: /* {{{ proto string NumberFormatter::getLocale([int type])
! 423: * Get formatter locale. }}} */
! 424: /* {{{ proto string numfmt_get_locale( NumberFormatter $nf[, int type] )
! 425: * Get formatter locale.
! 426: */
! 427: PHP_FUNCTION( numfmt_get_locale )
! 428: {
! 429: long type = ULOC_ACTUAL_LOCALE;
! 430: char* loc;
! 431: FORMATTER_METHOD_INIT_VARS;
! 432:
! 433: /* Parse parameters. */
! 434: if( zend_parse_method_parameters( ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O|l",
! 435: &object, NumberFormatter_ce_ptr, &type ) == FAILURE )
! 436: {
! 437: intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR,
! 438: "numfmt_get_locale: unable to parse input params", 0 TSRMLS_CC );
! 439:
! 440: RETURN_FALSE;
! 441: }
! 442:
! 443: /* Fetch the object. */
! 444: FORMATTER_METHOD_FETCH_OBJECT;
! 445:
! 446: loc = (char *)unum_getLocaleByType(FORMATTER_OBJECT(nfo), type, &INTL_DATA_ERROR_CODE(nfo));
! 447: INTL_METHOD_CHECK_STATUS( nfo, "Error getting locale" );
! 448: RETURN_STRING(loc, 1);
! 449: }
! 450: /* }}} */
! 451:
! 452: /*
! 453: * Local variables:
! 454: * tab-width: 4
! 455: * c-basic-offset: 4
! 456: * End:
! 457: * vim600: noet sw=4 ts=4 fdm=marker
! 458: * vim<600: noet sw=4 ts=4
! 459: */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>