Annotation of embedaddon/php/Zend/zend_multibyte.c, revision 1.1.1.3
1.1 misho 1: /*
2: +----------------------------------------------------------------------+
3: | Zend Engine |
4: +----------------------------------------------------------------------+
1.1.1.3 ! misho 5: | Copyright (c) 1998-2013 Zend Technologies Ltd. (http://www.zend.com) |
1.1 misho 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: +----------------------------------------------------------------------+
18: */
19:
1.1.1.2 misho 20: /* $Id$ */
1.1 misho 21:
22: #include "zend.h"
23: #include "zend_compile.h"
24: #include "zend_operators.h"
25: #include "zend_multibyte.h"
1.1.1.2 misho 26: #include "zend_ini.h"
1.1 misho 27:
1.1.1.2 misho 28: static const zend_encoding *dummy_encoding_fetcher(const char *encoding_name TSRMLS_DC)
1.1 misho 29: {
1.1.1.2 misho 30: return NULL;
1.1 misho 31: }
32:
1.1.1.2 misho 33: static const char *dummy_encoding_name_getter(const zend_encoding *encoding)
1.1 misho 34: {
1.1.1.2 misho 35: return (const char*)encoding;
1.1 misho 36: }
37:
1.1.1.2 misho 38: static int dummy_encoding_lexer_compatibility_checker(const zend_encoding *encoding)
1.1 misho 39: {
40: return 0;
41: }
42:
1.1.1.2 misho 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)
1.1 misho 44: {
45: return NULL;
46: }
47:
1.1.1.2 misho 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)
1.1 misho 49: {
1.1.1.2 misho 50: return (size_t)-1;
1.1 misho 51: }
52:
1.1.1.2 misho 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)
1.1 misho 54: {
1.1.1.2 misho 55: *return_list = pemalloc(0, persistent);
56: return_size = 0;
57: return SUCCESS;
1.1 misho 58: }
59:
1.1.1.2 misho 60: static const zend_encoding *dummy_internal_encoding_getter(TSRMLS_D)
1.1 misho 61: {
1.1.1.2 misho 62: return NULL;
1.1 misho 63: }
64:
1.1.1.2 misho 65: static int dummy_internal_encoding_setter(const zend_encoding *encoding TSRMLS_DC)
1.1 misho 66: {
1.1.1.2 misho 67: return FAILURE;
1.1 misho 68: }
69:
1.1.1.2 misho 70: static zend_multibyte_functions multibyte_functions = {
71: NULL,
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
1.1 misho 80: };
81:
1.1.1.2 misho 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";
1.1 misho 87:
1.1.1.2 misho 88: ZEND_API int zend_multibyte_set_functions(const zend_multibyte_functions *functions TSRMLS_DC)
89: {
90: zend_multibyte_encoding_utf32be = functions->encoding_fetcher("UTF-32BE" TSRMLS_CC);
91: if (!zend_multibyte_encoding_utf32be) {
92: return FAILURE;
1.1 misho 93: }
1.1.1.2 misho 94: zend_multibyte_encoding_utf32le = functions->encoding_fetcher("UTF-32LE" TSRMLS_CC);
95: if (!zend_multibyte_encoding_utf32le) {
96: return FAILURE;
97: }
98: zend_multibyte_encoding_utf16be = functions->encoding_fetcher("UTF-16BE" TSRMLS_CC);
99: if (!zend_multibyte_encoding_utf16be) {
100: return FAILURE;
101: }
102: zend_multibyte_encoding_utf16le = functions->encoding_fetcher("UTF-16LE" TSRMLS_CC);
103: if (!zend_multibyte_encoding_utf16le) {
104: return FAILURE;
105: }
106: zend_multibyte_encoding_utf8 = functions->encoding_fetcher("UTF-8" TSRMLS_CC);
107: if (!zend_multibyte_encoding_utf8) {
108: return FAILURE;
1.1 misho 109: }
110:
1.1.1.2 misho 111: multibyte_functions = *functions;
1.1 misho 112:
1.1.1.2 misho 113: /* As zend_multibyte_set_functions() gets called after ini settings were
114: * populated, we need to reinitialize script_encoding here.
115: */
116: {
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);
1.1 misho 119: }
1.1.1.2 misho 120: return SUCCESS;
1.1 misho 121: }
122:
1.1.1.2 misho 123: ZEND_API const zend_multibyte_functions *zend_multibyte_get_functions(TSRMLS_D)
1.1 misho 124: {
1.1.1.2 misho 125: return multibyte_functions.provider_name ? &multibyte_functions: NULL;
1.1 misho 126: }
127:
1.1.1.2 misho 128: ZEND_API const zend_encoding *zend_multibyte_fetch_encoding(const char *name TSRMLS_DC)
1.1 misho 129: {
1.1.1.2 misho 130: return multibyte_functions.encoding_fetcher(name TSRMLS_CC);
1.1 misho 131: }
132:
1.1.1.2 misho 133: ZEND_API const char *zend_multibyte_get_encoding_name(const zend_encoding *encoding)
1.1 misho 134: {
1.1.1.2 misho 135: return multibyte_functions.encoding_name_getter(encoding);
1.1 misho 136: }
137:
1.1.1.2 misho 138: ZEND_API int zend_multibyte_check_lexer_compatibility(const zend_encoding *encoding)
139: {
140: return multibyte_functions.lexer_compatibility_checker(encoding);
141: }
1.1 misho 142:
1.1.1.2 misho 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)
1.1 misho 144: {
1.1.1.2 misho 145: return multibyte_functions.encoding_detector(string, length, list, list_size TSRMLS_CC);
146: }
1.1 misho 147:
1.1.1.2 misho 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)
149: {
150: return multibyte_functions.encoding_converter(to, to_length, from, from_length, encoding_to, encoding_from TSRMLS_CC);
151: }
1.1 misho 152:
1.1.1.2 misho 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)
154: {
155: return multibyte_functions.encoding_list_parser(encoding_list, encoding_list_len, return_list, return_size, persistent TSRMLS_CC);
156: }
1.1 misho 157:
1.1.1.2 misho 158: ZEND_API const zend_encoding *zend_multibyte_get_internal_encoding(TSRMLS_D)
159: {
160: return multibyte_functions.internal_encoding_getter(TSRMLS_C);
161: }
1.1 misho 162:
1.1.1.2 misho 163: ZEND_API const zend_encoding *zend_multibyte_get_script_encoding(TSRMLS_D)
164: {
165: return LANG_SCNG(script_encoding);
166: }
1.1 misho 167:
1.1.1.2 misho 168: ZEND_API int zend_multibyte_set_script_encoding(const zend_encoding **encoding_list, size_t encoding_list_size TSRMLS_DC)
169: {
170: if (CG(script_encoding_list)) {
1.1.1.3 ! misho 171: free(CG(script_encoding_list));
1.1 misho 172: }
1.1.1.2 misho 173: CG(script_encoding_list) = encoding_list;
174: CG(script_encoding_list_size) = encoding_list_size;
175: return SUCCESS;
176: }
1.1 misho 177:
1.1.1.2 misho 178: ZEND_API int zend_multibyte_set_internal_encoding(const zend_encoding *encoding TSRMLS_DC)
179: {
180: return multibyte_functions.internal_encoding_setter(encoding TSRMLS_CC);
1.1 misho 181: }
182:
1.1.1.2 misho 183: ZEND_API int zend_multibyte_set_script_encoding_by_string(const char *new_value, size_t new_value_length TSRMLS_DC)
1.1 misho 184: {
1.1.1.2 misho 185: const zend_encoding **list = 0;
186: size_t size = 0;
1.1 misho 187:
1.1.1.2 misho 188: if (!new_value) {
189: zend_multibyte_set_script_encoding(NULL, 0 TSRMLS_CC);
190: return SUCCESS;
1.1 misho 191: }
192:
1.1.1.2 misho 193: if (FAILURE == zend_multibyte_parse_encoding_list(new_value, new_value_length, &list, &size, 1 TSRMLS_CC)) {
194: return FAILURE;
1.1 misho 195: }
196:
1.1.1.2 misho 197: if (size == 0) {
198: pefree(list, 1);
199: return FAILURE;
1.1 misho 200: }
201:
1.1.1.2 misho 202: if (FAILURE == zend_multibyte_set_script_encoding(list, size TSRMLS_CC)) {
203: return FAILURE;
204: }
205:
206: return SUCCESS;
1.1 misho 207: }
208:
209: /*
210: * Local variables:
211: * tab-width: 4
212: * c-basic-offset: 4
213: * End:
214: * vim600: sw=4 ts=4 tw=78
215: * vim<600: sw=4 ts=4 tw=78
216: */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>