This source file includes following definitions.
- PHP_FUNCTION
- PHP_FUNCTION
- PHP_FUNCTION
- PHP_FUNCTION
- PHP_FUNCTION
- PHP_FUNCTION
- PHP_FUNCTION
- PHP_FUNCTION
- PHP_FUNCTION
1
2
3
4
5
6
7
8
9
10
11
12
13
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
29
30
31
32
33 PHP_FUNCTION( numfmt_get_attribute )
34 {
35 zend_long attribute, value;
36 FORMATTER_METHOD_INIT_VARS;
37
38
39 if( zend_parse_method_parameters( ZEND_NUM_ARGS(), 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 );
44
45 RETURN_FALSE;
46 }
47
48
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
98
99
100
101
102 PHP_FUNCTION( numfmt_get_text_attribute )
103 {
104 zend_long attribute;
105 UChar value_buf[64];
106 int32_t value_buf_size = USIZE( value_buf );
107 UChar* value = value_buf;
108 int32_t length = 0;
109 FORMATTER_METHOD_INIT_VARS;
110
111
112 if( zend_parse_method_parameters( ZEND_NUM_ARGS(), 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 );
117
118 RETURN_FALSE;
119 }
120
121
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;
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
142
143
144
145
146 PHP_FUNCTION( numfmt_set_attribute )
147 {
148 zend_long attribute;
149 zval *value;
150 FORMATTER_METHOD_INIT_VARS;
151
152
153 if( zend_parse_method_parameters( ZEND_NUM_ARGS(), 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 );
158
159 RETURN_FALSE;
160 }
161
162
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_P(value));
187 break;
188 case UNUM_ROUNDING_INCREMENT:
189 convert_to_double_ex(value);
190 unum_setDoubleAttribute(FORMATTER_OBJECT(nfo), attribute, Z_DVAL_P(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
204
205
206
207
208 PHP_FUNCTION( numfmt_set_text_attribute )
209 {
210 int32_t slength = 0;
211 UChar *svalue = NULL;
212 zend_long attribute;
213 char *value;
214 size_t len;
215 FORMATTER_METHOD_INIT_VARS;
216
217
218 if( zend_parse_method_parameters( ZEND_NUM_ARGS(), 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 );
223
224 RETURN_FALSE;
225 }
226
227
228 FORMATTER_METHOD_FETCH_OBJECT;
229
230
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
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
246
247
248
249
250 PHP_FUNCTION( numfmt_get_symbol )
251 {
252 zend_long symbol;
253 UChar value_buf[4];
254 UChar *value = value_buf;
255 int32_t length = USIZE(value_buf);
256 FORMATTER_METHOD_INIT_VARS;
257
258
259 if( zend_parse_method_parameters( ZEND_NUM_ARGS(), 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 );
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 );
270 RETURN_FALSE;
271 }
272
273
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;
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
294
295
296
297
298 PHP_FUNCTION( numfmt_set_symbol )
299 {
300 zend_long symbol;
301 char* value = NULL;
302 size_t value_len = 0;
303 UChar* svalue = 0;
304 int32_t slength = 0;
305 FORMATTER_METHOD_INIT_VARS;
306
307
308 if( zend_parse_method_parameters( ZEND_NUM_ARGS(), 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 );
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 );
319 RETURN_FALSE;
320 }
321
322
323 FORMATTER_METHOD_FETCH_OBJECT;
324
325
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
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
341
342
343
344
345 PHP_FUNCTION( numfmt_get_pattern )
346 {
347 UChar value_buf[64];
348 int32_t length = USIZE( value_buf );
349 UChar* value = value_buf;
350 FORMATTER_METHOD_INIT_VARS;
351
352
353 if( zend_parse_method_parameters( ZEND_NUM_ARGS(), 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 );
358
359 RETURN_FALSE;
360 }
361
362
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;
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
383
384
385
386
387 PHP_FUNCTION( numfmt_set_pattern )
388 {
389 char* value = NULL;
390 size_t value_len = 0;
391 int32_t slength = 0;
392 UChar* svalue = NULL;
393 FORMATTER_METHOD_INIT_VARS;
394
395
396 if( zend_parse_method_parameters( ZEND_NUM_ARGS(), 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 );
401
402 RETURN_FALSE;
403 }
404
405 FORMATTER_METHOD_FETCH_OBJECT;
406
407
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
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
423
424
425
426
427 PHP_FUNCTION( numfmt_get_locale )
428 {
429 zend_long type = ULOC_ACTUAL_LOCALE;
430 char* loc;
431 FORMATTER_METHOD_INIT_VARS;
432
433
434 if( zend_parse_method_parameters( ZEND_NUM_ARGS(), 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 );
439
440 RETURN_FALSE;
441 }
442
443
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);
449 }
450
451
452
453
454
455
456
457
458
459