]> granicus.if.org Git - php/commitdiff
MFH: added support "entity" as substitute_character settin accoding to bug #39404
authorRui Hirokawa <hirokawa@php.net>
Mon, 24 Sep 2007 11:51:36 +0000 (11:51 +0000)
committerRui Hirokawa <hirokawa@php.net>
Mon, 24 Sep 2007 11:51:36 +0000 (11:51 +0000)
ext/mbstring/libmbfl/mbfl/mbfilter.h
ext/mbstring/libmbfl/mbfl/mbfl_convert.c
ext/mbstring/mbstring.c

index f958e936ab206bb8e1777681280e98a95ec82a11..73b7229c223ad6b4b66db170cc56b0bb0e83057e 100644 (file)
 #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
index 5cac3bdda8312e9d7113157db8a8382fcca13807..f6810738f9a1a9535411361eea8049eb399c59f0 100644 (file)
@@ -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;
index 0c15a589485648d46ce170ec81d64d35930ac7ff..fb14aeec39ba18a5ec6cb562889f1ffaa04ae662 100644 (file)
@@ -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));
                }