xref: /PHP-5.3/ext/intl/php_intl.c (revision 9762609c)
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: 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 "formatter/formatter.h"
38 #include "formatter/formatter_class.h"
39 #include "formatter/formatter_attr.h"
40 #include "formatter/formatter_format.h"
41 #include "formatter/formatter_main.h"
42 #include "formatter/formatter_parse.h"
43 
44 #include "msgformat/msgformat.h"
45 #include "msgformat/msgformat_class.h"
46 #include "msgformat/msgformat_attr.h"
47 #include "msgformat/msgformat_format.h"
48 #include "msgformat/msgformat_parse.h"
49 
50 #include "normalizer/normalizer.h"
51 #include "normalizer/normalizer_class.h"
52 #include "normalizer/normalizer_normalize.h"
53 
54 #include "locale/locale.h"
55 #include "locale/locale_class.h"
56 #include "locale/locale_methods.h"
57 
58 #include "dateformat/dateformat.h"
59 #include "dateformat/dateformat_class.h"
60 #include "dateformat/dateformat_attr.h"
61 #include "dateformat/dateformat_format.h"
62 #include "dateformat/dateformat_parse.h"
63 #include "dateformat/dateformat_data.h"
64 
65 #include "resourcebundle/resourcebundle_class.h"
66 
67 #include "idn/idn.h"
68 
69 #include "msgformat/msgformat.h"
70 #include "common/common_error.h"
71 
72 #include <unicode/uloc.h>
73 #include <ext/standard/info.h>
74 
75 #include "php_ini.h"
76 #define INTL_MODULE_VERSION PHP_INTL_VERSION
77 
78 /*
79  * locale_get_default has a conflict since ICU also has
80  * a function with the same  name
81  * in fact ICU appends the version no. to it also
82  * Hence the following undef for ICU version
83  * Same true for the locale_set_default function
84 */
85 #undef locale_get_default
86 #undef locale_set_default
87 
88 ZEND_DECLARE_MODULE_GLOBALS( intl )
89 
90 /* {{{ Arguments info */
91 ZEND_BEGIN_ARG_INFO_EX(collator_static_0_args, 0, 0, 0)
92 ZEND_END_ARG_INFO()
93 
94 ZEND_BEGIN_ARG_INFO_EX(collator_static_1_arg, 0, 0, 1)
95 	ZEND_ARG_INFO(0, arg1)
96 ZEND_END_ARG_INFO()
97 
98 ZEND_BEGIN_ARG_INFO_EX(collator_static_2_args, 0, 0, 2)
99 	ZEND_ARG_INFO(0, arg1)
100 	ZEND_ARG_INFO(0, arg2)
101 ZEND_END_ARG_INFO()
102 
103 ZEND_BEGIN_ARG_INFO_EX(collator_0_args, 0, 0, 1)
104 	ZEND_ARG_OBJ_INFO(0, object, Collator, 0)
105 ZEND_END_ARG_INFO()
106 
107 ZEND_BEGIN_ARG_INFO_EX(collator_1_arg, 0, 0, 2)
108 	ZEND_ARG_OBJ_INFO(0, object, Collator, 0)
109 	ZEND_ARG_INFO(0, arg1)
110 ZEND_END_ARG_INFO()
111 
112 ZEND_BEGIN_ARG_INFO_EX(collator_2_args, 0, 0, 3)
113 	ZEND_ARG_OBJ_INFO(0, object, Collator, 0)
114 	ZEND_ARG_INFO(0, arg1)
115 	ZEND_ARG_INFO(0, arg2)
116 ZEND_END_ARG_INFO()
117 
118 ZEND_BEGIN_ARG_INFO_EX(collator_sort_args, 0, 0, 2)
119 	ZEND_ARG_OBJ_INFO(0, object, Collator, 0)
120 	ZEND_ARG_ARRAY_INFO(1, arr, 0)
121 	ZEND_ARG_INFO(0, sort_flags)
122 ZEND_END_ARG_INFO()
123 
124 ZEND_BEGIN_ARG_INFO_EX(numfmt_parse_arginfo, 0, 0, 2)
125 	ZEND_ARG_INFO(0, formatter)
126 	ZEND_ARG_INFO(0, string)
127 	ZEND_ARG_INFO(0, type)
128 	ZEND_ARG_INFO(1, position)
129 ZEND_END_ARG_INFO()
130 
131 ZEND_BEGIN_ARG_INFO_EX(numfmt_parse_currency_arginfo, 0, 0, 3)
132 	ZEND_ARG_INFO(0, formatter)
133 	ZEND_ARG_INFO(0, string)
134 	ZEND_ARG_INFO(1, currency)
135 	ZEND_ARG_INFO(1, position)
136 ZEND_END_ARG_INFO()
137 
138 ZEND_BEGIN_ARG_INFO_EX(locale_0_args, 0, 0, 0)
139 ZEND_END_ARG_INFO()
140 
141 ZEND_BEGIN_ARG_INFO_EX(locale_1_arg, 0, 0, 1)
142 	ZEND_ARG_INFO(0, arg1)
143 ZEND_END_ARG_INFO()
144 
145 ZEND_BEGIN_ARG_INFO_EX(locale_2_args, 0, 0, 2)
146 	ZEND_ARG_INFO(0, arg1)
147 	ZEND_ARG_INFO(0, arg2)
148 ZEND_END_ARG_INFO()
149 
150 ZEND_BEGIN_ARG_INFO_EX(locale_3_args, 0, 0, 3)
151 	ZEND_ARG_INFO(0, arg1)
152 	ZEND_ARG_INFO(0, arg2)
153 	ZEND_ARG_INFO(0, arg3)
154 ZEND_END_ARG_INFO()
155 
156 ZEND_BEGIN_ARG_INFO_EX(locale_4_args, 0, 0, 4)
157 	ZEND_ARG_INFO(0, arg1)
158 	ZEND_ARG_INFO(0, arg2)
159 	ZEND_ARG_INFO(0, arg3)
160 	ZEND_ARG_INFO(0, arg4)
161 ZEND_END_ARG_INFO()
162 
163 #define intl_0_args collator_static_0_args
164 #define intl_1_arg collator_static_1_arg
165 
166 ZEND_BEGIN_ARG_INFO_EX(normalizer_args, 0, 0, 1)
167 	ZEND_ARG_INFO(0, input)
168 	ZEND_ARG_INFO(0, form)
169 ZEND_END_ARG_INFO()
170 
171 ZEND_BEGIN_ARG_INFO_EX(grapheme_1_arg, 0, 0, 1)
172 	ZEND_ARG_INFO(0, string)
173 ZEND_END_ARG_INFO()
174 
175 ZEND_BEGIN_ARG_INFO_EX(grapheme_search_args, 0, 0, 2)
176 	ZEND_ARG_INFO(0, haystack)
177 	ZEND_ARG_INFO(0, needle)
178 	ZEND_ARG_INFO(0, offset)
179 ZEND_END_ARG_INFO()
180 
181 ZEND_BEGIN_ARG_INFO_EX(grapheme_substr_args, 0, 0, 2)
182 	ZEND_ARG_INFO(0, string)
183 	ZEND_ARG_INFO(0, start)
184 	ZEND_ARG_INFO(0, length)
185 ZEND_END_ARG_INFO()
186 
187 ZEND_BEGIN_ARG_INFO_EX(grapheme_strstr_args, 0, 0, 2)
188 	ZEND_ARG_INFO(0, haystack)
189 	ZEND_ARG_INFO(0, needle)
190 	ZEND_ARG_INFO(0, before_needle)
191 ZEND_END_ARG_INFO()
192 
193 ZEND_BEGIN_ARG_INFO_EX(grapheme_extract_args, 0, 0, 2)
194 	ZEND_ARG_INFO(0, arg1)
195 	ZEND_ARG_INFO(0, arg2)
196 	ZEND_ARG_INFO(0, arg3)
197 	ZEND_ARG_INFO(0, arg4)
198 	ZEND_ARG_INFO(1, arg5)  /* 1 = pass by reference */
199 ZEND_END_ARG_INFO()
200 
201 ZEND_BEGIN_ARG_INFO_EX(datefmt_parse_args, 0, 0, 2)
202 	ZEND_ARG_INFO(0, formatter)
203 	ZEND_ARG_INFO(0, string)
204 	ZEND_ARG_INFO(1, position)
205 ZEND_END_ARG_INFO()
206 
207 ZEND_BEGIN_ARG_INFO_EX(arginfo_numfmt_create, 0, 0, 2)
208 	ZEND_ARG_INFO(0, locale)
209 	ZEND_ARG_INFO(0, style)
210 	ZEND_ARG_INFO(0, pattern)
211 ZEND_END_ARG_INFO()
212 
213 ZEND_BEGIN_ARG_INFO_EX(arginfo_numfmt_get_error_code, 0, 0, 1)
214 	ZEND_ARG_INFO(0, nf)
215 ZEND_END_ARG_INFO()
216 
217 ZEND_BEGIN_ARG_INFO_EX(arginfo_numfmt_format, 0, 0, 2)
218 	ZEND_ARG_INFO(0, nf)
219 	ZEND_ARG_INFO(0, num)
220 	ZEND_ARG_INFO(0, type)
221 ZEND_END_ARG_INFO()
222 
223 ZEND_BEGIN_ARG_INFO_EX(arginfo_numfmt_format_currency, 0, 0, 3)
224 	ZEND_ARG_INFO(0, nf)
225 	ZEND_ARG_INFO(0, num)
226 	ZEND_ARG_INFO(0, currency)
227 ZEND_END_ARG_INFO()
228 
229 ZEND_BEGIN_ARG_INFO_EX(arginfo_numfmt_get_attribute, 0, 0, 2)
230 	ZEND_ARG_INFO(0, nf)
231 	ZEND_ARG_INFO(0, attr)
232 ZEND_END_ARG_INFO()
233 
234 ZEND_BEGIN_ARG_INFO_EX(arginfo_numfmt_set_attribute, 0, 0, 3)
235 	ZEND_ARG_INFO(0, nf)
236 	ZEND_ARG_INFO(0, attr)
237 	ZEND_ARG_INFO(0, value)
238 ZEND_END_ARG_INFO()
239 
240 ZEND_BEGIN_ARG_INFO_EX(arginfo_numfmt_set_symbol, 0, 0, 3)
241 	ZEND_ARG_INFO(0, nf)
242 	ZEND_ARG_INFO(0, attr)
243 	ZEND_ARG_INFO(0, symbol)
244 ZEND_END_ARG_INFO()
245 
246 ZEND_BEGIN_ARG_INFO_EX(arginfo_numfmt_set_pattern, 0, 0, 2)
247 	ZEND_ARG_INFO(0, nf)
248 	ZEND_ARG_INFO(0, pattern)
249 ZEND_END_ARG_INFO()
250 
251 ZEND_BEGIN_ARG_INFO_EX(arginfo_numfmt_get_locale, 0, 0, 1)
252 	ZEND_ARG_INFO(0, nf)
253 	ZEND_ARG_INFO(0, type)
254 ZEND_END_ARG_INFO()
255 
256 ZEND_BEGIN_ARG_INFO_EX(arginfo_msgfmt_create, 0, 0, 2)
257 	ZEND_ARG_INFO(0, locale)
258 	ZEND_ARG_INFO(0, pattern)
259 ZEND_END_ARG_INFO()
260 
261 ZEND_BEGIN_ARG_INFO_EX(arginfo_msgfmt_get_error_code, 0, 0, 1)
262 	ZEND_ARG_INFO(0, nf)
263 ZEND_END_ARG_INFO()
264 
265 ZEND_BEGIN_ARG_INFO_EX(arginfo_msgfmt_get_error_message, 0, 0, 1)
266 	ZEND_ARG_INFO(0, coll)
267 ZEND_END_ARG_INFO()
268 
269 ZEND_BEGIN_ARG_INFO_EX(arginfo_msgfmt_format, 0, 0, 2)
270 	ZEND_ARG_INFO(0, nf)
271 	ZEND_ARG_INFO(0, args)
272 ZEND_END_ARG_INFO()
273 
274 ZEND_BEGIN_ARG_INFO_EX(arginfo_msgfmt_format_message, 0, 0, 3)
275 	ZEND_ARG_INFO(0, locale)
276 	ZEND_ARG_INFO(0, pattern)
277 	ZEND_ARG_INFO(0, args)
278 ZEND_END_ARG_INFO()
279 
280 ZEND_BEGIN_ARG_INFO_EX(arginfo_msgfmt_parse, 0, 0, 2)
281 	ZEND_ARG_INFO(0, nf)
282 	ZEND_ARG_INFO(0, source)
283 ZEND_END_ARG_INFO()
284 
285 ZEND_BEGIN_ARG_INFO_EX(arginfo_numfmt_parse_message, 0, 0, 3)
286 	ZEND_ARG_INFO(0, locale)
287 	ZEND_ARG_INFO(0, pattern)
288 	ZEND_ARG_INFO(0, source)
289 ZEND_END_ARG_INFO()
290 
291 ZEND_BEGIN_ARG_INFO_EX(arginfo_msgfmt_set_pattern, 0, 0, 2)
292 	ZEND_ARG_INFO(0, mf)
293 	ZEND_ARG_INFO(0, pattern)
294 ZEND_END_ARG_INFO()
295 
296 ZEND_BEGIN_ARG_INFO_EX(arginfo_msgfmt_get_locale, 0, 0, 1)
297 	ZEND_ARG_INFO(0, mf)
298 ZEND_END_ARG_INFO()
299 
300 ZEND_BEGIN_ARG_INFO_EX(arginfo_datefmt_set_pattern, 0, 0, 2)
301 	ZEND_ARG_INFO(0, mf)
302 	ZEND_ARG_INFO(0, pattern)
303 ZEND_END_ARG_INFO()
304 
305 ZEND_BEGIN_ARG_INFO_EX(arginfo_datefmt_set_calendar, 0, 0, 2)
306 	ZEND_ARG_INFO(0, mf)
307 	ZEND_ARG_INFO(0, calendar)
308 ZEND_END_ARG_INFO()
309 
310 ZEND_BEGIN_ARG_INFO_EX(arginfo_datefmt_format, 0, 0, 0)
311 	ZEND_ARG_INFO(0, args)
312 	ZEND_ARG_INFO(0, array)
313 ZEND_END_ARG_INFO()
314 
315 ZEND_BEGIN_ARG_INFO_EX(arginfo_datefmt_create, 0, 0, 3)
316 	ZEND_ARG_INFO(0, locale)
317 	ZEND_ARG_INFO(0, date_type)
318 	ZEND_ARG_INFO(0, time_type)
319 	ZEND_ARG_INFO(0, timezone_str)
320 	ZEND_ARG_INFO(0, calendar)
321 	ZEND_ARG_INFO(0, pattern)
322 ZEND_END_ARG_INFO()
323 
324 ZEND_BEGIN_ARG_INFO_EX(arginfo_idn_to_ascii, 0, 0, 1)
325 	ZEND_ARG_INFO(0, domain)
326 	ZEND_ARG_INFO(0, option)
327 	ZEND_ARG_INFO(0, status)
328 ZEND_END_ARG_INFO()
329 
330 ZEND_BEGIN_ARG_INFO_EX(arginfo_idn_to_utf8, 0, 0, 1)
331 	ZEND_ARG_INFO(0, domain)
332 	ZEND_ARG_INFO(0, option)
333 	ZEND_ARG_INFO(0, status)
334 ZEND_END_ARG_INFO()
335 
336 ZEND_BEGIN_ARG_INFO_EX( arginfo_resourcebundle_create_proc, 0, 0, 2 )
337 	ZEND_ARG_INFO( 0, locale )
338 	ZEND_ARG_INFO( 0, bundlename )
339 	ZEND_ARG_INFO( 0, fallback )
340 ZEND_END_ARG_INFO()
341 
342 ZEND_BEGIN_ARG_INFO_EX( arginfo_resourcebundle_get_proc, 0, 0, 2 )
343     ZEND_ARG_INFO( 0, bundle )
344 	ZEND_ARG_INFO( 0, index )
345 	ZEND_ARG_INFO( 0, fallback )
346 ZEND_END_ARG_INFO()
347 
348 ZEND_BEGIN_ARG_INFO_EX( arginfo_resourcebundle_count_proc, 0, 0, 1 )
349   ZEND_ARG_INFO( 0, bundle )
350 ZEND_END_ARG_INFO()
351 
352 ZEND_BEGIN_ARG_INFO_EX( arginfo_resourcebundle_locales_proc, 0, 0, 1 )
353 	ZEND_ARG_INFO( 0, bundlename )
354 ZEND_END_ARG_INFO()
355 
356 ZEND_BEGIN_ARG_INFO_EX( arginfo_resourcebundle_get_error_code_proc, 0, 0, 1 )
357   ZEND_ARG_INFO( 0, bundle )
358 ZEND_END_ARG_INFO()
359 
360 ZEND_BEGIN_ARG_INFO_EX( arginfo_resourcebundle_get_error_message_proc, 0, 0, 1 )
361   ZEND_ARG_INFO( 0, bundle )
362 ZEND_END_ARG_INFO()
363 
364 
365 /* }}} */
366 
367 /* {{{ intl_functions
368  *
369  * Every user visible function must have an entry in intl_functions[].
370  */
371 zend_function_entry intl_functions[] = {
372 
373 	/* collator functions */
374 	PHP_FE( collator_create, collator_static_1_arg )
375 	PHP_FE( collator_compare, collator_2_args )
376 	PHP_FE( collator_get_attribute, collator_1_arg )
377 	PHP_FE( collator_set_attribute, collator_2_args )
378 	PHP_FE( collator_get_strength, collator_0_args )
379 	PHP_FE( collator_set_strength, collator_1_arg )
380 	PHP_FE( collator_sort, collator_sort_args )
381 	PHP_FE( collator_sort_with_sort_keys, collator_sort_args )
382 	PHP_FE( collator_asort, collator_sort_args )
383 	PHP_FE( collator_get_locale, collator_1_arg )
384 	PHP_FE( collator_get_error_code, collator_0_args )
385 	PHP_FE( collator_get_error_message, collator_0_args )
386 	PHP_FE( collator_get_sort_key, collator_2_args )
387 
388 	/* formatter functions */
389 	PHP_FE( numfmt_create, arginfo_numfmt_create )
390 	PHP_FE( numfmt_format, arginfo_numfmt_format )
391 	PHP_FE( numfmt_parse, numfmt_parse_arginfo )
392 	PHP_FE( numfmt_format_currency, arginfo_numfmt_format_currency )
393 	PHP_FE( numfmt_parse_currency, numfmt_parse_currency_arginfo )
394 	PHP_FE( numfmt_set_attribute, arginfo_numfmt_set_attribute )
395 	PHP_FE( numfmt_get_attribute, arginfo_numfmt_get_attribute )
396 	PHP_FE( numfmt_set_text_attribute, arginfo_numfmt_set_attribute )
397 	PHP_FE( numfmt_get_text_attribute, arginfo_numfmt_get_attribute )
398 	PHP_FE( numfmt_set_symbol, arginfo_numfmt_set_symbol )
399 	PHP_FE( numfmt_get_symbol, arginfo_numfmt_get_attribute )
400 	PHP_FE( numfmt_set_pattern, arginfo_numfmt_set_pattern )
401 	PHP_FE( numfmt_get_pattern, arginfo_numfmt_get_error_code )
402 	PHP_FE( numfmt_get_locale, arginfo_numfmt_get_locale )
403 	PHP_FE( numfmt_get_error_code, arginfo_numfmt_get_error_code )
404 	PHP_FE( numfmt_get_error_message, arginfo_numfmt_get_error_code )
405 
406 	/* normalizer functions */
407 	PHP_FE( normalizer_normalize, normalizer_args )
408 	PHP_FE( normalizer_is_normalized, normalizer_args )
409 
410 	/* Locale functions */
411 	PHP_NAMED_FE( locale_get_default, zif_locale_get_default, locale_0_args )
412 	PHP_NAMED_FE( locale_set_default, zif_locale_set_default, locale_1_arg )
413 	PHP_FE( locale_get_primary_language, locale_1_arg )
414 	PHP_FE( locale_get_script, locale_1_arg )
415 	PHP_FE( locale_get_region, locale_1_arg )
416 	PHP_FE( locale_get_keywords, locale_1_arg )
417 	PHP_FE( locale_get_display_script, locale_2_args )
418 	PHP_FE( locale_get_display_region, locale_2_args )
419 	PHP_FE( locale_get_display_name, locale_2_args )
420 	PHP_FE( locale_get_display_language, locale_2_args)
421 	PHP_FE( locale_get_display_variant, locale_2_args )
422 	PHP_FE( locale_compose, locale_1_arg )
423 	PHP_FE( locale_parse, locale_1_arg )
424 	PHP_FE( locale_get_all_variants, locale_1_arg )
425 	PHP_FE( locale_filter_matches, locale_3_args )
426 	PHP_FE( locale_canonicalize, locale_1_arg )
427 	PHP_FE( locale_lookup, locale_4_args )
428 	PHP_FE( locale_accept_from_http, locale_1_arg )
429 
430 	/* MessageFormatter functions */
431 	PHP_FE( msgfmt_create, arginfo_msgfmt_create )
432 	PHP_FE( msgfmt_format, arginfo_msgfmt_format )
433 	PHP_FE( msgfmt_format_message, arginfo_msgfmt_format_message )
434 	PHP_FE( msgfmt_parse, arginfo_msgfmt_parse )
435 	PHP_FE( msgfmt_parse_message, arginfo_numfmt_parse_message )
436 	PHP_FE( msgfmt_set_pattern, arginfo_msgfmt_set_pattern )
437 	PHP_FE( msgfmt_get_pattern, arginfo_msgfmt_get_locale )
438 	PHP_FE( msgfmt_get_locale, arginfo_msgfmt_get_locale )
439 	PHP_FE( msgfmt_get_error_code, arginfo_msgfmt_get_error_code )
440 	PHP_FE( msgfmt_get_error_message, arginfo_msgfmt_get_error_message )
441 
442 	/* IntlDateFormatter functions */
443 	PHP_FE( datefmt_create, arginfo_datefmt_create )
444 	PHP_FE( datefmt_get_datetype, arginfo_msgfmt_get_locale )
445 	PHP_FE( datefmt_get_timetype, arginfo_msgfmt_get_locale )
446 	PHP_FE( datefmt_get_calendar, arginfo_msgfmt_get_locale )
447 	PHP_FE( datefmt_set_calendar, arginfo_datefmt_set_calendar )
448 	PHP_FE( datefmt_get_locale, arginfo_msgfmt_get_locale )
449 	PHP_FE( datefmt_get_timezone_id, arginfo_msgfmt_get_locale )
450 	PHP_FE( datefmt_set_timezone_id, arginfo_msgfmt_get_locale )
451 	PHP_FE( datefmt_get_pattern, arginfo_msgfmt_get_locale )
452 	PHP_FE( datefmt_set_pattern, arginfo_datefmt_set_pattern )
453 	PHP_FE( datefmt_is_lenient, arginfo_msgfmt_get_locale )
454 	PHP_FE( datefmt_set_lenient, arginfo_msgfmt_get_locale )
455 	PHP_FE( datefmt_format, arginfo_datefmt_format )
456 	PHP_FE( datefmt_parse, datefmt_parse_args )
457 	PHP_FE( datefmt_localtime , datefmt_parse_args )
458 	PHP_FE( datefmt_get_error_code, arginfo_msgfmt_get_error_code )
459 	PHP_FE( datefmt_get_error_message, arginfo_msgfmt_get_error_message )
460 
461 	/* grapheme functions */
462 	PHP_FE( grapheme_strlen, grapheme_1_arg )
463 	PHP_FE( grapheme_strpos, grapheme_search_args )
464 	PHP_FE( grapheme_stripos, grapheme_search_args )
465 	PHP_FE( grapheme_strrpos, grapheme_search_args )
466 	PHP_FE( grapheme_strripos, grapheme_search_args )
467 	PHP_FE( grapheme_substr, grapheme_substr_args )
468 	PHP_FE( grapheme_strstr, grapheme_strstr_args )
469 	PHP_FE( grapheme_stristr, grapheme_strstr_args )
470 	PHP_FE( grapheme_extract, grapheme_extract_args )
471 
472 	/* IDN functions */
473 	PHP_FE( idn_to_ascii, arginfo_idn_to_ascii)
474 	PHP_FE( idn_to_utf8, arginfo_idn_to_ascii)
475 
476 	/* ResourceBundle functions */
477 	PHP_FE( resourcebundle_create, arginfo_resourcebundle_create_proc )
478 	PHP_FE( resourcebundle_get, arginfo_resourcebundle_get_proc )
479 	PHP_FE( resourcebundle_count, arginfo_resourcebundle_count_proc )
480 	PHP_FE( resourcebundle_locales, arginfo_resourcebundle_locales_proc )
481 	PHP_FE( resourcebundle_get_error_code, arginfo_resourcebundle_get_error_code_proc )
482 	PHP_FE( resourcebundle_get_error_message, arginfo_resourcebundle_get_error_message_proc )
483 
484 	/* common functions */
485 	PHP_FE( intl_get_error_code, intl_0_args )
486 	PHP_FE( intl_get_error_message, intl_0_args )
487 	PHP_FE( intl_is_failure, intl_1_arg )
488 	PHP_FE( intl_error_name, intl_1_arg )
489 
490 	PHP_FE_END
491 };
492 /* }}} */
493 
494 
495 /* {{{ INI Settings */
496 PHP_INI_BEGIN()
497     STD_PHP_INI_ENTRY(LOCALE_INI_NAME, NULL, PHP_INI_ALL, OnUpdateStringUnempty, default_locale, zend_intl_globals, intl_globals)
498     STD_PHP_INI_ENTRY("intl.error_level", "0", PHP_INI_ALL, OnUpdateLong, error_level, zend_intl_globals, intl_globals)
499 
500 PHP_INI_END()
501 /* }}} */
502 
503 
504 static PHP_GINIT_FUNCTION(intl);
505 
506 /* {{{ intl_module_entry */
507 zend_module_entry intl_module_entry = {
508 #if ZEND_MODULE_API_NO >= 20010901
509 	STANDARD_MODULE_HEADER,
510 #endif
511 	"intl",
512 	intl_functions,
513 	PHP_MINIT( intl ),
514 	PHP_MSHUTDOWN( intl ),
515 	PHP_RINIT( intl ),
516 	PHP_RSHUTDOWN( intl ),
517 	PHP_MINFO( intl ),
518 	INTL_MODULE_VERSION,
519 	PHP_MODULE_GLOBALS(intl),   /* globals descriptor */
520 	PHP_GINIT(intl),            /* globals ctor */
521 	NULL,                       /* globals dtor */
522 	NULL,                       /* post deactivate */
523 	STANDARD_MODULE_PROPERTIES_EX
524 };
525 /* }}} */
526 
527 #ifdef COMPILE_DL_INTL
528 ZEND_GET_MODULE( intl )
529 #endif
530 
531 /* {{{ intl_init_globals */
PHP_GINIT_FUNCTION(intl)532 static PHP_GINIT_FUNCTION(intl)
533 {
534 	memset( intl_globals, 0, sizeof(zend_intl_globals) );
535 }
536 /* }}} */
537 
538 /* {{{ PHP_MINIT_FUNCTION
539  */
PHP_MINIT_FUNCTION(intl)540 PHP_MINIT_FUNCTION( intl )
541 {
542 	/* For the default locale php.ini setting */
543 	REGISTER_INI_ENTRIES();
544 
545 	REGISTER_LONG_CONSTANT("INTL_MAX_LOCALE_LEN", INTL_MAX_LOCALE_LEN, CONST_CS);
546 	REGISTER_STRING_CONSTANT("INTL_ICU_VERSION", U_ICU_VERSION, CONST_PERSISTENT | CONST_CS);
547 #ifdef U_ICU_DATA_VERSION
548 	REGISTER_STRING_CONSTANT("INTL_ICU_DATA_VERSION", U_ICU_DATA_VERSION, CONST_PERSISTENT | CONST_CS);
549 #endif
550 
551 	/* Register 'Collator' PHP class */
552 	collator_register_Collator_class( TSRMLS_C );
553 
554 	/* Expose Collator constants to PHP scripts */
555 	collator_register_constants( INIT_FUNC_ARGS_PASSTHRU );
556 
557 	/* Register 'NumberFormatter' PHP class */
558 	formatter_register_class( TSRMLS_C );
559 
560 	/* Expose NumberFormatter constants to PHP scripts */
561 	formatter_register_constants( INIT_FUNC_ARGS_PASSTHRU );
562 
563 	/* Register 'Normalizer' PHP class */
564 	normalizer_register_Normalizer_class( TSRMLS_C );
565 
566 	/* Expose Normalizer constants to PHP scripts */
567 	normalizer_register_constants( INIT_FUNC_ARGS_PASSTHRU );
568 
569 	/* Register 'Locale' PHP class */
570 	locale_register_Locale_class( TSRMLS_C );
571 
572 	/* Expose Locale constants to PHP scripts */
573 	locale_register_constants( INIT_FUNC_ARGS_PASSTHRU );
574 
575 	msgformat_register_class(TSRMLS_C);
576 
577 	grapheme_register_constants( INIT_FUNC_ARGS_PASSTHRU );
578 
579 	/* Register 'DateFormat' PHP class */
580 	dateformat_register_IntlDateFormatter_class( TSRMLS_C );
581 
582 	/* Expose DateFormat constants to PHP scripts */
583 	dateformat_register_constants( INIT_FUNC_ARGS_PASSTHRU );
584 
585 	/* Register 'ResourceBundle' PHP class */
586 	resourcebundle_register_class( TSRMLS_C);
587 
588 	/* Expose ICU error codes to PHP scripts. */
589 	intl_expose_icu_error_codes( INIT_FUNC_ARGS_PASSTHRU );
590 
591 	/* Expose IDN constants to PHP scripts. */
592 	idn_register_constants(INIT_FUNC_ARGS_PASSTHRU);
593 
594 	/* Global error handling. */
595 	intl_error_init( NULL TSRMLS_CC );
596 
597 	/* Set the default_locale value */
598 	if( INTL_G(default_locale) == NULL ) {
599 		INTL_G(default_locale) = pestrdup(uloc_getDefault(), 1) ;
600 	}
601 
602 	return SUCCESS;
603 }
604 /* }}} */
605 
606 /* {{{ PHP_MSHUTDOWN_FUNCTION
607  */
PHP_MSHUTDOWN_FUNCTION(intl)608 PHP_MSHUTDOWN_FUNCTION( intl )
609 {
610     /* For the default locale php.ini setting */
611     UNREGISTER_INI_ENTRIES();
612 
613     return SUCCESS;
614 }
615 /* }}} */
616 
617 /* {{{ PHP_RINIT_FUNCTION
618  */
PHP_RINIT_FUNCTION(intl)619 PHP_RINIT_FUNCTION( intl )
620 {
621 	/* Set the default_locale value */
622     if( INTL_G(default_locale) == NULL ) {
623         INTL_G(default_locale) = pestrdup(uloc_getDefault(), 1) ;
624     }
625 	return SUCCESS;
626 }
627 /* }}} */
628 
629 /* {{{ PHP_RSHUTDOWN_FUNCTION
630  */
PHP_RSHUTDOWN_FUNCTION(intl)631 PHP_RSHUTDOWN_FUNCTION( intl )
632 {
633 	if(INTL_G(current_collator)) {
634 		INTL_G(current_collator) = NULL;
635 	}
636 	if (INTL_G(grapheme_iterator)) {
637 		grapheme_close_global_iterator( TSRMLS_C );
638 		INTL_G(grapheme_iterator) = NULL;
639 	}
640 
641 	intl_error_reset( NULL TSRMLS_CC);
642 	return SUCCESS;
643 }
644 /* }}} */
645 
646 /* {{{ PHP_MINFO_FUNCTION
647  */
PHP_MINFO_FUNCTION(intl)648 PHP_MINFO_FUNCTION( intl )
649 {
650 	php_info_print_table_start();
651 	php_info_print_table_header( 2, "Internationalization support", "enabled" );
652 	php_info_print_table_row( 2, "version", INTL_MODULE_VERSION );
653 	php_info_print_table_row( 2, "ICU version", U_ICU_VERSION );
654 #ifdef U_ICU_DATA_VERSION
655 	php_info_print_table_row( 2, "ICU Data version", U_ICU_DATA_VERSION );
656 #endif
657 	php_info_print_table_end();
658 
659     /* For the default locale php.ini setting */
660     DISPLAY_INI_ENTRIES() ;
661 }
662 /* }}} */
663 
664 /*
665  * Local variables:
666  * tab-width: 4
667  * c-basic-offset: 4
668  * End:
669  * vim600: noet sw=4 ts=4 fdm=marker
670  * vim<600: noet sw=4 ts=4
671  */
672