Annotation of embedaddon/php/Zend/zend_multibyte.c, revision 1.1.1.2

1.1       misho       1: /*
                      2:    +----------------------------------------------------------------------+
                      3:    | Zend Engine                                                          |
                      4:    +----------------------------------------------------------------------+
                      5:    | Copyright (c) 1998-2012 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:    +----------------------------------------------------------------------+
                     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)) {
        !           171:                efree(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>