diff options
author | Moriyoshi Koizumi <moriyoshi@php.net> | 2003-10-26 03:41:19 +0000 |
---|---|---|
committer | Moriyoshi Koizumi <moriyoshi@php.net> | 2003-10-26 03:41:19 +0000 |
commit | 73b34fff94245490eac66915c2d111814904c712 (patch) | |
tree | 034524db576944ad4a5150aba5da8dc09e410001 | |
parent | dc04255655b8cce00a60f6893313723bcb746afa (diff) | |
download | php-git-73b34fff94245490eac66915c2d111814904c712.tar.gz |
Backport some patch already in HEAD to assure backwards compatibility
-rw-r--r-- | ext/mbstring/mbstring.c | 158 | ||||
-rw-r--r-- | ext/mbstring/mbstring.h | 2 | ||||
-rw-r--r-- | ext/mbstring/tests/mb_convert_encoding.phpt | 1 | ||||
-rw-r--r-- | ext/mbstring/tests/mb_convert_variables.phpt | 1 | ||||
-rw-r--r-- | ext/mbstring/tests/mb_detect_encoding.phpt | 2 | ||||
-rw-r--r-- | ext/mbstring/tests/mb_detect_order.phpt | 2 |
6 files changed, 111 insertions, 55 deletions
diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c index a633237f73..5127780cf5 100644 --- a/ext/mbstring/mbstring.c +++ b/ext/mbstring/mbstring.c @@ -84,62 +84,65 @@ MUTEX_T mbregex_locale_mutex = NULL; #endif -/* {{{ php_mbstr_default_identify_list[] */ -#if defined(HAVE_MBSTR_JA) -static const enum mbfl_no_encoding php_mbstr_default_identify_list[] = { +/* {{{ php_mb_default_identify_list */ +typedef struct _php_mb_nls_ident_list { + enum mbfl_no_language lang; + enum mbfl_no_encoding* list; + int list_size; +} php_mb_nls_ident_list; + +static const enum mbfl_no_encoding php_mb_default_identify_list_ja[] = { mbfl_no_encoding_ascii, mbfl_no_encoding_jis, mbfl_no_encoding_utf8, mbfl_no_encoding_euc_jp, mbfl_no_encoding_sjis }; -#endif -#if defined(HAVE_MBSTR_CN) & !defined(HAVE_MBSTR_JA) -static const enum mbfl_no_encoding php_mbstr_default_identify_list[] = { +static const enum mbfl_no_encoding php_mb_default_identify_list_cn[] = { mbfl_no_encoding_ascii, mbfl_no_encoding_utf8, mbfl_no_encoding_euc_cn, mbfl_no_encoding_cp936 }; -#endif -#if defined(HAVE_MBSTR_TW) & !defined(HAVE_MBSTR_CN) & !defined(HAVE_MBSTR_JA) -static const enum mbfl_no_encoding php_mbstr_default_identify_list[] = { +static const enum mbfl_no_encoding php_mb_default_identify_list_tw_hk[] = { mbfl_no_encoding_ascii, mbfl_no_encoding_utf8, mbfl_no_encoding_euc_tw, mbfl_no_encoding_big5 }; -#endif -#if defined(HAVE_MBSTR_KR) & !defined(HAVE_MBSTR_TW) & !defined(HAVE_MBSTR_CN) & !defined(HAVE_MBSTR_JA) -static const enum mbfl_no_encoding php_mbstr_default_identify_list[] = { +static const enum mbfl_no_encoding php_mb_default_identify_list_kr[] = { mbfl_no_encoding_ascii, mbfl_no_encoding_utf8, mbfl_no_encoding_euc_kr, mbfl_no_encoding_uhc }; -#endif -#if defined(HAVE_MBSTR_RU) & !defined(HAVE_MBSTR_KR) & !defined(HAVE_MBSTR_TW) & !defined(HAVE_MBSTR_CN) & !defined(HAVE_MBSTR_JA) -static const enum mbfl_no_encoding php_mbstr_default_identify_list[] = { +static const enum mbfl_no_encoding php_mb_default_identify_list_ru[] = { mbfl_no_encoding_ascii, mbfl_no_encoding_utf8, mbfl_no_encoding_koi8r, mbfl_no_encoding_cp1251, mbfl_no_encoding_cp866 }; -#endif -#if !defined(HAVE_MBSTR_RU) & !defined(HAVE_MBSTR_KR) & !defined(HAVE_MBSTR_TW) & !defined(HAVE_MBSTR_CN) & !defined(HAVE_MBSTR_JA) -static const enum mbfl_no_encoding php_mbstr_default_identify_list[] = { +static const enum mbfl_no_encoding php_mb_default_identify_list_neut[] = { mbfl_no_encoding_ascii, mbfl_no_encoding_utf8 }; -#endif -static const int php_mbstr_default_identify_list_size = sizeof(php_mbstr_default_identify_list)/sizeof(enum mbfl_no_encoding); + +php_mb_nls_ident_list php_mb_default_identify_list[] = { + { mbfl_no_language_japanese, php_mb_default_identify_list_ja, sizeof(php_mb_default_identify_list_ja) / sizeof(php_mb_default_identify_list_ja[0]) }, + { mbfl_no_language_korean, php_mb_default_identify_list_kr, sizeof(php_mb_default_identify_list_kr) / sizeof(php_mb_default_identify_list_kr[0]) }, + { mbfl_no_language_traditional_chinese, php_mb_default_identify_list_tw_hk, sizeof(php_mb_default_identify_list_tw_hk) / sizeof(php_mb_default_identify_list_tw_hk[0]) }, + { mbfl_no_language_simplified_chinese, php_mb_default_identify_list_cn, sizeof(php_mb_default_identify_list_cn) / sizeof(php_mb_default_identify_list_cn[0]) }, + { mbfl_no_language_russian, php_mb_default_identify_list_ru, sizeof(php_mb_default_identify_list_ru) / sizeof(php_mb_default_identify_list_ru[0]) }, + { mbfl_no_language_neutral, php_mb_default_identify_list_neut, sizeof(php_mb_default_identify_list_neut) / sizeof(php_mb_default_identify_list_neut[0]) } +}; + /* }}} */ static const unsigned char third_and_rest_force_ref[] = { 3, BYREF_NONE, BYREF_NONE, BYREF_FORCE_REST }; @@ -358,12 +361,19 @@ static mbfl_allocators _php_mb_allocators = { * Even if any illegal encoding is detected the result may contain a list * of parsed encodings. */ + +/* {{{ static int php_mb_parse_encoding_list() + * Return 0 if input contains any illegal encoding, otherwise 1. + * Even if any illegal encoding is detected the result may contain a list + * of parsed encodings. + */ static int -php_mb_parse_encoding_list(const char *value, int value_length, int **return_list, int *return_size, int persistent TSRMLS_DC) +php_mb_parse_encoding_list(const char *value, int value_length, enum mbfl_no_encoding **return_list, int *return_size, int persistent TSRMLS_DC) { - int n, l, size, bauto, *src, *list, *entry, ret = 1; + int n, l, size, bauto, ret = 1; char *p, *p1, *p2, *endp, *tmpstr; enum mbfl_no_encoding no_encoding; + enum mbfl_no_encoding *src, *entry, *list; list = NULL; if (value == NULL || value_length <= 0) { @@ -375,6 +385,12 @@ php_mb_parse_encoding_list(const char *value, int value_length, int **return_lis } return 0; } else { + enum mbfl_no_encoding *identify_list; + int identify_list_size; + + identify_list = MBSTRG(default_detect_order_list); + identify_list_size = MBSTRG(default_detect_order_list_size); + /* copy the value string for work */ if (value[0]=='"' && value[value_length-1]=='"' && value_length>2) { tmpstr = (char *)estrndup(value+1, value_length-2); @@ -393,7 +409,7 @@ php_mb_parse_encoding_list(const char *value, int value_length, int **return_lis p1 = p2 + 1; n++; } - size = n + php_mbstr_default_identify_list_size; + size = n + identify_list_size; /* make list */ list = (int *)pecalloc(size, sizeof(int), persistent); if (list != NULL) { @@ -417,23 +433,25 @@ php_mb_parse_encoding_list(const char *value, int value_length, int **return_lis p--; } /* convert to the encoding number and check encoding */ - no_encoding = mbfl_name2no_encoding(p1); - if (no_encoding == mbfl_no_encoding_auto) { + if (strcasecmp(p1, "auto") == 0) { if (!bauto) { bauto = 1; - l = php_mbstr_default_identify_list_size; - src = (int*)php_mbstr_default_identify_list; + l = identify_list_size; + src = identify_list; while (l > 0) { *entry++ = *src++; l--; n++; } } - } else if (no_encoding != mbfl_no_encoding_invalid) { - *entry++ = no_encoding; - n++; } else { - ret = 0; + no_encoding = mbfl_name2no_encoding(p1); + if (no_encoding != mbfl_no_encoding_invalid) { + *entry++ = no_encoding; + n++; + } else { + ret = 0; + } } p1 = p2 + 1; } while (n < size && p2 != NULL); @@ -481,19 +499,26 @@ MBSTRING_API int php_mb_check_encoding_list(const char *encoding_list TSRMLS_DC) * of parsed encodings. */ static int -php_mb_parse_encoding_array(zval *array, int **return_list, int *return_size, int persistent) +php_mb_parse_encoding_array(zval *array, enum mbfl_no_encoding **return_list, int *return_size, int persistent TSRMLS_DC) { zval **hash_entry; HashTable *target_hash; - int i, n, l, size, bauto, *list, *entry, *src, ret = 1; + int i, n, l, size, bauto,ret = 1; enum mbfl_no_encoding no_encoding; + enum mbfl_no_encoding *src, *list, *entry; list = NULL; if (Z_TYPE_P(array) == IS_ARRAY) { + enum mbfl_no_encoding *identify_list; + int identify_list_size; + + identify_list = MBSTRG(default_detect_order_list); + identify_list_size = MBSTRG(default_detect_order_list_size); + target_hash = Z_ARRVAL_P(array); zend_hash_internal_pointer_reset(target_hash); i = zend_hash_num_elements(target_hash); - size = i + php_mbstr_default_identify_list_size; + size = i + identify_list_size; list = (int *)pecalloc(size, sizeof(int), persistent); if (list != NULL) { entry = list; @@ -504,23 +529,25 @@ php_mb_parse_encoding_array(zval *array, int **return_list, int *return_size, in break; } convert_to_string_ex(hash_entry); - no_encoding = mbfl_name2no_encoding(Z_STRVAL_PP(hash_entry)); - if (no_encoding == mbfl_no_encoding_auto) { + if (strcasecmp(Z_STRVAL_PP(hash_entry), "auto") == 0) { if (!bauto) { bauto = 1; - l = php_mbstr_default_identify_list_size; - src = (int*)php_mbstr_default_identify_list; + l = identify_list_size; + src = identify_list; while (l > 0) { *entry++ = *src++; l--; n++; } } - } else if (no_encoding != mbfl_no_encoding_invalid) { - *entry++ = no_encoding; - n++; } else { - ret = 0;; + no_encoding = mbfl_name2no_encoding(Z_STRVAL_PP(hash_entry)); + if (no_encoding != mbfl_no_encoding_invalid) { + *entry++ = no_encoding; + n++; + } else { + ret = 0; + } } zend_hash_move_forward(target_hash); i--; @@ -556,6 +583,25 @@ php_mb_parse_encoding_array(zval *array, int **return_list, int *return_size, in } /* }}} */ +/* {{{ php_mb_nls_get_default_detect_order_list */ +static int php_mb_nls_get_default_detect_order_list(enum mbfl_no_language lang, enum mbfl_no_encoding **plist, int* plist_size) +{ + size_t i; + + *plist = (enum mbfl_no_encoding *) php_mb_default_identify_list_neut; + *plist_size = sizeof(php_mb_default_identify_list_neut) / sizeof(php_mb_default_identify_list_neut[0]); + + for (i = 0; i < sizeof(php_mb_default_identify_list) / sizeof(php_mb_default_identify_list[0]); i++) { + if (php_mb_default_identify_list[i].lang == lang) { + *plist = php_mb_default_identify_list[i].list; + *plist_size = php_mb_default_identify_list[i].list_size; + return 1; + } + } + return 0; +} +/* }}} */ + #if HAVE_MBREGEX /* {{{ static void php_mbregex_free_cache() */ static void @@ -576,6 +622,7 @@ static PHP_INI_MH(OnUpdate_mbstring_language) return FAILURE; } MBSTRG(language) = no_language; + php_mb_nls_get_default_detect_order_list(no_language, &MBSTRG(default_detect_order_list), &MBSTRG(default_detect_order_list_size)); return SUCCESS; } /* }}} */ @@ -783,6 +830,8 @@ php_mb_init_globals(zend_mbstring_globals *pglobals TSRMLS_DC) MBSTRG(detect_order_list_size) = 0; MBSTRG(current_detect_order_list) = NULL; MBSTRG(current_detect_order_list_size) = 0; + MBSTRG(default_detect_order_list) = (enum mbfl_no_encoding *) php_mb_default_identify_list_neut; + MBSTRG(default_detect_order_list_size) = sizeof(php_mb_default_identify_list_neut) / sizeof(php_mb_default_identify_list_neut[0]); MBSTRG(filter_illegal_mode) = MBFL_OUTPUTFILTER_ILLEGAL_MODE_CHAR; MBSTRG(filter_illegal_substchar) = 0x3f; /* '?' */ MBSTRG(current_filter_illegal_mode) = MBFL_OUTPUTFILTER_ILLEGAL_MODE_CHAR; @@ -950,17 +999,15 @@ PHP_RINIT_FUNCTION(mbstring) n = MBSTRG(detect_order_list_size); } if (n <= 0) { - list = (int*)php_mbstr_default_identify_list; - n = php_mbstr_default_identify_list_size; + list = MBSTRG(default_detect_order_list); + n = MBSTRG(default_detect_order_list_size); } entry = (int *)safe_emalloc(n, sizeof(int), 0); - if (entry != NULL) { - MBSTRG(current_detect_order_list) = entry; - MBSTRG(current_detect_order_list_size) = n; - while (n > 0) { - *entry++ = *list++; - n--; - } + MBSTRG(current_detect_order_list) = entry; + MBSTRG(current_detect_order_list_size) = n; + while (n > 0) { + *entry++ = *list++; + n--; } /* override original function. */ @@ -1120,6 +1167,7 @@ PHP_FUNCTION(mb_language) php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unknown language \"%s\"", Z_STRVAL_PP(arg1)); RETURN_FALSE; } else { + php_mb_nls_get_default_detect_order_list(no_language, &MBSTRG(default_detect_order_list), &MBSTRG(default_detect_order_list_size)); MBSTRG(current_language) = no_language; RETURN_TRUE; } @@ -3786,16 +3834,16 @@ MBSTRING_API int php_mb_gpc_encoding_detector(char **arg_string, int *arg_length elist = MBSTRG(current_detect_order_list); size = MBSTRG(current_detect_order_list_size); if (size <= 0){ - elist = (int*)php_mbstr_default_identify_list; - size = php_mbstr_default_identify_list_size; + elist = MBSTRG(default_detect_order_list); + size = MBSTRG(default_detect_order_list_size); } } } else { elist = MBSTRG(current_detect_order_list); size = MBSTRG(current_detect_order_list_size); if (size <= 0){ - elist = (int*)php_mbstr_default_identify_list; - size = php_mbstr_default_identify_list_size; + elist = MBSTRG(default_detect_order_list); + size = MBSTRG(default_detect_order_list_size); } } diff --git a/ext/mbstring/mbstring.h b/ext/mbstring/mbstring.h index 12c8f88eec..a167c3ab3a 100644 --- a/ext/mbstring/mbstring.h +++ b/ext/mbstring/mbstring.h @@ -168,6 +168,8 @@ ZEND_BEGIN_MODULE_GLOBALS(mbstring) int detect_order_list_size; enum mbfl_no_encoding *current_detect_order_list; int current_detect_order_list_size; + enum mbfl_no_encoding *default_detect_order_list; + int default_detect_order_list_size; int filter_illegal_mode; int filter_illegal_substchar; int current_filter_illegal_mode; diff --git a/ext/mbstring/tests/mb_convert_encoding.phpt b/ext/mbstring/tests/mb_convert_encoding.phpt index 774563683e..9d8a40b9dc 100644 --- a/ext/mbstring/tests/mb_convert_encoding.phpt +++ b/ext/mbstring/tests/mb_convert_encoding.phpt @@ -4,6 +4,7 @@ mb_convert_encoding() <?php extension_loaded('mbstring') or die('skip mbstring not available'); ?> --INI-- output_handler= +mbstring.language=Japanese --FILE-- <?php // TODO: Add more tests diff --git a/ext/mbstring/tests/mb_convert_variables.phpt b/ext/mbstring/tests/mb_convert_variables.phpt index 86ffc8a994..e25088c97d 100644 --- a/ext/mbstring/tests/mb_convert_variables.phpt +++ b/ext/mbstring/tests/mb_convert_variables.phpt @@ -4,6 +4,7 @@ mb_convert_variables() <?php extension_loaded('mbstring') or die('skip mbstring not available'); ?> --INI-- output_handler= +mbstring.language=Japanese --FILE-- <?php // TODO: Add more tests diff --git a/ext/mbstring/tests/mb_detect_encoding.phpt b/ext/mbstring/tests/mb_detect_encoding.phpt index 5031f6fb8f..79b1a1bd42 100644 --- a/ext/mbstring/tests/mb_detect_encoding.phpt +++ b/ext/mbstring/tests/mb_detect_encoding.phpt @@ -2,6 +2,8 @@ mb_detect_encoding() --SKIPIF-- <?php extension_loaded('mbstring') or die('skip mbstring not available'); ?> +--INI-- +mbstring.language=Japanese --FILE-- <?php // TODO: Add more tests diff --git a/ext/mbstring/tests/mb_detect_order.phpt b/ext/mbstring/tests/mb_detect_order.phpt index 3a76b4d0ed..bb0ec5653a 100644 --- a/ext/mbstring/tests/mb_detect_order.phpt +++ b/ext/mbstring/tests/mb_detect_order.phpt @@ -2,6 +2,8 @@ mb_detect_order() --SKIPIF-- <?php extension_loaded('mbstring') or die('skip mbstring not available'); ?> +--INI-- +mbstring.language=Japanese --FILE-- <?php //$debug = true; |