From: Rui Hirokawa Date: Mon, 24 Sep 2007 11:51:36 +0000 (+0000) Subject: MFH: added support "entity" as substitute_character settin accoding to bug #39404 X-Git-Tag: php-5.2.5RC1~94 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e94f26f356661df3c188877965ab58525c468567;p=php MFH: 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 5cac3bdda8..f6810738f9 100644 --- a/ext/mbstring/libmbfl/mbfl/mbfl_convert.c +++ b/ext/mbstring/libmbfl/mbfl/mbfl_convert.c @@ -387,9 +387,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; @@ -433,6 +438,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 0c15a58948..fb14aeec39 100644 --- a/ext/mbstring/mbstring.c +++ b/ext/mbstring/mbstring.c @@ -712,6 +712,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; @@ -1329,6 +1332,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)); } @@ -1340,6 +1345,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) { @@ -3890,6 +3897,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)); } @@ -3984,6 +3993,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)); }