]> granicus.if.org Git - php/commitdiff
MF PHP_5_1
authorRui Hirokawa <hirokawa@php.net>
Tue, 21 Mar 2006 02:11:55 +0000 (02:11 +0000)
committerRui Hirokawa <hirokawa@php.net>
Tue, 21 Mar 2006 02:11:55 +0000 (02:11 +0000)
ext/mbstring/libmbfl/mbfl/mbfilter.c
ext/mbstring/libmbfl/mbfl/mbfilter.h
ext/mbstring/libmbfl/mbfl/mbfl_convert.c
ext/mbstring/libmbfl/mbfl/mbfl_convert.h
ext/mbstring/mbstring.c
ext/mbstring/mbstring.h

index 6b3be50fa40b020dbc0405893a3be117aa75012b..cc8800cd8f74c413ab7d5312ebde2285fa033573 100644 (file)
@@ -331,6 +331,20 @@ mbfl_buffer_converter_feed_result(mbfl_buffer_converter *convd, mbfl_string *str
        return mbfl_memory_device_result(&convd->device, result);
 }
 
+int mbfl_buffer_illegalchars(mbfl_buffer_converter *convd)
+{
+       int num_illegalchars = 0;
+
+       if (convd->filter1 != NULL) {
+               num_illegalchars += convd->filter1->num_illegalchar;
+       }
+
+       if (convd->filter2 != NULL) {
+               num_illegalchars += convd->filter2->num_illegalchar;
+       }
+
+       return (num_illegalchars);
+}
 
 /*
  * encoding detector
index 702079ac452a7fdd451e4d7f60f21e195e45d3e8..f958e936ab206bb8e1777681280e98a95ec82a11 100644 (file)
@@ -129,6 +129,7 @@ MBFLAPI extern int mbfl_buffer_converter_flush(mbfl_buffer_converter *convd);
 MBFLAPI extern mbfl_string * mbfl_buffer_converter_getbuffer(mbfl_buffer_converter *convd, mbfl_string *result);
 MBFLAPI extern mbfl_string * mbfl_buffer_converter_result(mbfl_buffer_converter *convd, mbfl_string *result);
 MBFLAPI extern mbfl_string * mbfl_buffer_converter_feed_result(mbfl_buffer_converter *convd, mbfl_string *string, mbfl_string *result);
+MBFLAPI extern int mbfl_buffer_illegalchars(mbfl_buffer_converter *convd);
 
 /*
  * encoding detector
index 981bba6af9f77a73674947e97a1625ad9822d3be..78a995cd25f10517c921429c7043181b1afc44d9 100644 (file)
@@ -250,6 +250,7 @@ mbfl_convert_filter_new(
        filter->data = data;
        filter->illegal_mode = MBFL_OUTPUTFILTER_ILLEGAL_MODE_CHAR;
        filter->illegal_substchar = 0x3f;               /* '?' */
+       filter->num_illegalchar = 0;
 
        /* setup the function table */
        mbfl_convert_filter_reset_vtbl(filter);
@@ -317,6 +318,7 @@ mbfl_convert_filter_copy(
        dist->to = src->to;
        dist->illegal_mode = src->illegal_mode;
        dist->illegal_substchar = src->illegal_substchar;
+       dist->num_illegalchar = src->num_illegalchar;
 }
 
 int mbfl_convert_filter_devcat(mbfl_convert_filter *filter, mbfl_memory_device *src) 
@@ -432,7 +434,7 @@ mbfl_filt_conv_illegal_output(int c, mbfl_convert_filter *filter)
                break;
        }
        filter->illegal_mode = mode_backup;
-
+       filter->num_illegalchar++;
        return ret;
 }
 
index afec8f06279eab9ef459f34880d5ff5bde6ba6bc..bf8b3bd6300f9d9f774ae83bef70a3c98b18c642 100644 (file)
@@ -51,6 +51,7 @@ struct _mbfl_convert_filter {
        const mbfl_encoding *to;
        int illegal_mode;
        int illegal_substchar;
+       int num_illegalchar;
        void *opaque;
 };
 
index 7d358280a4487e096ecb03fc01df612920d7445e..7a1e274fe74adaea2c058b1e4a9e2f934a22d60c 100644 (file)
@@ -786,6 +786,7 @@ static void _php_mb_globals_ctor(zend_mbstring_globals *pglobals TSRMLS_DC)
        MBSTRG(filter_illegal_substchar) = 0x3f;        /* '?' */
        MBSTRG(current_filter_illegal_mode) = MBFL_OUTPUTFILTER_ILLEGAL_MODE_CHAR;
        MBSTRG(current_filter_illegal_substchar) = 0x3f;        /* '?' */
+       MBSTRG(illegalchars) = 0;
        MBSTRG(func_overload) = 0;
        MBSTRG(encoding_translation) = 0;
        MBSTRG(strict_detection) = 0;
@@ -928,6 +929,7 @@ PHP_RINIT_FUNCTION(mbstring)
        MBSTRG(current_http_output_encoding) = MBSTRG(http_output_encoding);
        MBSTRG(current_filter_illegal_mode) = MBSTRG(filter_illegal_mode);
        MBSTRG(current_filter_illegal_substchar) = MBSTRG(filter_illegal_substchar);
+       MBSTRG(illegalchars) = 0;
 
        n = 0;
        if (MBSTRG(detect_order_list)) {
@@ -996,6 +998,7 @@ PHP_RSHUTDOWN_FUNCTION(mbstring)
                MBSTRG(current_detect_order_list_size) = 0;
        }
        if (MBSTRG(outconv) != NULL) {
+               MBSTRG(illegalchars) += mbfl_buffer_illegalchars(MBSTRG(outconv));
                mbfl_buffer_converter_delete(MBSTRG(outconv));
                MBSTRG(outconv) = NULL;
        }
@@ -1451,6 +1454,7 @@ PHP_FUNCTION(mb_output_handler)
        if ((arg_status & PHP_OUTPUT_HANDLER_START) != 0) {
                /* delete the converter just in case. */
                if (MBSTRG(outconv)) {
+                       MBSTRG(illegalchars) += mbfl_buffer_illegalchars(MBSTRG(outconv));
                        mbfl_buffer_converter_delete(MBSTRG(outconv));
                        MBSTRG(outconv) = NULL;
                }
@@ -1515,6 +1519,7 @@ PHP_FUNCTION(mb_output_handler)
  
        /* delete the converter if it is the last feed. */
        if (last_feed) {
+               MBSTRG(illegalchars) += mbfl_buffer_illegalchars(MBSTRG(outconv));
                mbfl_buffer_converter_delete(MBSTRG(outconv));
                MBSTRG(outconv) = NULL;
        }
@@ -2079,6 +2084,7 @@ MBSTRING_API char * php_mb_convert_encoding(char *input, size_t length, char *_t
                output = (char *)ret->val;
        }
 
+       MBSTRG(illegalchars) += mbfl_buffer_illegalchars(MBSTRG(outconv));
        mbfl_buffer_converter_delete(convd);
        return output;
 }
@@ -2747,6 +2753,7 @@ detect_end:
                }
                efree(stack);
 
+               MBSTRG(illegalchars) += mbfl_buffer_illegalchars(convd);
                mbfl_buffer_converter_delete(convd);
        }
 
@@ -3439,6 +3446,8 @@ PHP_FUNCTION(mb_get_info)
                if (lang != NULL && (name = (char *)mbfl_no_encoding2name(lang->mail_body_encoding)) != NULL) {
                        RETVAL_STRING(name, 1);
                }
+       } else if (!strcasecmp("illegalchars", typ)) {
+               RETVAL_LONG(MBSTRG(illegalchars));
        } else {
                RETURN_FALSE;
        }
@@ -3605,6 +3614,7 @@ MBSTRING_API int php_mb_gpc_encoding_converter(char **str, int *len, int num, co
                        str[i] = ret->val;
                        len[i] = ret->len;
                }
+               MBSTRG(illegalchars) += mbfl_buffer_illegalchars(convd);
                mbfl_buffer_converter_delete(convd);
        }
 
@@ -3821,6 +3831,7 @@ int php_mb_encoding_converter(char **to, int *to_length, const char *from,
                *to = ret->val;
                *to_length = ret->len;
        }
+       MBSTRG(illegalchars) += mbfl_buffer_illegalchars(convd);
        mbfl_buffer_converter_delete(convd);
 
        return ret ? 0 : -1;
index 5f960ca3d6ed669eb3980b6e9d9ba0b5d16f6e06..4eecb32c8a6d4558590fdc431bbc61efb8af7570 100644 (file)
@@ -181,6 +181,7 @@ ZEND_BEGIN_MODULE_GLOBALS(mbstring)
        long func_overload;
        zend_bool encoding_translation;
        long strict_detection;
+       long illegalchars;
        mbfl_buffer_converter *outconv;
 #if HAVE_MBREGEX && defined(PHP_MBREGEX_GLOBALS)
        PHP_MBREGEX_GLOBALS