Annotation of embedaddon/php/ext/intl/formatter/formatter_attr.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: 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>