php-internal-docs 8.4.8
Unofficial docs for php/php-src
Loading...
Searching...
No Matches
formatter_attr.c
Go to the documentation of this file.
1/*
2 +----------------------------------------------------------------------+
3 | This source file is subject to version 3.01 of the PHP license, |
4 | that is bundled with this package in the file LICENSE, and is |
5 | available through the world-wide-web at the following url: |
6 | https://www.php.net/license/3_01.txt |
7 | If you did not receive a copy of the PHP license and are unable to |
8 | obtain it through the world-wide-web, please send a note to |
9 | license@php.net so we can mail you a copy immediately. |
10 +----------------------------------------------------------------------+
11 | Authors: Stanislav Malyshev <stas@zend.com> |
12 +----------------------------------------------------------------------+
13 */
14
15#ifdef HAVE_CONFIG_H
16#include <config.h>
17#endif
18
19#include "php_intl.h"
20#include "formatter_class.h"
21#include "intl_convert.h"
22
23#include <unicode/ustring.h>
24
25/* {{{ Get formatter attribute value. */
27{
28 zend_long attribute, value;
30
31 /* Parse parameters. */
33 &object, NumberFormatter_ce_ptr, &attribute ) == FAILURE )
34 {
36 }
37
38 /* Fetch the object. */
40
41 switch(attribute) {
42 case UNUM_PARSE_INT_ONLY:
43 case UNUM_GROUPING_USED:
44 case UNUM_DECIMAL_ALWAYS_SHOWN:
45 case UNUM_MAX_INTEGER_DIGITS:
46 case UNUM_MIN_INTEGER_DIGITS:
47 case UNUM_INTEGER_DIGITS:
48 case UNUM_MAX_FRACTION_DIGITS:
49 case UNUM_MIN_FRACTION_DIGITS:
50 case UNUM_FRACTION_DIGITS:
51 case UNUM_MULTIPLIER:
52 case UNUM_GROUPING_SIZE:
53 case UNUM_ROUNDING_MODE:
54 case UNUM_FORMAT_WIDTH:
55 case UNUM_PADDING_POSITION:
56 case UNUM_SECONDARY_GROUPING_SIZE:
57 case UNUM_SIGNIFICANT_DIGITS_USED:
58 case UNUM_MIN_SIGNIFICANT_DIGITS:
59 case UNUM_MAX_SIGNIFICANT_DIGITS:
60 case UNUM_LENIENT_PARSE:
61 value = unum_getAttribute(FORMATTER_OBJECT(nfo), attribute);
62 if(value == -1) {
64 } else {
66 }
67 break;
68 case UNUM_ROUNDING_INCREMENT:
69 {
70 double value_double = unum_getDoubleAttribute(FORMATTER_OBJECT(nfo), attribute);
71 if(value_double == -1) {
73 } else {
74 RETVAL_DOUBLE(value_double);
75 }
76 }
77 break;
78 default:
80 break;
81 }
82
83 INTL_METHOD_CHECK_STATUS( nfo, "Error getting attribute value" );
84}
85/* }}} */
86
87/* {{{ Get formatter attribute value. */
89{
90 zend_long attribute;
91 UChar value_buf[64];
92 int32_t value_buf_size = USIZE( value_buf );
93 UChar* value = value_buf;
94 int32_t length = 0;
96
97 /* Parse parameters. */
99 &object, NumberFormatter_ce_ptr, &attribute ) == FAILURE )
100 {
102 }
103
104 /* Fetch the object. */
106
107 length = unum_getTextAttribute( FORMATTER_OBJECT(nfo), attribute, value, value_buf_size, &INTL_DATA_ERROR_CODE(nfo) );
108 if(INTL_DATA_ERROR_CODE(nfo) == U_BUFFER_OVERFLOW_ERROR && length >= value_buf_size) {
109 ++length; /* to avoid U_STRING_NOT_TERMINATED_WARNING */
111 value = eumalloc(length);
112 length = unum_getTextAttribute( FORMATTER_OBJECT(nfo), attribute, value, length, &INTL_DATA_ERROR_CODE(nfo) );
113 if(U_FAILURE(INTL_DATA_ERROR_CODE(nfo))) {
114 efree(value);
115 value = value_buf;
116 }
117 }
118 INTL_METHOD_CHECK_STATUS( nfo, "Error getting attribute value" );
119
120 INTL_METHOD_RETVAL_UTF8( nfo, value, length, ( value != value_buf ) );
121}
122/* }}} */
123
124/* {{{ Get formatter attribute value. */
126{
127 zend_long attribute;
128 zval *value;
130
131 /* Parse parameters. */
133 &object, NumberFormatter_ce_ptr, &attribute, &value ) == FAILURE)
134 {
136 }
137
138 /* Fetch the object. */
140
141 switch(attribute) {
142 case UNUM_PARSE_INT_ONLY:
143 case UNUM_GROUPING_USED:
144 case UNUM_DECIMAL_ALWAYS_SHOWN:
145 case UNUM_MAX_INTEGER_DIGITS:
146 case UNUM_MIN_INTEGER_DIGITS:
147 case UNUM_INTEGER_DIGITS:
148 case UNUM_MAX_FRACTION_DIGITS:
149 case UNUM_MIN_FRACTION_DIGITS:
150 case UNUM_FRACTION_DIGITS:
151 case UNUM_MULTIPLIER:
152 case UNUM_GROUPING_SIZE:
153 case UNUM_ROUNDING_MODE:
154 case UNUM_FORMAT_WIDTH:
155 case UNUM_PADDING_POSITION:
156 case UNUM_SECONDARY_GROUPING_SIZE:
157 case UNUM_SIGNIFICANT_DIGITS_USED:
158 case UNUM_MIN_SIGNIFICANT_DIGITS:
159 case UNUM_MAX_SIGNIFICANT_DIGITS:
160 case UNUM_LENIENT_PARSE:
161 unum_setAttribute(FORMATTER_OBJECT(nfo), attribute, zval_get_long(value));
162 break;
163 case UNUM_ROUNDING_INCREMENT:
164 unum_setDoubleAttribute(FORMATTER_OBJECT(nfo), attribute, zval_get_double(value));
165 break;
166 default:
168 break;
169 }
170
171 INTL_METHOD_CHECK_STATUS( nfo, "Error setting attribute value" );
172
174}
175/* }}} */
176
177/* {{{ Get formatter attribute value. */
179{
180 int32_t slength = 0;
181 UChar *svalue = NULL;
182 zend_long attribute;
183 char *value;
184 size_t len;
186
187 /* Parse parameters. */
189 &object, NumberFormatter_ce_ptr, &attribute, &value, &len ) == FAILURE)
190 {
192 }
193
194 /* Fetch the object. */
196
197 /* Convert given attribute value to UTF-16. */
199 INTL_METHOD_CHECK_STATUS( nfo, "Error converting attribute value to UTF-16" );
200
201 /* Actually set new attribute value. */
202 unum_setTextAttribute(FORMATTER_OBJECT(nfo), attribute, svalue, slength, &INTL_DATA_ERROR_CODE(nfo));
203 if (svalue) {
204 efree(svalue);
205 }
206 INTL_METHOD_CHECK_STATUS( nfo, "Error setting text attribute" );
207
209}
210/* }}} */
211
212/* {{{ Get formatter symbol value. */
214{
215 zend_long symbol;
216 UChar value_buf[4];
217 UChar *value = value_buf;
218 uint32_t length = USIZE(value_buf);
220
221 /* Parse parameters. */
223 &object, NumberFormatter_ce_ptr, &symbol ) == FAILURE )
224 {
226 }
227
228 if(symbol >= UNUM_FORMAT_SYMBOL_COUNT || symbol < 0) {
229 intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR, "numfmt_get_symbol: invalid symbol value", 0 );
231 }
232
233 /* Fetch the object. */
235
236 length = unum_getSymbol(FORMATTER_OBJECT(nfo), symbol, value_buf, length, &INTL_DATA_ERROR_CODE(nfo));
237 if(INTL_DATA_ERROR_CODE(nfo) == U_BUFFER_OVERFLOW_ERROR && length >= USIZE( value_buf )) {
238 ++length; /* to avoid U_STRING_NOT_TERMINATED_WARNING */
240 value = eumalloc(length);
241 length = unum_getSymbol(FORMATTER_OBJECT(nfo), symbol, value, length, &INTL_DATA_ERROR_CODE(nfo));
242 if(U_FAILURE(INTL_DATA_ERROR_CODE(nfo))) {
243 efree(value);
244 value = value_buf;
245 }
246 }
247 INTL_METHOD_CHECK_STATUS( nfo, "Error getting symbol value" );
248
249 INTL_METHOD_RETVAL_UTF8( nfo, value, length, ( value_buf != value ) );
250}
251/* }}} */
252
253/* {{{ Set formatter symbol value. */
255{
256 zend_long symbol;
257 char* value = NULL;
258 size_t value_len = 0;
259 UChar* svalue = 0;
260 int32_t slength = 0;
262
263 /* Parse parameters. */
265 &object, NumberFormatter_ce_ptr, &symbol, &value, &value_len ) == FAILURE )
266 {
268 }
269
270 if (symbol >= UNUM_FORMAT_SYMBOL_COUNT || symbol < 0) {
271 intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR, "numfmt_set_symbol: invalid symbol value", 0 );
273 }
274
275 /* Fetch the object. */
277
278 /* Convert given symbol to UTF-16. */
279 intl_convert_utf8_to_utf16(&svalue, &slength, value, value_len, &INTL_DATA_ERROR_CODE(nfo));
280 INTL_METHOD_CHECK_STATUS( nfo, "Error converting symbol value to UTF-16" );
281
282 /* Actually set the symbol. */
283 unum_setSymbol(FORMATTER_OBJECT(nfo), symbol, svalue, slength, &INTL_DATA_ERROR_CODE(nfo));
284 if (svalue) {
285 efree(svalue);
286 }
287 INTL_METHOD_CHECK_STATUS( nfo, "Error setting symbol value" );
288
290}
291/* }}} */
292
293/* {{{ Get formatter pattern. */
295{
296 UChar value_buf[64];
297 uint32_t length = USIZE( value_buf );
298 UChar* value = value_buf;
300
301 /* Parse parameters. */
303 &object, NumberFormatter_ce_ptr ) == FAILURE )
304 {
306 }
307
308 /* Fetch the object. */
310
311 length = unum_toPattern(FORMATTER_OBJECT(nfo), 0, value, length, &INTL_DATA_ERROR_CODE(nfo));
312 if(INTL_DATA_ERROR_CODE(nfo) == U_BUFFER_OVERFLOW_ERROR && length >= USIZE( value_buf )) {
313 ++length; /* to avoid U_STRING_NOT_TERMINATED_WARNING */
315 value = eumalloc(length);
316 length = unum_toPattern( FORMATTER_OBJECT(nfo), 0, value, length, &INTL_DATA_ERROR_CODE(nfo) );
317 if(U_FAILURE(INTL_DATA_ERROR_CODE(nfo))) {
318 efree(value);
319 value = value_buf;
320 }
321 }
322 INTL_METHOD_CHECK_STATUS( nfo, "Error getting formatter pattern" );
323
324 INTL_METHOD_RETVAL_UTF8( nfo, value, length, ( value != value_buf ) );
325}
326/* }}} */
327
328/* {{{ Set formatter pattern. */
330{
331 char* value = NULL;
332 size_t value_len = 0;
333 int32_t slength = 0;
334 UChar* svalue = NULL;
335 UParseError spattern_error = {0};
337
338 /* Parse parameters. */
340 &object, NumberFormatter_ce_ptr, &value, &value_len ) == FAILURE )
341 {
343 }
344
346
347 /* Convert given pattern to UTF-16. */
348 intl_convert_utf8_to_utf16(&svalue, &slength, value, value_len, &INTL_DATA_ERROR_CODE(nfo));
349 INTL_METHOD_CHECK_STATUS( nfo, "Error converting pattern to UTF-16" );
350
351 unum_applyPattern(FORMATTER_OBJECT(nfo), 0, svalue, slength, &spattern_error, &INTL_DATA_ERROR_CODE(nfo));
352 if (svalue) {
353 efree(svalue);
354 }
355 if (U_FAILURE(INTL_DATA_ERROR_CODE(nfo))) {
356 char *msg;
357 spprintf(&msg, 0, "Error setting pattern value at line %d, offset %d", spattern_error.line, spattern_error.offset);
359 efree(msg);
361 }
362
364}
365/* }}} */
366
367/* {{{ Get formatter locale. */
369{
371 char* loc;
373
374 /* Parse parameters. */
376 &object, NumberFormatter_ce_ptr, &type ) == FAILURE )
377 {
379 }
380
381 /* Fetch the object. */
383
384 loc = (char *)unum_getLocaleByType(FORMATTER_OBJECT(nfo), type, &INTL_DATA_ERROR_CODE(nfo));
385 INTL_METHOD_CHECK_STATUS( nfo, "Error getting locale" );
386 RETURN_STRING(loc);
387}
388/* }}} */
size_t len
Definition apprentice.c:174
const ULOC_ACTUAL_LOCALE
const U_BUFFER_OVERFLOW_ERROR
const U_ILLEGAL_ARGUMENT_ERROR
const U_UNSUPPORTED_ERROR
const U_ZERO_ERROR
zend_ffi_type * type
Definition ffi.c:3812
zend_class_entry * NumberFormatter_ce_ptr
#define FORMATTER_METHOD_FETCH_OBJECT
#define FORMATTER_METHOD_INIT_VARS
#define FORMATTER_OBJECT(nfo)
#define NULL
Definition gdcache.h:45
#define USIZE(data)
Definition intl_common.h:38
#define eumalloc(size)
Definition intl_common.h:31
void intl_convert_utf8_to_utf16(UChar **target, int32_t *target_len, const char *src, size_t src_len, UErrorCode *status)
#define INTL_DATA_ERROR_P(obj)
Definition intl_data.h:39
#define INTL_DATA_ERROR_CODE(obj)
Definition intl_data.h:40
#define INTL_METHOD_CHECK_STATUS(obj, msg)
Definition intl_data.h:66
#define INTL_METHOD_RETVAL_UTF8(obj, ustring, ulen, free_it)
Definition intl_data.h:103
void intl_errors_set_custom_msg(intl_error *err, const char *msg, int copyMsg)
Definition intl_error.c:187
void intl_error_set(intl_error *err, UErrorCode code, const char *msg, int copyMsg)
Definition intl_error.c:161
#define svalue(o)
Definition minilua.c:281
#define PHP_FUNCTION
Definition php.h:364
numfmt_set_pattern(NumberFormatter $formatter, string $pattern)
numfmt_get_locale(NumberFormatter $formatter, int $type=ULOC_ACTUAL_LOCALE)
numfmt_set_symbol(NumberFormatter $formatter, int $symbol, string $value)
numfmt_get_text_attribute(NumberFormatter $formatter, int $attribute)
numfmt_get_symbol(NumberFormatter $formatter, int $symbol)
numfmt_get_pattern(NumberFormatter $formatter)
numfmt_get_attribute(NumberFormatter $formatter, int $attribute)
numfmt_set_attribute(NumberFormatter $formatter, int $attribute, int|float $value)
numfmt_set_text_attribute(NumberFormatter $formatter, int $attribute, string $value)
char * msg
Definition phpdbg.h:289
#define spprintf
Definition spprintf.h:29
ZEND_API zend_result zend_parse_method_parameters(uint32_t num_args, zval *this_ptr, const char *type_spec,...)
Definition zend_API.c:1314
#define ZEND_NUM_ARGS()
Definition zend_API.h:530
#define RETURN_STRING(s)
Definition zend_API.h:1043
#define RETURN_FALSE
Definition zend_API.h:1058
#define RETVAL_DOUBLE(d)
Definition zend_API.h:1012
#define RETURN_THROWS()
Definition zend_API.h:1060
#define RETVAL_LONG(l)
Definition zend_API.h:1011
#define getThis()
Definition zend_API.h:526
#define RETURN_TRUE
Definition zend_API.h:1059
#define efree(ptr)
Definition zend_alloc.h:155
struct _zval_struct zval
int32_t zend_long
Definition zend_long.h:42
@ FAILURE
Definition zend_types.h:61
value