xref: /PHP-7.2/ext/intl/php_intl.c (revision ff1b1c27)
1 /*
2    +----------------------------------------------------------------------+
3    | PHP Version 7                                                        |
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: Vadim Savchuk <vsavchuk@productengine.com>                  |
14    |          Dmitry Lakhtyuk <dlakhtyuk@productengine.com>               |
15    |          Stanislav Malyshev <stas@zend.com>                          |
16    |          Kirti Velankar <kirtig@yahoo-inc.com>   			  |
17    +----------------------------------------------------------------------+
18  */
19 
20 #ifdef HAVE_CONFIG_H
21 #include "config.h"
22 #endif
23 
24 
25 #include "php_intl.h"
26 #include "intl_error.h"
27 #include "collator/collator_class.h"
28 #include "collator/collator.h"
29 #include "collator/collator_attr.h"
30 #include "collator/collator_compare.h"
31 #include "collator/collator_sort.h"
32 #include "collator/collator_convert.h"
33 #include "collator/collator_locale.h"
34 #include "collator/collator_create.h"
35 #include "collator/collator_error.h"
36 
37 #include "converter/converter.h"
38 
39 #include "formatter/formatter.h"
40 #include "formatter/formatter_class.h"
41 #include "formatter/formatter_attr.h"
42 #include "formatter/formatter_format.h"
43 #include "formatter/formatter_main.h"
44 #include "formatter/formatter_parse.h"
45 
46 #include "grapheme/grapheme.h"
47 
48 #include "msgformat/msgformat.h"
49 #include "msgformat/msgformat_class.h"
50 #include "msgformat/msgformat_attr.h"
51 #include "msgformat/msgformat_format.h"
52 #include "msgformat/msgformat_parse.h"
53 
54 #include "normalizer/normalizer.h"
55 #include "normalizer/normalizer_class.h"
56 #include "normalizer/normalizer_normalize.h"
57 
58 #include "locale/locale.h"
59 #include "locale/locale_class.h"
60 #include "locale/locale_methods.h"
61 
62 #include "dateformat/dateformat.h"
63 #include "dateformat/dateformat_class.h"
64 #include "dateformat/dateformat_attr.h"
65 #include "dateformat/dateformat_attrcpp.h"
66 #include "dateformat/dateformat_format.h"
67 #include "dateformat/dateformat_format_object.h"
68 #include "dateformat/dateformat_parse.h"
69 #include "dateformat/dateformat_data.h"
70 
71 #include "resourcebundle/resourcebundle_class.h"
72 
73 #include "transliterator/transliterator.h"
74 #include "transliterator/transliterator_class.h"
75 #include "transliterator/transliterator_methods.h"
76 
77 #include "timezone/timezone_class.h"
78 #include "timezone/timezone_methods.h"
79 
80 #include "calendar/calendar_class.h"
81 #include "calendar/calendar_methods.h"
82 #include "calendar/gregoriancalendar_methods.h"
83 
84 #include "breakiterator/breakiterator_class.h"
85 #include "breakiterator/breakiterator_iterators.h"
86 
87 #include "idn/idn.h"
88 #include "uchar/uchar.h"
89 
90 #if U_ICU_VERSION_MAJOR_NUM * 1000 + U_ICU_VERSION_MINOR_NUM >= 4002
91 # include "spoofchecker/spoofchecker_class.h"
92 # include "spoofchecker/spoofchecker.h"
93 # include "spoofchecker/spoofchecker_create.h"
94 # include "spoofchecker/spoofchecker_main.h"
95 #endif
96 
97 #include "msgformat/msgformat.h"
98 #include "common/common_error.h"
99 #include "common/common_enum.h"
100 
101 #include <unicode/uloc.h>
102 #include <unicode/uclean.h>
103 #include <ext/standard/info.h>
104 
105 #include "php_ini.h"
106 #define INTL_MODULE_VERSION PHP_INTL_VERSION
107 
108 /*
109  * locale_get_default has a conflict since ICU also has
110  * a function with the same  name
111  * in fact ICU appends the version no. to it also
112  * Hence the following undef for ICU version
113  * Same true for the locale_set_default function
114 */
115 #undef locale_get_default
116 #undef locale_set_default
117 
ZEND_DECLARE_MODULE_GLOBALS(intl)118 ZEND_DECLARE_MODULE_GLOBALS( intl )
119 
120 const char *intl_locale_get_default( void )
121 {
122 	if( INTL_G(default_locale) == NULL ) {
123 		return uloc_getDefault();
124 	}
125 	return INTL_G(default_locale);
126 }
127 
128 /* {{{ Arguments info */
129 ZEND_BEGIN_ARG_INFO_EX(collator_static_0_args, 0, 0, 0)
130 ZEND_END_ARG_INFO()
131 
132 ZEND_BEGIN_ARG_INFO_EX(collator_static_1_arg, 0, 0, 1)
133 	ZEND_ARG_INFO(0, arg1)
134 ZEND_END_ARG_INFO()
135 
136 ZEND_BEGIN_ARG_INFO_EX(collator_0_args, 0, 0, 1)
137 	ZEND_ARG_OBJ_INFO(0, object, Collator, 0)
138 ZEND_END_ARG_INFO()
139 
140 ZEND_BEGIN_ARG_INFO_EX(collator_1_arg, 0, 0, 2)
141 	ZEND_ARG_OBJ_INFO(0, object, Collator, 0)
142 	ZEND_ARG_INFO(0, arg1)
143 ZEND_END_ARG_INFO()
144 
145 ZEND_BEGIN_ARG_INFO_EX(collator_2_args, 0, 0, 3)
146 	ZEND_ARG_OBJ_INFO(0, object, Collator, 0)
147 	ZEND_ARG_INFO(0, arg1)
148 	ZEND_ARG_INFO(0, arg2)
149 ZEND_END_ARG_INFO()
150 
151 ZEND_BEGIN_ARG_INFO_EX(collator_sort_args, 0, 0, 2)
152 	ZEND_ARG_OBJ_INFO(0, object, Collator, 0)
153 	ZEND_ARG_ARRAY_INFO(1, arr, 0)
154 	ZEND_ARG_INFO(0, sort_flags)
155 ZEND_END_ARG_INFO()
156 
157 ZEND_BEGIN_ARG_INFO_EX(collator_sort_with_sort_keys_args, 0, 0, 2)
158 	ZEND_ARG_OBJ_INFO(0, coll, Collator, 0)
159 	ZEND_ARG_ARRAY_INFO(1, arr, 0)
160 ZEND_END_ARG_INFO()
161 
162 ZEND_BEGIN_ARG_INFO_EX(numfmt_parse_arginfo, 0, 0, 2)
163 	ZEND_ARG_INFO(0, formatter)
164 	ZEND_ARG_INFO(0, string)
165 	ZEND_ARG_INFO(0, type)
166 	ZEND_ARG_INFO(1, position)
167 ZEND_END_ARG_INFO()
168 
169 ZEND_BEGIN_ARG_INFO_EX(numfmt_parse_currency_arginfo, 0, 0, 3)
170 	ZEND_ARG_INFO(0, formatter)
171 	ZEND_ARG_INFO(0, string)
172 	ZEND_ARG_INFO(1, currency)
173 	ZEND_ARG_INFO(1, position)
174 ZEND_END_ARG_INFO()
175 
176 ZEND_BEGIN_ARG_INFO_EX( locale_get_loc_in_loc_args, 0, ZEND_RETURN_VALUE, 1 )
177 	ZEND_ARG_INFO(0, locale)
178 	ZEND_ARG_INFO(0, in_locale)
179 ZEND_END_ARG_INFO()
180 
181 ZEND_BEGIN_ARG_INFO_EX( locale_filter_matches_args, 0, ZEND_RETURN_VALUE, 2 )
182 	ZEND_ARG_INFO(0, langtag)
183 	ZEND_ARG_INFO(0, locale)
184 	ZEND_ARG_INFO(0, canonicalize)
185 ZEND_END_ARG_INFO()
186 
187 ZEND_BEGIN_ARG_INFO_EX( locale_lookup_args, 0, ZEND_RETURN_VALUE, 2 )
188 	ZEND_ARG_INFO(0, langtag)
189 	ZEND_ARG_INFO(0, locale)
190 	ZEND_ARG_INFO(0, canonicalize)
191 	ZEND_ARG_INFO(0, def)
192 ZEND_END_ARG_INFO()
193 
194 ZEND_BEGIN_ARG_INFO_EX(locale_0_args, 0, 0, 0)
195 ZEND_END_ARG_INFO()
196 
197 ZEND_BEGIN_ARG_INFO_EX(locale_1_arg, 0, 0, 1)
198 	ZEND_ARG_INFO(0, arg1)
199 ZEND_END_ARG_INFO()
200 
201 #define intl_0_args collator_static_0_args
202 #define intl_1_arg collator_static_1_arg
203 
204 ZEND_BEGIN_ARG_INFO_EX(normalizer_args, 0, 0, 1)
205 	ZEND_ARG_INFO(0, input)
206 	ZEND_ARG_INFO(0, form)
207 ZEND_END_ARG_INFO()
208 
209 ZEND_BEGIN_ARG_INFO_EX(grapheme_1_arg, 0, 0, 1)
210 	ZEND_ARG_INFO(0, string)
211 ZEND_END_ARG_INFO()
212 
213 ZEND_BEGIN_ARG_INFO_EX(grapheme_search_args, 0, 0, 2)
214 	ZEND_ARG_INFO(0, haystack)
215 	ZEND_ARG_INFO(0, needle)
216 	ZEND_ARG_INFO(0, offset)
217 ZEND_END_ARG_INFO()
218 
219 ZEND_BEGIN_ARG_INFO_EX(grapheme_substr_args, 0, 0, 2)
220 	ZEND_ARG_INFO(0, string)
221 	ZEND_ARG_INFO(0, start)
222 	ZEND_ARG_INFO(0, length)
223 ZEND_END_ARG_INFO()
224 
225 ZEND_BEGIN_ARG_INFO_EX(grapheme_strstr_args, 0, 0, 2)
226 	ZEND_ARG_INFO(0, haystack)
227 	ZEND_ARG_INFO(0, needle)
228 	ZEND_ARG_INFO(0, before_needle)
229 ZEND_END_ARG_INFO()
230 
231 ZEND_BEGIN_ARG_INFO_EX(grapheme_extract_args, 0, 0, 2)
232 	ZEND_ARG_INFO(0, arg1)
233 	ZEND_ARG_INFO(0, arg2)
234 	ZEND_ARG_INFO(0, arg3)
235 	ZEND_ARG_INFO(0, arg4)
236 	ZEND_ARG_INFO(1, arg5)  /* 1 = pass by reference */
237 ZEND_END_ARG_INFO()
238 
239 ZEND_BEGIN_ARG_INFO_EX(datefmt_parse_args, 0, 0, 2)
240 	ZEND_ARG_INFO(0, formatter)
241 	ZEND_ARG_INFO(0, string)
242 	ZEND_ARG_INFO(1, position)
243 ZEND_END_ARG_INFO()
244 
245 ZEND_BEGIN_ARG_INFO_EX(arginfo_numfmt_create, 0, 0, 2)
246 	ZEND_ARG_INFO(0, locale)
247 	ZEND_ARG_INFO(0, style)
248 	ZEND_ARG_INFO(0, pattern)
249 ZEND_END_ARG_INFO()
250 
251 ZEND_BEGIN_ARG_INFO_EX(arginfo_numfmt_get_error_code, 0, 0, 1)
252 	ZEND_ARG_INFO(0, nf)
253 ZEND_END_ARG_INFO()
254 
255 ZEND_BEGIN_ARG_INFO_EX(arginfo_numfmt_format, 0, 0, 2)
256 	ZEND_ARG_INFO(0, nf)
257 	ZEND_ARG_INFO(0, num)
258 	ZEND_ARG_INFO(0, type)
259 ZEND_END_ARG_INFO()
260 
261 ZEND_BEGIN_ARG_INFO_EX(arginfo_numfmt_format_currency, 0, 0, 3)
262 	ZEND_ARG_INFO(0, nf)
263 	ZEND_ARG_INFO(0, num)
264 	ZEND_ARG_INFO(0, currency)
265 ZEND_END_ARG_INFO()
266 
267 ZEND_BEGIN_ARG_INFO_EX(arginfo_numfmt_get_attribute, 0, 0, 2)
268 	ZEND_ARG_INFO(0, nf)
269 	ZEND_ARG_INFO(0, attr)
270 ZEND_END_ARG_INFO()
271 
272 ZEND_BEGIN_ARG_INFO_EX(arginfo_numfmt_set_attribute, 0, 0, 3)
273 	ZEND_ARG_INFO(0, nf)
274 	ZEND_ARG_INFO(0, attr)
275 	ZEND_ARG_INFO(0, value)
276 ZEND_END_ARG_INFO()
277 
278 ZEND_BEGIN_ARG_INFO_EX(arginfo_numfmt_set_symbol, 0, 0, 3)
279 	ZEND_ARG_INFO(0, nf)
280 	ZEND_ARG_INFO(0, attr)
281 	ZEND_ARG_INFO(0, symbol)
282 ZEND_END_ARG_INFO()
283 
284 ZEND_BEGIN_ARG_INFO_EX(arginfo_numfmt_set_pattern, 0, 0, 2)
285 	ZEND_ARG_INFO(0, nf)
286 	ZEND_ARG_INFO(0, pattern)
287 ZEND_END_ARG_INFO()
288 
289 ZEND_BEGIN_ARG_INFO_EX(arginfo_numfmt_get_locale, 0, 0, 1)
290 	ZEND_ARG_INFO(0, nf)
291 	ZEND_ARG_INFO(0, type)
292 ZEND_END_ARG_INFO()
293 
294 ZEND_BEGIN_ARG_INFO_EX(arginfo_msgfmt_create, 0, 0, 2)
295 	ZEND_ARG_INFO(0, locale)
296 	ZEND_ARG_INFO(0, pattern)
297 ZEND_END_ARG_INFO()
298 
299 ZEND_BEGIN_ARG_INFO_EX(arginfo_msgfmt_get_error_code, 0, 0, 1)
300 	ZEND_ARG_INFO(0, nf)
301 ZEND_END_ARG_INFO()
302 
303 ZEND_BEGIN_ARG_INFO_EX(arginfo_msgfmt_get_error_message, 0, 0, 1)
304 	ZEND_ARG_INFO(0, coll)
305 ZEND_END_ARG_INFO()
306 
307 ZEND_BEGIN_ARG_INFO_EX(arginfo_msgfmt_format, 0, 0, 2)
308 	ZEND_ARG_INFO(0, nf)
309 	ZEND_ARG_INFO(0, args)
310 ZEND_END_ARG_INFO()
311 
312 ZEND_BEGIN_ARG_INFO_EX(arginfo_msgfmt_format_message, 0, 0, 3)
313 	ZEND_ARG_INFO(0, locale)
314 	ZEND_ARG_INFO(0, pattern)
315 	ZEND_ARG_INFO(0, args)
316 ZEND_END_ARG_INFO()
317 
318 ZEND_BEGIN_ARG_INFO_EX(arginfo_msgfmt_parse, 0, 0, 2)
319 	ZEND_ARG_INFO(0, nf)
320 	ZEND_ARG_INFO(0, source)
321 ZEND_END_ARG_INFO()
322 
323 ZEND_BEGIN_ARG_INFO_EX(arginfo_numfmt_parse_message, 0, 0, 3)
324 	ZEND_ARG_INFO(0, locale)
325 	ZEND_ARG_INFO(0, pattern)
326 	ZEND_ARG_INFO(0, source)
327 ZEND_END_ARG_INFO()
328 
329 ZEND_BEGIN_ARG_INFO_EX(arginfo_msgfmt_set_pattern, 0, 0, 2)
330 	ZEND_ARG_INFO(0, mf)
331 	ZEND_ARG_INFO(0, pattern)
332 ZEND_END_ARG_INFO()
333 
334 ZEND_BEGIN_ARG_INFO_EX(arginfo_msgfmt_get_locale, 0, 0, 1)
335 	ZEND_ARG_INFO(0, mf)
336 ZEND_END_ARG_INFO()
337 
338 ZEND_BEGIN_ARG_INFO_EX(arginfo_datefmt_set_pattern, 0, 0, 2)
339 	ZEND_ARG_INFO(0, mf)
340 	ZEND_ARG_INFO(0, pattern)
341 ZEND_END_ARG_INFO()
342 
343 ZEND_BEGIN_ARG_INFO_EX(arginfo_datefmt_set_timezone, 0, 0, 2)
344 	ZEND_ARG_INFO(0, mf)
345 	ZEND_ARG_INFO(0, timezone)
346 ZEND_END_ARG_INFO()
347 
348 ZEND_BEGIN_ARG_INFO_EX(arginfo_datefmt_set_calendar, 0, 0, 2)
349 	ZEND_ARG_INFO(0, mf)
350 	ZEND_ARG_INFO(0, calendar)
351 ZEND_END_ARG_INFO()
352 
353 ZEND_BEGIN_ARG_INFO_EX(arginfo_datefmt_format, 0, 0, 0)
354 	ZEND_ARG_INFO(0, args)
355 	ZEND_ARG_INFO(0, array)
356 ZEND_END_ARG_INFO()
357 
358 ZEND_BEGIN_ARG_INFO_EX(arginfo_datefmt_format_object, 0, 0, 1)
359 	ZEND_ARG_INFO(0, object)
360 	ZEND_ARG_INFO(0, format)
361 	ZEND_ARG_INFO(0, locale)
362 ZEND_END_ARG_INFO()
363 
364 
365 ZEND_BEGIN_ARG_INFO_EX(arginfo_datefmt_create, 0, 0, 3)
366 	ZEND_ARG_INFO(0, locale)
367 	ZEND_ARG_INFO(0, date_type)
368 	ZEND_ARG_INFO(0, time_type)
369 	ZEND_ARG_INFO(0, timezone_str)
370 	ZEND_ARG_INFO(0, calendar)
371 	ZEND_ARG_INFO(0, pattern)
372 ZEND_END_ARG_INFO()
373 
374 ZEND_BEGIN_ARG_INFO_EX(arginfo_idn_to_ascii, 0, 0, 1)
375 	ZEND_ARG_INFO(0, domain)
376 	ZEND_ARG_INFO(0, option)
377 	ZEND_ARG_INFO(0, variant)
378 	ZEND_ARG_INFO(1, idn_info)
379 ZEND_END_ARG_INFO()
380 
381 ZEND_BEGIN_ARG_INFO_EX( arginfo_resourcebundle_create_proc, 0, 0, 2 )
382 	ZEND_ARG_INFO( 0, locale )
383 	ZEND_ARG_INFO( 0, bundlename )
384 	ZEND_ARG_INFO( 0, fallback )
385 ZEND_END_ARG_INFO()
386 
387 ZEND_BEGIN_ARG_INFO_EX( arginfo_resourcebundle_get_proc, 0, 0, 2 )
388     ZEND_ARG_INFO( 0, bundle )
389 	ZEND_ARG_INFO( 0, index )
390 	ZEND_ARG_INFO( 0, fallback )
391 ZEND_END_ARG_INFO()
392 
393 ZEND_BEGIN_ARG_INFO_EX( arginfo_resourcebundle_count_proc, 0, 0, 1 )
394   ZEND_ARG_INFO( 0, bundle )
395 ZEND_END_ARG_INFO()
396 
397 ZEND_BEGIN_ARG_INFO_EX( arginfo_resourcebundle_locales_proc, 0, 0, 1 )
398 	ZEND_ARG_INFO( 0, bundlename )
399 ZEND_END_ARG_INFO()
400 
401 ZEND_BEGIN_ARG_INFO_EX( arginfo_resourcebundle_get_error_code_proc, 0, 0, 1 )
402   ZEND_ARG_INFO( 0, bundle )
403 ZEND_END_ARG_INFO()
404 
405 ZEND_BEGIN_ARG_INFO_EX( arginfo_resourcebundle_get_error_message_proc, 0, 0, 1 )
406   ZEND_ARG_INFO( 0, bundle )
407 ZEND_END_ARG_INFO()
408 
409 ZEND_BEGIN_ARG_INFO_EX( arginfo_transliterator_void, 0, 0, 0 )
410 ZEND_END_ARG_INFO()
411 
412 ZEND_BEGIN_ARG_INFO_EX( arginfo_transliterator_create, 0, 0, 1 )
413 	ZEND_ARG_INFO( 0, id )
414 	ZEND_ARG_INFO( 0, direction )
415 ZEND_END_ARG_INFO()
416 
417 ZEND_BEGIN_ARG_INFO_EX( arginfo_transliterator_create_from_rules, 0, 0, 1 )
418 	ZEND_ARG_INFO( 0, rules )
419 	ZEND_ARG_INFO( 0, direction )
420 ZEND_END_ARG_INFO()
421 
422 ZEND_BEGIN_ARG_INFO_EX( arginfo_transliterator_create_inverse, 0, 0, 1 )
423 	ZEND_ARG_OBJ_INFO( 0, orig_trans, Transliterator, 0 )
424 ZEND_END_ARG_INFO()
425 
426 ZEND_BEGIN_ARG_INFO_EX( arginfo_transliterator_transliterate, 0, 0, 2 )
427 	ZEND_ARG_INFO( 0, trans )
428 	ZEND_ARG_INFO( 0, subject )
429 	ZEND_ARG_INFO( 0, start )
430 	ZEND_ARG_INFO( 0, end )
431 ZEND_END_ARG_INFO()
432 
433 ZEND_BEGIN_ARG_INFO_EX( arginfo_transliterator_error, 0, 0, 1 )
434 	ZEND_ARG_OBJ_INFO( 0, trans, Transliterator, 0 )
435 ZEND_END_ARG_INFO()
436 
437 ZEND_BEGIN_ARG_INFO_EX( arginfo_tz_idarg_static, 0, 0, 1 )
438 	ZEND_ARG_INFO( 0, zoneId )
439 ZEND_END_ARG_INFO()
440 
441 ZEND_BEGIN_ARG_INFO_EX( arginfo_tz_from_date_time_zone, 0, 0, 1 )
442 	ZEND_ARG_OBJ_INFO( 0, dateTimeZone, DateTimeZone, 0 )
443 ZEND_END_ARG_INFO()
444 
445 ZEND_BEGIN_ARG_INFO_EX( arginfo_tz_create_enumeration, 0, 0, 0 )
446 	ZEND_ARG_INFO( 0, countryOrRawOffset )
447 ZEND_END_ARG_INFO()
448 
449 ZEND_BEGIN_ARG_INFO_EX( arginfo_tz_create_time_zone_id_enumeration, 0, 0, 1 )
450 	ZEND_ARG_INFO( 0, zoneType )
451 	ZEND_ARG_INFO( 0, region )
452 	ZEND_ARG_INFO( 0, rawOffset )
453 ZEND_END_ARG_INFO()
454 
455 ZEND_BEGIN_ARG_INFO_EX( arginfo_tz_get_canonical_id, 0, 0, 1 )
456 	ZEND_ARG_INFO( 0, zoneId )
457 	ZEND_ARG_INFO( 1, isSystemID )
458 ZEND_END_ARG_INFO()
459 
460 ZEND_BEGIN_ARG_INFO_EX( arginfo_tz_get_equivalent_id, 0, 0, 2 )
461 	ZEND_ARG_INFO( 0, zoneId )
462 	ZEND_ARG_INFO( 0, index )
463 ZEND_END_ARG_INFO()
464 
465 ZEND_BEGIN_ARG_INFO_EX( arginfo_tz_get_offset, 0, 0, 5 )
466 	ZEND_ARG_OBJ_INFO( 0, timeZone, IntlTimeZone, 0 )
467 	ZEND_ARG_INFO( 0, date )
468 	ZEND_ARG_INFO( 0, local )
469 	ZEND_ARG_INFO( 1, rawOffset )
470 	ZEND_ARG_INFO( 1, dstOffset )
471 ZEND_END_ARG_INFO()
472 
473 ZEND_BEGIN_ARG_INFO_EX( arginfo_tz_has_same_rules, 0, 0, 1 )
474 	ZEND_ARG_OBJ_INFO( 0, timeZone, IntlTimeZone, 0 )
475 	ZEND_ARG_OBJ_INFO( 0, otherTimeZone, IntlTimeZone, 0 )
476 ZEND_END_ARG_INFO()
477 
478 ZEND_BEGIN_ARG_INFO_EX( arginfo_tz_get_display_name, 0, 0, 1 )
479 	ZEND_ARG_OBJ_INFO( 0, timeZone, IntlTimeZone, 0 )
480 	ZEND_ARG_INFO( 0, isDaylight )
481 	ZEND_ARG_INFO( 0, style )
482 	ZEND_ARG_INFO( 0, locale )
483 ZEND_END_ARG_INFO()
484 
485 ZEND_BEGIN_ARG_INFO_EX( arginfo_tz_only_tz, 0, 0, 1 )
486 	ZEND_ARG_OBJ_INFO( 0, timeZone, IntlTimeZone, 0 )
487 ZEND_END_ARG_INFO()
488 
489 ZEND_BEGIN_ARG_INFO_EX( arginfo_tz_void, 0, 0, 0 )
490 ZEND_END_ARG_INFO()
491 
492 ZEND_BEGIN_ARG_INFO_EX( ainfo_cal_create_instance, 0, 0, 0 )
493 	ZEND_ARG_INFO( 0, timeZone )
494 	ZEND_ARG_INFO( 0, locale )
495 ZEND_END_ARG_INFO()
496 
497 ZEND_BEGIN_ARG_INFO_EX( ainfo_cal_only_cal, 0, 0, 1 )
498 	ZEND_ARG_OBJ_INFO( 0, calendar, IntlCalendar, 0 )
499 ZEND_END_ARG_INFO()
500 
501 ZEND_BEGIN_ARG_INFO_EX( ainfo_cal_void, 0, 0, 0 )
502 ZEND_END_ARG_INFO()
503 
504 ZEND_BEGIN_ARG_INFO_EX( ainfo_cal_field, 0, 0, 2 )
505 	ZEND_ARG_OBJ_INFO( 0, calendar, IntlCalendar, 0 )
506 	ZEND_ARG_INFO( 0, field )
507 ZEND_END_ARG_INFO()
508 
509 ZEND_BEGIN_ARG_INFO_EX( ainfo_cal_dow, 0, 0, 2 )
510 	ZEND_ARG_OBJ_INFO( 0, calendar, IntlCalendar, 0 )
511 	ZEND_ARG_INFO( 0, dayOfWeek )
512 ZEND_END_ARG_INFO()
513 
514 ZEND_BEGIN_ARG_INFO_EX( ainfo_cal_other_cal, 0, 0, 2 )
515 	ZEND_ARG_OBJ_INFO( 0, calendar, IntlCalendar, 0 )
516 	ZEND_ARG_OBJ_INFO( 0, otherCalendar, IntlCalendar, 0 )
517 ZEND_END_ARG_INFO()
518 
519 ZEND_BEGIN_ARG_INFO_EX( ainfo_cal_date, 0, 0, 2 )
520 	ZEND_ARG_OBJ_INFO( 0, calendar, IntlCalendar, 0 )
521 	ZEND_ARG_INFO( 0, date )
522 ZEND_END_ARG_INFO()
523 
524 ZEND_BEGIN_ARG_INFO_EX( ainfo_cal_date_optional, 0, 0, 1 )
525 	ZEND_ARG_OBJ_INFO( 0, calendar, IntlCalendar, 0 )
526 	ZEND_ARG_INFO( 0, date )
527 ZEND_END_ARG_INFO()
528 
529 ZEND_BEGIN_ARG_INFO_EX( ainfo_cal_get_keyword_values_for_locale, 0, 0, 3)
530 	ZEND_ARG_INFO( 0, key )
531 	ZEND_ARG_INFO( 0, locale )
532 	ZEND_ARG_INFO( 0, commonlyUsed )
533 ZEND_END_ARG_INFO()
534 
535 ZEND_BEGIN_ARG_INFO_EX( ainfo_cal_add, 0, 0, 3 )
536 	ZEND_ARG_OBJ_INFO( 0, calendar, IntlCalendar, 0 )
537 	ZEND_ARG_INFO( 0, field )
538 	ZEND_ARG_INFO( 0, amount )
539 ZEND_END_ARG_INFO()
540 
541 ZEND_BEGIN_ARG_INFO_EX( ainfo_cal_set_time_zone, 0, 0, 2 )
542 	ZEND_ARG_OBJ_INFO( 0, calendar, IntlCalendar, 0 )
543 	ZEND_ARG_INFO( 0, timeZone )
544 ZEND_END_ARG_INFO()
545 
546 ZEND_BEGIN_ARG_INFO_EX( ainfo_cal_set, 0, 0, 3 )
547 	ZEND_ARG_OBJ_INFO( 0, calendar, IntlCalendar, 0 )
548 	ZEND_ARG_INFO( 0, fieldOrYear )
549 	ZEND_ARG_INFO( 0, valueOrMonth )
550 	ZEND_ARG_INFO( 0, dayOfMonth )
551 	ZEND_ARG_INFO( 0, hour )
552 	ZEND_ARG_INFO( 0, minute )
553 	ZEND_ARG_INFO( 0, second )
554 ZEND_END_ARG_INFO()
555 
556 ZEND_BEGIN_ARG_INFO_EX( ainfo_cal_roll, 0, 0, 2 )
557 	ZEND_ARG_OBJ_INFO( 0, calendar, IntlCalendar, 0 )
558 	ZEND_ARG_INFO( 0, field )
559 	ZEND_ARG_INFO( 0, amountOrUpOrDown )
560 ZEND_END_ARG_INFO()
561 
562 ZEND_BEGIN_ARG_INFO_EX( ainfo_cal_clear, 0, 0, 1 )
563 	ZEND_ARG_OBJ_INFO( 0, calendar, IntlCalendar, 0 )
564 	ZEND_ARG_INFO( 0, field )
565 ZEND_END_ARG_INFO()
566 
567 ZEND_BEGIN_ARG_INFO_EX( ainfo_cal_field_difference, 0, 0, 3 )
568 	ZEND_ARG_OBJ_INFO( 0, calendar, IntlCalendar, 0 )
569 	ZEND_ARG_INFO( 0, when )
570 	ZEND_ARG_INFO( 0, field )
571 ZEND_END_ARG_INFO()
572 
573 ZEND_BEGIN_ARG_INFO_EX( ainfo_cal_get_locale, 0, 0, 2 )
574 	ZEND_ARG_OBJ_INFO( 0, calendar, IntlCalendar, 0 )
575 	ZEND_ARG_INFO( 0, localeType )
576 ZEND_END_ARG_INFO()
577 
578 ZEND_BEGIN_ARG_INFO_EX( ainfo_cal_set_lenient, 0, 0, 2 )
579 	ZEND_ARG_OBJ_INFO( 0, calendar, IntlCalendar, 0 )
580 	ZEND_ARG_INFO( 0, isLenient )
581 ZEND_END_ARG_INFO()
582 
583 ZEND_BEGIN_ARG_INFO_EX( ainfo_cal_set_minimal_days_in_first_week, 0, 0, 2 )
584 	ZEND_ARG_OBJ_INFO( 0, calendar, IntlCalendar, 0 )
585 	ZEND_ARG_INFO( 0, numberOfDays )
586 ZEND_END_ARG_INFO()
587 
588 ZEND_BEGIN_ARG_INFO_EX(ainfo_cal_from_date_time, 0, 0, 1)
589 	ZEND_ARG_INFO(0, dateTime)
590 ZEND_END_ARG_INFO()
591 
592 ZEND_BEGIN_ARG_INFO_EX( ainfo_cal_wall_time_option, 0, 0, 2 )
593 	ZEND_ARG_OBJ_INFO( 0, calendar, IntlCalendar, 0 )
594 	ZEND_ARG_INFO( 0, wallTimeOption )
595 ZEND_END_ARG_INFO()
596 
597 /* Gregorian Calendar */
598 ZEND_BEGIN_ARG_INFO_EX( ainfo_gregcal_create_instance, 0, 0, 0 )
599 	ZEND_ARG_INFO(0, timeZoneOrYear)
600 	ZEND_ARG_INFO(0, localeOrMonth)
601 	ZEND_ARG_INFO(0, dayOfMonth)
602 	ZEND_ARG_INFO(0, hour)
603 	ZEND_ARG_INFO(0, minute)
604 	ZEND_ARG_INFO(0, second)
605 ZEND_END_ARG_INFO()
606 
607 ZEND_BEGIN_ARG_INFO_EX( ainfo_gregcal_is_leap_year, 0, 0, 2 )
608 	ZEND_ARG_OBJ_INFO( 0, calendar, IntlGregorianCalendar, 0 )
609 	ZEND_ARG_INFO( 0, year )
610 ZEND_END_ARG_INFO()
611 
612 ZEND_BEGIN_ARG_INFO_EX( ainfo_gregcal_only_gregcal, 0, 0, 1 )
613 	ZEND_ARG_OBJ_INFO( 0, calendar, IntlGregorianCalendar, 0 )
614 ZEND_END_ARG_INFO()
615 
616 ZEND_BEGIN_ARG_INFO_EX( ainfo_gregcal_set_gregorian_change, 0, 0, 2 )
617 	ZEND_ARG_OBJ_INFO( 0, calendar, IntlGregorianCalendar, 0 )
618 	ZEND_ARG_INFO( 0, date )
619 ZEND_END_ARG_INFO()
620 
621 /* }}} */
622 
623 /* {{{ intl_functions
624  *
625  * Every user visible function must have an entry in intl_functions[].
626  */
627 zend_function_entry intl_functions[] = {
628 
629 	/* collator functions */
630 	PHP_FE( collator_create, collator_static_1_arg )
631 	PHP_FE( collator_compare, collator_2_args )
632 	PHP_FE( collator_get_attribute, collator_1_arg )
633 	PHP_FE( collator_set_attribute, collator_2_args )
634 	PHP_FE( collator_get_strength, collator_0_args )
635 	PHP_FE( collator_set_strength, collator_1_arg )
636 	PHP_FE( collator_sort, collator_sort_args )
637 	PHP_FE( collator_sort_with_sort_keys, collator_sort_with_sort_keys_args )
638 	PHP_FE( collator_asort, collator_sort_args )
639 	PHP_FE( collator_get_locale, collator_1_arg )
640 	PHP_FE( collator_get_error_code, collator_0_args )
641 	PHP_FE( collator_get_error_message, collator_0_args )
642 	PHP_FE( collator_get_sort_key, collator_1_arg )
643 
644 	/* formatter functions */
645 	PHP_FE( numfmt_create, arginfo_numfmt_create )
646 	PHP_FE( numfmt_format, arginfo_numfmt_format )
647 	PHP_FE( numfmt_parse, numfmt_parse_arginfo )
648 	PHP_FE( numfmt_format_currency, arginfo_numfmt_format_currency )
649 	PHP_FE( numfmt_parse_currency, numfmt_parse_currency_arginfo )
650 	PHP_FE( numfmt_set_attribute, arginfo_numfmt_set_attribute )
651 	PHP_FE( numfmt_get_attribute, arginfo_numfmt_get_attribute )
652 	PHP_FE( numfmt_set_text_attribute, arginfo_numfmt_set_attribute )
653 	PHP_FE( numfmt_get_text_attribute, arginfo_numfmt_get_attribute )
654 	PHP_FE( numfmt_set_symbol, arginfo_numfmt_set_symbol )
655 	PHP_FE( numfmt_get_symbol, arginfo_numfmt_get_attribute )
656 	PHP_FE( numfmt_set_pattern, arginfo_numfmt_set_pattern )
657 	PHP_FE( numfmt_get_pattern, arginfo_numfmt_get_error_code )
658 	PHP_FE( numfmt_get_locale, arginfo_numfmt_get_locale )
659 	PHP_FE( numfmt_get_error_code, arginfo_numfmt_get_error_code )
660 	PHP_FE( numfmt_get_error_message, arginfo_numfmt_get_error_code )
661 
662 	/* normalizer functions */
663 	PHP_FE( normalizer_normalize, normalizer_args )
664 	PHP_FE( normalizer_is_normalized, normalizer_args )
665 
666 	/* Locale functions */
667 	PHP_NAMED_FE( locale_get_default, zif_locale_get_default, locale_0_args )
668 	PHP_NAMED_FE( locale_set_default, zif_locale_set_default, locale_1_arg )
669 	PHP_FE( locale_get_primary_language, locale_1_arg )
670 	PHP_FE( locale_get_script, locale_1_arg )
671 	PHP_FE( locale_get_region, locale_1_arg )
672 	PHP_FE( locale_get_keywords, locale_1_arg )
673 	PHP_FE( locale_get_display_script, locale_get_loc_in_loc_args )
674 	PHP_FE( locale_get_display_region, locale_get_loc_in_loc_args )
675 	PHP_FE( locale_get_display_name, locale_get_loc_in_loc_args )
676 	PHP_FE( locale_get_display_language, locale_get_loc_in_loc_args)
677 	PHP_FE( locale_get_display_variant, locale_get_loc_in_loc_args )
678 	PHP_FE( locale_compose, locale_1_arg )
679 	PHP_FE( locale_parse, locale_1_arg )
680 	PHP_FE( locale_get_all_variants, locale_1_arg )
681 	PHP_FE( locale_filter_matches, locale_filter_matches_args )
682 	PHP_FE( locale_canonicalize, locale_1_arg )
683 	PHP_FE( locale_lookup, locale_lookup_args )
684 	PHP_FE( locale_accept_from_http, locale_1_arg )
685 
686 	/* MessageFormatter functions */
687 	PHP_FE( msgfmt_create, arginfo_msgfmt_create )
688 	PHP_FE( msgfmt_format, arginfo_msgfmt_format )
689 	PHP_FE( msgfmt_format_message, arginfo_msgfmt_format_message )
690 	PHP_FE( msgfmt_parse, arginfo_msgfmt_parse )
691 	PHP_FE( msgfmt_parse_message, arginfo_numfmt_parse_message )
692 	PHP_FE( msgfmt_set_pattern, arginfo_msgfmt_set_pattern )
693 	PHP_FE( msgfmt_get_pattern, arginfo_msgfmt_get_locale )
694 	PHP_FE( msgfmt_get_locale, arginfo_msgfmt_get_locale )
695 	PHP_FE( msgfmt_get_error_code, arginfo_msgfmt_get_error_code )
696 	PHP_FE( msgfmt_get_error_message, arginfo_msgfmt_get_error_message )
697 
698 	/* IntlDateFormatter functions */
699 	PHP_FE( datefmt_create, arginfo_datefmt_create )
700 	PHP_FE( datefmt_get_datetype, arginfo_msgfmt_get_locale )
701 	PHP_FE( datefmt_get_timetype, arginfo_msgfmt_get_locale )
702 	PHP_FE( datefmt_get_calendar, arginfo_msgfmt_get_locale )
703 	PHP_FE( datefmt_get_calendar_object, arginfo_msgfmt_get_locale )
704 	PHP_FE( datefmt_set_calendar, arginfo_datefmt_set_calendar )
705 	PHP_FE( datefmt_get_locale, arginfo_msgfmt_get_locale )
706 	PHP_FE( datefmt_get_timezone_id, arginfo_msgfmt_get_locale )
707 	PHP_FE( datefmt_get_timezone, arginfo_msgfmt_get_locale )
708 	PHP_FE( datefmt_set_timezone, arginfo_datefmt_set_timezone )
709 	PHP_FE( datefmt_get_pattern, arginfo_msgfmt_get_locale )
710 	PHP_FE( datefmt_set_pattern, arginfo_datefmt_set_pattern )
711 	PHP_FE( datefmt_is_lenient, arginfo_msgfmt_get_locale )
712 	PHP_FE( datefmt_set_lenient, arginfo_msgfmt_get_locale )
713 	PHP_FE( datefmt_format, arginfo_datefmt_format )
714 	PHP_FE( datefmt_format_object, arginfo_datefmt_format_object )
715 	PHP_FE( datefmt_parse, datefmt_parse_args )
716 	PHP_FE( datefmt_localtime , datefmt_parse_args )
717 	PHP_FE( datefmt_get_error_code, arginfo_msgfmt_get_error_code )
718 	PHP_FE( datefmt_get_error_message, arginfo_msgfmt_get_error_message )
719 
720 	/* grapheme functions */
721 	PHP_FE( grapheme_strlen, grapheme_1_arg )
722 	PHP_FE( grapheme_strpos, grapheme_search_args )
723 	PHP_FE( grapheme_stripos, grapheme_search_args )
724 	PHP_FE( grapheme_strrpos, grapheme_search_args )
725 	PHP_FE( grapheme_strripos, grapheme_search_args )
726 	PHP_FE( grapheme_substr, grapheme_substr_args )
727 	PHP_FE( grapheme_strstr, grapheme_strstr_args )
728 	PHP_FE( grapheme_stristr, grapheme_strstr_args )
729 	PHP_FE( grapheme_extract, grapheme_extract_args )
730 
731 	/* IDN functions */
732 	PHP_FE( idn_to_ascii, arginfo_idn_to_ascii)
733 	PHP_FE( idn_to_utf8, arginfo_idn_to_ascii)
734 
735 	/* ResourceBundle functions */
736 	PHP_FE( resourcebundle_create, arginfo_resourcebundle_create_proc )
737 	PHP_FE( resourcebundle_get, arginfo_resourcebundle_get_proc )
738 	PHP_FE( resourcebundle_count, arginfo_resourcebundle_count_proc )
739 	PHP_FE( resourcebundle_locales, arginfo_resourcebundle_locales_proc )
740 	PHP_FE( resourcebundle_get_error_code, arginfo_resourcebundle_get_error_code_proc )
741 	PHP_FE( resourcebundle_get_error_message, arginfo_resourcebundle_get_error_message_proc )
742 
743 	/* Transliterator functions */
744 	PHP_FE( transliterator_create, arginfo_transliterator_create )
745 	PHP_FE( transliterator_create_from_rules, arginfo_transliterator_create_from_rules )
746 	PHP_FE( transliterator_list_ids, arginfo_transliterator_void )
747 	PHP_FE( transliterator_create_inverse, arginfo_transliterator_create_inverse)
748 	PHP_FE( transliterator_transliterate, arginfo_transliterator_transliterate )
749 	PHP_FE( transliterator_get_error_code, arginfo_transliterator_error )
750 	PHP_FE( transliterator_get_error_message, arginfo_transliterator_error )
751 
752 	/* TimeZone functions */
753 	PHP_FE( intltz_create_time_zone, arginfo_tz_idarg_static )
754 	PHP_FE( intltz_from_date_time_zone, arginfo_tz_from_date_time_zone )
755 	PHP_FE( intltz_create_default, arginfo_tz_void )
756 	PHP_FE( intltz_get_id, arginfo_tz_only_tz )
757 	PHP_FE( intltz_get_gmt, arginfo_tz_void )
758 #if U_ICU_VERSION_MAJOR_NUM >= 49
759 	PHP_FE( intltz_get_unknown, arginfo_tz_void )
760 #endif
761 	PHP_FE( intltz_create_enumeration, arginfo_tz_create_enumeration )
762 	PHP_FE( intltz_count_equivalent_ids, arginfo_tz_idarg_static )
763 #if U_ICU_VERSION_MAJOR_NUM * 10 + U_ICU_VERSION_MINOR_NUM >= 48
764 	PHP_FE( intltz_create_time_zone_id_enumeration, arginfo_tz_create_time_zone_id_enumeration )
765 #endif
766 	PHP_FE( intltz_get_canonical_id, arginfo_tz_get_canonical_id )
767 #if U_ICU_VERSION_MAJOR_NUM * 10 + U_ICU_VERSION_MINOR_NUM >= 48
768 	PHP_FE( intltz_get_region, arginfo_tz_idarg_static )
769 #endif
770 	PHP_FE( intltz_get_tz_data_version, arginfo_tz_void )
771 	PHP_FE( intltz_get_equivalent_id, arginfo_tz_get_equivalent_id )
772 	PHP_FE( intltz_use_daylight_time, arginfo_tz_only_tz )
773 	PHP_FE( intltz_get_offset, arginfo_tz_get_offset )
774 	PHP_FE( intltz_get_raw_offset, arginfo_tz_only_tz )
775 	PHP_FE( intltz_has_same_rules, arginfo_tz_has_same_rules )
776 	PHP_FE( intltz_get_display_name, arginfo_tz_get_display_name )
777 	PHP_FE( intltz_get_dst_savings, arginfo_tz_only_tz )
778 	PHP_FE( intltz_to_date_time_zone, arginfo_tz_only_tz )
779 	PHP_FE( intltz_get_error_code, arginfo_tz_only_tz )
780 	PHP_FE( intltz_get_error_message, arginfo_tz_only_tz )
781 
782 	PHP_FE( intlcal_create_instance, ainfo_cal_create_instance )
783 #if U_ICU_VERSION_MAJOR_NUM * 10 + U_ICU_VERSION_MINOR_NUM >= 42
784 	PHP_FE( intlcal_get_keyword_values_for_locale, ainfo_cal_get_keyword_values_for_locale )
785 #endif
786 	PHP_FE( intlcal_get_now, ainfo_cal_void )
787 	PHP_FE( intlcal_get_available_locales, ainfo_cal_void )
788 	PHP_FE( intlcal_get, ainfo_cal_field )
789 	PHP_FE( intlcal_get_time, ainfo_cal_only_cal )
790 	PHP_FE( intlcal_set_time, ainfo_cal_date )
791 	PHP_FE( intlcal_add, ainfo_cal_add )
792 	PHP_FE( intlcal_set_time_zone, ainfo_cal_set_time_zone )
793 	PHP_FE( intlcal_after, ainfo_cal_other_cal )
794 	PHP_FE( intlcal_before, ainfo_cal_other_cal )
795 	PHP_FE( intlcal_set, ainfo_cal_set )
796 	PHP_FE( intlcal_roll, ainfo_cal_roll )
797 	PHP_FE( intlcal_clear, ainfo_cal_clear )
798 	PHP_FE( intlcal_field_difference, ainfo_cal_field_difference )
799 	PHP_FE( intlcal_get_actual_maximum, ainfo_cal_field )
800 	PHP_FE( intlcal_get_actual_minimum, ainfo_cal_field )
801 #if U_ICU_VERSION_MAJOR_NUM * 10 + U_ICU_VERSION_MINOR_NUM >= 44
802 	PHP_FE( intlcal_get_day_of_week_type, ainfo_cal_dow )
803 #endif
804 	PHP_FE( intlcal_get_first_day_of_week, ainfo_cal_only_cal )
805 	PHP_FE( intlcal_get_greatest_minimum, ainfo_cal_field )
806 	PHP_FE( intlcal_get_least_maximum, ainfo_cal_field )
807 	PHP_FE( intlcal_get_locale, ainfo_cal_get_locale )
808 	PHP_FE( intlcal_get_maximum, ainfo_cal_field )
809 	PHP_FE( intlcal_get_minimal_days_in_first_week, ainfo_cal_only_cal )
810 	PHP_FE( intlcal_get_minimum, ainfo_cal_field )
811 	PHP_FE( intlcal_get_time_zone, ainfo_cal_only_cal )
812 	PHP_FE( intlcal_get_type, ainfo_cal_only_cal )
813 #if U_ICU_VERSION_MAJOR_NUM * 10 + U_ICU_VERSION_MINOR_NUM >= 44
814 	PHP_FE( intlcal_get_weekend_transition, ainfo_cal_dow )
815 #endif
816 	PHP_FE( intlcal_in_daylight_time, ainfo_cal_only_cal )
817 	PHP_FE( intlcal_is_equivalent_to, ainfo_cal_other_cal )
818 	PHP_FE( intlcal_is_lenient, ainfo_cal_only_cal )
819 	PHP_FE( intlcal_is_set, ainfo_cal_field )
820 #if U_ICU_VERSION_MAJOR_NUM * 10 + U_ICU_VERSION_MINOR_NUM >= 44
821 	PHP_FE( intlcal_is_weekend, ainfo_cal_date_optional )
822 #endif
823 	PHP_FE( intlcal_set_first_day_of_week, ainfo_cal_dow )
824 	PHP_FE( intlcal_set_lenient, ainfo_cal_set_lenient )
825 	PHP_FE( intlcal_set_minimal_days_in_first_week, ainfo_cal_set_minimal_days_in_first_week )
826 	PHP_FE( intlcal_equals, ainfo_cal_other_cal )
827 	PHP_FE( intlcal_from_date_time, ainfo_cal_from_date_time )
828 	PHP_FE( intlcal_to_date_time, ainfo_cal_only_cal )
829 #if U_ICU_VERSION_MAJOR_NUM >= 49
830 	PHP_FE( intlcal_get_repeated_wall_time_option, ainfo_cal_only_cal )
831 	PHP_FE( intlcal_get_skipped_wall_time_option, ainfo_cal_only_cal )
832 	PHP_FE( intlcal_set_repeated_wall_time_option, ainfo_cal_wall_time_option )
833 	PHP_FE( intlcal_set_skipped_wall_time_option, ainfo_cal_wall_time_option )
834 #endif
835 	PHP_FE( intlcal_get_error_code, ainfo_cal_only_cal )
836 	PHP_FE( intlcal_get_error_message, ainfo_cal_only_cal )
837 
838 	PHP_FE( intlgregcal_create_instance, ainfo_gregcal_create_instance )
839 	PHP_FE( intlgregcal_set_gregorian_change, ainfo_gregcal_set_gregorian_change )
840 	PHP_FE( intlgregcal_get_gregorian_change, ainfo_gregcal_only_gregcal )
841 	PHP_FE( intlgregcal_is_leap_year, ainfo_gregcal_is_leap_year )
842 
843 	/* common functions */
844 	PHP_FE( intl_get_error_code, intl_0_args )
845 	PHP_FE( intl_get_error_message, intl_0_args )
846 	PHP_FE( intl_is_failure, intl_1_arg )
847 	PHP_FE( intl_error_name, intl_1_arg )
848 
849 	PHP_FE_END
850 };
851 /* }}} */
852 
853 /* {{{ INI Settings */
854 PHP_INI_BEGIN()
855     STD_PHP_INI_ENTRY(LOCALE_INI_NAME, NULL, PHP_INI_ALL, OnUpdateStringUnempty, default_locale, zend_intl_globals, intl_globals)
856     STD_PHP_INI_ENTRY("intl.error_level", "0", PHP_INI_ALL, OnUpdateLong, error_level, zend_intl_globals, intl_globals)
857 	STD_PHP_INI_ENTRY("intl.use_exceptions", "0", PHP_INI_ALL, OnUpdateBool, use_exceptions, zend_intl_globals, intl_globals)
858 PHP_INI_END()
859 /* }}} */
860 
861 static PHP_GINIT_FUNCTION(intl);
862 
863 /* {{{ intl_module_entry */
864 zend_module_entry intl_module_entry = {
865 	STANDARD_MODULE_HEADER,
866 	"intl",
867 	intl_functions,
868 	PHP_MINIT( intl ),
869 	PHP_MSHUTDOWN( intl ),
870 	PHP_RINIT( intl ),
871 	PHP_RSHUTDOWN( intl ),
872 	PHP_MINFO( intl ),
873 	INTL_MODULE_VERSION,
874 	PHP_MODULE_GLOBALS(intl),   /* globals descriptor */
875 	PHP_GINIT(intl),            /* globals ctor */
876 	NULL,                       /* globals dtor */
877 	NULL,                       /* post deactivate */
878 	STANDARD_MODULE_PROPERTIES_EX
879 };
880 /* }}} */
881 
882 #ifdef COMPILE_DL_INTL
883 #ifdef ZTS
884 ZEND_TSRMLS_CACHE_DEFINE()
885 #endif
ZEND_GET_MODULE(intl)886 ZEND_GET_MODULE( intl )
887 #endif
888 
889 /* {{{ intl_init_globals */
890 static PHP_GINIT_FUNCTION(intl)
891 {
892 #if defined(COMPILE_DL_INTL) && defined(ZTS)
893 	ZEND_TSRMLS_CACHE_UPDATE();
894 #endif
895 	memset( intl_globals, 0, sizeof(zend_intl_globals) );
896 }
897 /* }}} */
898 
899 /* {{{ PHP_MINIT_FUNCTION
900  */
PHP_MINIT_FUNCTION(intl)901 PHP_MINIT_FUNCTION( intl )
902 {
903 	/* For the default locale php.ini setting */
904 	REGISTER_INI_ENTRIES();
905 
906 	REGISTER_LONG_CONSTANT("INTL_MAX_LOCALE_LEN", INTL_MAX_LOCALE_LEN, CONST_PERSISTENT | CONST_CS);
907 	REGISTER_STRING_CONSTANT("INTL_ICU_VERSION", U_ICU_VERSION, CONST_PERSISTENT | CONST_CS);
908 #ifdef U_ICU_DATA_VERSION
909 	REGISTER_STRING_CONSTANT("INTL_ICU_DATA_VERSION", U_ICU_DATA_VERSION, CONST_PERSISTENT | CONST_CS);
910 #endif
911 
912 	/* Register 'Collator' PHP class */
913 	collator_register_Collator_class(  );
914 
915 	/* Expose Collator constants to PHP scripts */
916 	collator_register_constants( INIT_FUNC_ARGS_PASSTHRU );
917 
918 	/* Register 'NumberFormatter' PHP class */
919 	formatter_register_class(  );
920 
921 	/* Expose NumberFormatter constants to PHP scripts */
922 	formatter_register_constants( INIT_FUNC_ARGS_PASSTHRU );
923 
924 	/* Register 'Normalizer' PHP class */
925 	normalizer_register_Normalizer_class(  );
926 
927 	/* Expose Normalizer constants to PHP scripts */
928 	normalizer_register_constants( INIT_FUNC_ARGS_PASSTHRU );
929 
930 	/* Register 'Locale' PHP class */
931 	locale_register_Locale_class(  );
932 
933 	/* Expose Locale constants to PHP scripts */
934 	locale_register_constants( INIT_FUNC_ARGS_PASSTHRU );
935 
936 	msgformat_register_class();
937 
938 	grapheme_register_constants( INIT_FUNC_ARGS_PASSTHRU );
939 
940 	/* Register 'DateFormat' PHP class */
941 	dateformat_register_IntlDateFormatter_class(  );
942 
943 	/* Expose DateFormat constants to PHP scripts */
944 	dateformat_register_constants( INIT_FUNC_ARGS_PASSTHRU );
945 
946 	/* Register 'ResourceBundle' PHP class */
947 	resourcebundle_register_class( );
948 
949 	/* Register 'Transliterator' PHP class */
950 	transliterator_register_Transliterator_class(  );
951 
952 	/* Register Transliterator constants */
953 	transliterator_register_constants( INIT_FUNC_ARGS_PASSTHRU );
954 
955 	/* Register 'IntlTimeZone' PHP class */
956 	timezone_register_IntlTimeZone_class(  );
957 
958 	/* Register 'IntlCalendar' PHP class */
959 	calendar_register_IntlCalendar_class(  );
960 
961 	/* Expose ICU error codes to PHP scripts. */
962 	intl_expose_icu_error_codes( INIT_FUNC_ARGS_PASSTHRU );
963 
964 	/* Expose IDN constants to PHP scripts. */
965 	idn_register_constants(INIT_FUNC_ARGS_PASSTHRU);
966 
967 #if U_ICU_VERSION_MAJOR_NUM * 1000 + U_ICU_VERSION_MINOR_NUM >= 4002
968 	/* Register 'Spoofchecker' PHP class */
969 	spoofchecker_register_Spoofchecker_class(  );
970 
971 	/* Expose Spoofchecker constants to PHP scripts */
972 	spoofchecker_register_constants( INIT_FUNC_ARGS_PASSTHRU );
973 #endif
974 
975 	/* Register 'IntlException' PHP class */
976 	intl_register_IntlException_class(  );
977 
978 	/* Register 'IntlIterator' PHP class */
979 	intl_register_IntlIterator_class(  );
980 
981 	/* Register 'BreakIterator' class */
982 	breakiterator_register_BreakIterator_class(  );
983 
984 	/* Register 'IntlPartsIterator' class */
985 	breakiterator_register_IntlPartsIterator_class(  );
986 
987 	/* Global error handling. */
988 	intl_error_init( NULL );
989 
990 	/* 'Converter' class for codepage conversions */
991 	php_converter_minit(INIT_FUNC_ARGS_PASSTHRU);
992 
993 	/* IntlChar class */
994 	php_uchar_minit(INIT_FUNC_ARGS_PASSTHRU);
995 
996 	return SUCCESS;
997 }
998 /* }}} */
999 
1000 #define EXPLICIT_CLEANUP_ENV_VAR "INTL_EXPLICIT_CLEANUP"
1001 
1002 /* {{{ PHP_MSHUTDOWN_FUNCTION
1003  */
PHP_MSHUTDOWN_FUNCTION(intl)1004 PHP_MSHUTDOWN_FUNCTION( intl )
1005 {
1006 	const char *cleanup;
1007     /* For the default locale php.ini setting */
1008     UNREGISTER_INI_ENTRIES();
1009 
1010 	cleanup = getenv(EXPLICIT_CLEANUP_ENV_VAR);
1011     if (cleanup != NULL && !(cleanup[0] == '0' && cleanup[1] == '\0')) {
1012 		u_cleanup();
1013     }
1014 
1015     return SUCCESS;
1016 }
1017 /* }}} */
1018 
1019 /* {{{ PHP_RINIT_FUNCTION
1020  */
PHP_RINIT_FUNCTION(intl)1021 PHP_RINIT_FUNCTION( intl )
1022 {
1023 	return SUCCESS;
1024 }
1025 /* }}} */
1026 
1027 /* {{{ PHP_RSHUTDOWN_FUNCTION
1028  */
PHP_RSHUTDOWN_FUNCTION(intl)1029 PHP_RSHUTDOWN_FUNCTION( intl )
1030 {
1031 	if(!Z_ISUNDEF(INTL_G(current_collator))) {
1032 		ZVAL_UNDEF(&INTL_G(current_collator));
1033 	}
1034 	if (INTL_G(grapheme_iterator)) {
1035 		grapheme_close_global_iterator(  );
1036 		INTL_G(grapheme_iterator) = NULL;
1037 	}
1038 
1039 	intl_error_reset( NULL);
1040 	return SUCCESS;
1041 }
1042 /* }}} */
1043 
1044 /* {{{ PHP_MINFO_FUNCTION
1045  */
PHP_MINFO_FUNCTION(intl)1046 PHP_MINFO_FUNCTION( intl )
1047 {
1048 #if !UCONFIG_NO_FORMATTING
1049 	UErrorCode status = U_ZERO_ERROR;
1050 	const char *tzdata_ver = NULL;
1051 #endif
1052 
1053 	php_info_print_table_start();
1054 	php_info_print_table_header( 2, "Internationalization support", "enabled" );
1055 	php_info_print_table_row( 2, "version", INTL_MODULE_VERSION );
1056 	php_info_print_table_row( 2, "ICU version", U_ICU_VERSION );
1057 #ifdef U_ICU_DATA_VERSION
1058 	php_info_print_table_row( 2, "ICU Data version", U_ICU_DATA_VERSION );
1059 #endif
1060 #if !UCONFIG_NO_FORMATTING
1061 	tzdata_ver = ucal_getTZDataVersion(&status);
1062 	if (U_ZERO_ERROR == status) {
1063 		php_info_print_table_row( 2, "ICU TZData version", tzdata_ver);
1064 	}
1065 #endif
1066 	php_info_print_table_row( 2, "ICU Unicode version", U_UNICODE_VERSION );
1067 	php_info_print_table_end();
1068 
1069     /* For the default locale php.ini setting */
1070     DISPLAY_INI_ENTRIES() ;
1071 }
1072 /* }}} */
1073 
1074 /*
1075  * Local variables:
1076  * tab-width: 4
1077  * c-basic-offset: 4
1078  * End:
1079  * vim600: noet sw=4 ts=4 fdm=marker
1080  * vim<600: noet sw=4 ts=4
1081  */
1082