2 +----------------------------------------------------------------------+
4 +----------------------------------------------------------------------+
5 | Copyright (c) 1998-2013 Zend Technologies Ltd. (http://www.zend.com) |
6 +----------------------------------------------------------------------+
7 | This source file is subject to version 2.00 of the Zend license, |
8 | that is bundled with this package in the file LICENSE, and is |
9 | available through the world-wide-web at |
10 | http://www.zend.com/license/2_00.txt. |
11 | If you did not receive a copy of the Zend license and are unable to |
12 | obtain it through the world-wide-web, please send a note to |
13 | license@zend.com so we can mail you a copy immediately. |
14 +----------------------------------------------------------------------+
15 | Authors: Masaki Fujimoto <fujimoto@php.net> |
16 | Rui Hirokawa <hirokawa@php.net> |
17 +----------------------------------------------------------------------+
23 #include "zend_compile.h"
24 #include "zend_operators.h"
25 #include "zend_multibyte.h"
28 static const zend_encoding
*dummy_encoding_fetcher(const char *encoding_name TSRMLS_DC
)
33 static const char *dummy_encoding_name_getter(const zend_encoding
*encoding
)
35 return (const char*)encoding
;
38 static int dummy_encoding_lexer_compatibility_checker(const zend_encoding
*encoding
)
43 static const zend_encoding
*dummy_encoding_detector(const unsigned char *string
, size_t length
, const zend_encoding
**list
, size_t list_size TSRMLS_DC
)
48 static size_t dummy_encoding_converter(unsigned char **to
, size_t *to_length
, const unsigned char *from
, size_t from_length
, const zend_encoding
*encoding_to
, const zend_encoding
*encoding_from TSRMLS_DC
)
53 static int dummy_encoding_list_parser(const char *encoding_list
, size_t encoding_list_len
, const zend_encoding
***return_list
, size_t *return_size
, int persistent TSRMLS_DC
)
55 *return_list
= pemalloc(0, persistent
);
60 static const zend_encoding
*dummy_internal_encoding_getter(TSRMLS_D
)
65 static int dummy_internal_encoding_setter(const zend_encoding
*encoding TSRMLS_DC
)
70 static zend_multibyte_functions multibyte_functions
= {
72 dummy_encoding_fetcher
,
73 dummy_encoding_name_getter
,
74 dummy_encoding_lexer_compatibility_checker
,
75 dummy_encoding_detector
,
76 dummy_encoding_converter
,
77 dummy_encoding_list_parser
,
78 dummy_internal_encoding_getter
,
79 dummy_internal_encoding_setter
82 ZEND_API
const zend_encoding
*zend_multibyte_encoding_utf32be
= (const zend_encoding
*)"UTF-32BE";
83 ZEND_API
const zend_encoding
*zend_multibyte_encoding_utf32le
= (const zend_encoding
*)"UTF-32LE";
84 ZEND_API
const zend_encoding
*zend_multibyte_encoding_utf16be
= (const zend_encoding
*)"UTF-16BE";
85 ZEND_API
const zend_encoding
*zend_multibyte_encoding_utf16le
= (const zend_encoding
*)"UTF-32LE";
86 ZEND_API
const zend_encoding
*zend_multibyte_encoding_utf8
= (const zend_encoding
*)"UTF-8";
88 ZEND_API
int zend_multibyte_set_functions(const zend_multibyte_functions
*functions TSRMLS_DC
)
90 zend_multibyte_encoding_utf32be
= functions
->encoding_fetcher("UTF-32BE" TSRMLS_CC
);
91 if (!zend_multibyte_encoding_utf32be
) {
94 zend_multibyte_encoding_utf32le
= functions
->encoding_fetcher("UTF-32LE" TSRMLS_CC
);
95 if (!zend_multibyte_encoding_utf32le
) {
98 zend_multibyte_encoding_utf16be
= functions
->encoding_fetcher("UTF-16BE" TSRMLS_CC
);
99 if (!zend_multibyte_encoding_utf16be
) {
102 zend_multibyte_encoding_utf16le
= functions
->encoding_fetcher("UTF-16LE" TSRMLS_CC
);
103 if (!zend_multibyte_encoding_utf16le
) {
106 zend_multibyte_encoding_utf8
= functions
->encoding_fetcher("UTF-8" TSRMLS_CC
);
107 if (!zend_multibyte_encoding_utf8
) {
111 multibyte_functions
= *functions
;
113 /* As zend_multibyte_set_functions() gets called after ini settings were
114 * populated, we need to reinitialize script_encoding here.
117 const char *value
= zend_ini_string("zend.script_encoding", sizeof("zend.script_encoding"), 0);
118 zend_multibyte_set_script_encoding_by_string(value
, strlen(value
) TSRMLS_CC
);
123 ZEND_API
const zend_multibyte_functions
*zend_multibyte_get_functions(TSRMLS_D
)
125 return multibyte_functions
.provider_name
? &multibyte_functions
: NULL
;
128 ZEND_API
const zend_encoding
*zend_multibyte_fetch_encoding(const char *name TSRMLS_DC
)
130 return multibyte_functions
.encoding_fetcher(name TSRMLS_CC
);
133 ZEND_API
const char *zend_multibyte_get_encoding_name(const zend_encoding
*encoding
)
135 return multibyte_functions
.encoding_name_getter(encoding
);
138 ZEND_API
int zend_multibyte_check_lexer_compatibility(const zend_encoding
*encoding
)
140 return multibyte_functions
.lexer_compatibility_checker(encoding
);
143 ZEND_API
const zend_encoding
*zend_multibyte_encoding_detector(const unsigned char *string
, size_t length
, const zend_encoding
**list
, size_t list_size TSRMLS_DC
)
145 return multibyte_functions
.encoding_detector(string
, length
, list
, list_size TSRMLS_CC
);
148 ZEND_API
size_t zend_multibyte_encoding_converter(unsigned char **to
, size_t *to_length
, const unsigned char *from
, size_t from_length
, const zend_encoding
*encoding_to
, const zend_encoding
*encoding_from TSRMLS_DC
)
150 return multibyte_functions
.encoding_converter(to
, to_length
, from
, from_length
, encoding_to
, encoding_from TSRMLS_CC
);
153 ZEND_API
int zend_multibyte_parse_encoding_list(const char *encoding_list
, size_t encoding_list_len
, const zend_encoding
***return_list
, size_t *return_size
, int persistent TSRMLS_DC
)
155 return multibyte_functions
.encoding_list_parser(encoding_list
, encoding_list_len
, return_list
, return_size
, persistent TSRMLS_CC
);
158 ZEND_API
const zend_encoding
*zend_multibyte_get_internal_encoding(TSRMLS_D
)
160 return multibyte_functions
.internal_encoding_getter(TSRMLS_C
);
163 ZEND_API
const zend_encoding
*zend_multibyte_get_script_encoding(TSRMLS_D
)
165 return LANG_SCNG(script_encoding
);
168 ZEND_API
int zend_multibyte_set_script_encoding(const zend_encoding
**encoding_list
, size_t encoding_list_size TSRMLS_DC
)
170 if (CG(script_encoding_list
)) {
171 free(CG(script_encoding_list
));
173 CG(script_encoding_list
) = encoding_list
;
174 CG(script_encoding_list_size
) = encoding_list_size
;
178 ZEND_API
int zend_multibyte_set_internal_encoding(const zend_encoding
*encoding TSRMLS_DC
)
180 return multibyte_functions
.internal_encoding_setter(encoding TSRMLS_CC
);
183 ZEND_API
int zend_multibyte_set_script_encoding_by_string(const char *new_value
, size_t new_value_length TSRMLS_DC
)
185 const zend_encoding
**list
= 0;
189 zend_multibyte_set_script_encoding(NULL
, 0 TSRMLS_CC
);
193 if (FAILURE
== zend_multibyte_parse_encoding_list(new_value
, new_value_length
, &list
, &size
, 1 TSRMLS_CC
)) {
202 if (FAILURE
== zend_multibyte_set_script_encoding(list
, size TSRMLS_CC
)) {
214 * vim600: sw=4 ts=4 tw=78
215 * vim<600: sw=4 ts=4 tw=78