From: Rui Hirokawa Date: Mon, 24 Sep 2007 11:50:54 +0000 (+0000) Subject: added support "entity" as substitute_character settin accoding to bug #39404 X-Git-Tag: RELEASE_2_0_0a1~1757 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=9fb312447e73b50eaec44cf901f235963569b898;p=php added support "entity" as substitute_character settin accoding to bug #39404 --- diff --git a/ext/mbstring/libmbfl/mbfl/mbfilter.h b/ext/mbstring/libmbfl/mbfl/mbfilter.h index f958e936ab..73b7229c22 100644 --- a/ext/mbstring/libmbfl/mbfl/mbfilter.h +++ b/ext/mbstring/libmbfl/mbfl/mbfilter.h @@ -104,6 +104,7 @@ #define MBFL_OUTPUTFILTER_ILLEGAL_MODE_NONE 0 #define MBFL_OUTPUTFILTER_ILLEGAL_MODE_CHAR 1 #define MBFL_OUTPUTFILTER_ILLEGAL_MODE_LONG 2 +#define MBFL_OUTPUTFILTER_ILLEGAL_MODE_ENTITY 3 /* * buffering converter diff --git a/ext/mbstring/libmbfl/mbfl/mbfl_convert.c b/ext/mbstring/libmbfl/mbfl/mbfl_convert.c index bcae8c4340..42ee2e47d5 100644 --- a/ext/mbstring/libmbfl/mbfl/mbfl_convert.c +++ b/ext/mbstring/libmbfl/mbfl/mbfl_convert.c @@ -386,9 +386,14 @@ mbfl_filt_conv_illegal_output(int c, mbfl_convert_filter *filter) ret = (*filter->filter_function)(filter->illegal_substchar, filter); break; case MBFL_OUTPUTFILTER_ILLEGAL_MODE_LONG: + case MBFL_OUTPUTFILTER_ILLEGAL_MODE_ENTITY: if (c >= 0) { if (c < MBFL_WCSGROUP_UCS4MAX) { /* unicode */ - ret = mbfl_convert_filter_strcat(filter, (const unsigned char *)"U+"); + if (mode_backup == MBFL_OUTPUTFILTER_ILLEGAL_MODE_LONG) { + ret = mbfl_convert_filter_strcat(filter, (const unsigned char *)"U+"); + } else { /* entity */ + ret = mbfl_convert_filter_strcat(filter, (const unsigned char *)"&#"); + } } else { if (c < MBFL_WCSGROUP_WCHARMAX) { m = c & ~MBFL_WCSPLANE_MASK; @@ -432,6 +437,9 @@ mbfl_filt_conv_illegal_output(int c, mbfl_convert_filter *filter) if (m == 0 && ret >= 0) { ret = (*filter->filter_function)(mbfl_hexchar_table[0], filter); } + if (mode_backup == MBFL_OUTPUTFILTER_ILLEGAL_MODE_ENTITY) { + ret = mbfl_convert_filter_strcat(filter, (const unsigned char *)";"); + } } } break; diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c index 68dd64d20d..9d3da33829 100644 --- a/ext/mbstring/mbstring.c +++ b/ext/mbstring/mbstring.c @@ -716,6 +716,9 @@ static PHP_INI_MH(OnUpdate_mbstring_substitute_character) } else if (strcasecmp("long", new_value) == 0) { MBSTRG(filter_illegal_mode) = MBFL_OUTPUTFILTER_ILLEGAL_MODE_LONG; MBSTRG(current_filter_illegal_mode) = MBFL_OUTPUTFILTER_ILLEGAL_MODE_LONG; + } else if (strcasecmp("entity", new_value) == 0) { + MBSTRG(filter_illegal_mode) = MBFL_OUTPUTFILTER_ILLEGAL_MODE_ENTITY; + MBSTRG(current_filter_illegal_mode) = MBFL_OUTPUTFILTER_ILLEGAL_MODE_ENTITY; } else { MBSTRG(filter_illegal_mode) = MBFL_OUTPUTFILTER_ILLEGAL_MODE_CHAR; MBSTRG(current_filter_illegal_mode) = MBFL_OUTPUTFILTER_ILLEGAL_MODE_CHAR; @@ -1328,6 +1331,8 @@ PHP_FUNCTION(mb_substitute_character) RETVAL_STRING("none", 1); } else if (MBSTRG(current_filter_illegal_mode) == MBFL_OUTPUTFILTER_ILLEGAL_MODE_LONG) { RETVAL_STRING("long", 1); + } else if (MBSTRG(current_filter_illegal_mode) == MBFL_OUTPUTFILTER_ILLEGAL_MODE_ENTITY) { + RETVAL_STRING("entity", 1); } else { RETVAL_LONG(MBSTRG(current_filter_illegal_substchar)); } @@ -1339,6 +1344,8 @@ PHP_FUNCTION(mb_substitute_character) MBSTRG(current_filter_illegal_mode) = MBFL_OUTPUTFILTER_ILLEGAL_MODE_NONE; } else if (strcasecmp("long", Z_STRVAL_PP(arg1)) == 0) { MBSTRG(current_filter_illegal_mode) = MBFL_OUTPUTFILTER_ILLEGAL_MODE_LONG; + } else if (strcasecmp("entity", Z_STRVAL_PP(arg1)) == 0) { + MBSTRG(current_filter_illegal_mode) = MBFL_OUTPUTFILTER_ILLEGAL_MODE_ENTITY; } else { convert_to_long_ex(arg1); if (Z_LVAL_PP(arg1)< 0xffff && Z_LVAL_PP(arg1)> 0x0) { @@ -3905,6 +3912,8 @@ PHP_FUNCTION(mb_get_info) add_assoc_string(return_value, "substitute_character", "none", 1); } else if (MBSTRG(current_filter_illegal_mode) == MBFL_OUTPUTFILTER_ILLEGAL_MODE_LONG) { add_assoc_string(return_value, "substitute_character", "long", 1); + } else if (MBSTRG(current_filter_illegal_mode) == MBFL_OUTPUTFILTER_ILLEGAL_MODE_ENTITY) { + add_assoc_string(return_value, "substitute_character", "entity", 1); } else { add_assoc_long(return_value, "substitute_character", MBSTRG(current_filter_illegal_substchar)); } @@ -3999,6 +4008,8 @@ PHP_FUNCTION(mb_get_info) RETVAL_STRING("none", 1); } else if (MBSTRG(current_filter_illegal_mode) == MBFL_OUTPUTFILTER_ILLEGAL_MODE_LONG) { RETVAL_STRING("long", 1); + } else if (MBSTRG(current_filter_illegal_mode) == MBFL_OUTPUTFILTER_ILLEGAL_MODE_ENTITY) { + RETVAL_STRING("entity", 1); } else { RETVAL_LONG(MBSTRG(current_filter_illegal_substchar)); }