]> granicus.if.org Git - php/commitdiff
MFH: fixed #35711, added mbstring.strict_detection to detect the encoding striktly.
authorRui Hirokawa <hirokawa@php.net>
Sun, 25 Dec 2005 15:23:55 +0000 (15:23 +0000)
committerRui Hirokawa <hirokawa@php.net>
Sun, 25 Dec 2005 15:23:55 +0000 (15:23 +0000)
ext/mbstring/libmbfl/mbfl/mbfilter.c
ext/mbstring/libmbfl/mbfl/mbfilter.h
ext/mbstring/mb_gpc.c
ext/mbstring/mbstring.c
ext/mbstring/mbstring.h

index e543951d33db171ce5dc6e3af040eced7d428dc4..ec3409d8ea7e173651e85ecc54965cb9df9f8cf8 100644 (file)
@@ -336,7 +336,7 @@ mbfl_buffer_converter_feed_result(mbfl_buffer_converter *convd, mbfl_string *str
  * encoding detector
  */
 mbfl_encoding_detector *
-mbfl_encoding_detector_new(enum mbfl_no_encoding *elist, int elistsz)
+mbfl_encoding_detector_new(enum mbfl_no_encoding *elist, int elistsz, int strict)
 {
        mbfl_encoding_detector *identd;
 
@@ -371,6 +371,9 @@ mbfl_encoding_detector_new(enum mbfl_no_encoding *elist, int elistsz)
        }
        identd->filter_list_size = num;
 
+       /* set strict flag */
+       identd->strict = strict;
+
        return identd;
 }
 
@@ -441,10 +444,24 @@ enum mbfl_no_encoding mbfl_encoding_detector_judge(mbfl_encoding_detector *ident
                while (n >= 0) {
                        filter = identd->filter_list[n];
                        if (!filter->flag) {
+                               if (identd->strict && filter->status) {
+                                       continue;
+                               }
                                encoding = filter->encoding->no_encoding;
                        }
                        n--;
                }
+
+               if (encoding == mbfl_no_encoding_invalid) {
+                       n = identd->filter_list_size - 1;
+                       while (n >= 0) {
+                               filter = identd->filter_list[n];
+                               if (!filter->flag) {
+                                       encoding = filter->encoding->no_encoding;
+                               }
+                               n--;
+                       }
+               }
        }
 
        return encoding;
@@ -622,11 +639,11 @@ mbfl_identify_encoding_name(mbfl_string *string, enum mbfl_no_encoding *elist, i
 }
 
 enum mbfl_no_encoding
-mbfl_identify_encoding_no(mbfl_string *string, enum mbfl_no_encoding *elist, int elistsz)
+mbfl_identify_encoding_no(mbfl_string *string, enum mbfl_no_encoding *elist, int elistsz, int strict)
 {
        const mbfl_encoding *encoding;
 
-       encoding = mbfl_identify_encoding(string, elist, elistsz, 0);
+       encoding = mbfl_identify_encoding(string, elist, elistsz, strict);
        if (encoding != NULL &&
            encoding->no_encoding > mbfl_no_encoding_charset_min &&
            encoding->no_encoding < mbfl_no_encoding_charset_max) {
index d0965251ad886a51cd76cf0b76377555c03918fc..702079ac452a7fdd451e4d7f60f21e195e45d3e8 100644 (file)
@@ -138,9 +138,10 @@ typedef struct _mbfl_encoding_detector mbfl_encoding_detector;
 struct _mbfl_encoding_detector {
        mbfl_identify_filter **filter_list;
        int filter_list_size;
+       int strict;
 };
 
-MBFLAPI extern mbfl_encoding_detector * mbfl_encoding_detector_new(enum mbfl_no_encoding *elist, int elistsz);
+MBFLAPI extern mbfl_encoding_detector * mbfl_encoding_detector_new(enum mbfl_no_encoding *elist, int elistsz, int strict);
 MBFLAPI extern void mbfl_encoding_detector_delete(mbfl_encoding_detector *identd);
 MBFLAPI extern int mbfl_encoding_detector_feed(mbfl_encoding_detector *identd, mbfl_string *string);
 MBFLAPI extern enum mbfl_no_encoding mbfl_encoding_detector_judge(mbfl_encoding_detector *identd);
@@ -163,7 +164,7 @@ MBFLAPI extern const char *
 mbfl_identify_encoding_name(mbfl_string *string, enum mbfl_no_encoding *elist, int elistsz, int strict);
 
 MBFLAPI extern enum mbfl_no_encoding
-mbfl_identify_encoding_no(mbfl_string *string, enum mbfl_no_encoding *elist, int elistsz);
+mbfl_identify_encoding_no(mbfl_string *string, enum mbfl_no_encoding *elist, int elistsz, int strict);
 
 /*
  * strlen
index 927c38222a93207fa0a4d1fec6ec273f67b0c770..13af19c728d50206a80c0dc23ab772dc71fdb6ab 100644 (file)
@@ -266,7 +266,7 @@ enum mbfl_no_encoding _php_mb_encoding_handler_ex(const php_mb_encoding_handler_
        } else {
                /* auto detect */
                from_encoding = mbfl_no_encoding_invalid;
-               identd = mbfl_encoding_detector_new((enum mbfl_no_encoding *)info->from_encodings, info->num_from_encodings);
+               identd = mbfl_encoding_detector_new((enum mbfl_no_encoding *)info->from_encodings, info->num_from_encodings, MBSTRG(strict_detection));
                if (identd) {
                        n = 0;
                        while (n < num) {
index c21c54a93a90d927886e1b6f96c23e385e941712..13f24ff7a40507da0485c8d06750f8c829eecbe5 100644 (file)
@@ -734,6 +734,9 @@ PHP_INI_BEGIN()
         STD_PHP_INI_BOOLEAN("mbstring.encoding_translation", "0",
         PHP_INI_SYSTEM | PHP_INI_PERDIR, OnUpdate_mbstring_encoding_translation, 
         encoding_translation, zend_mbstring_globals, mbstring_globals)                                  
+
+        STD_PHP_INI_BOOLEAN("mbstring.strict_detection", "0",
+        PHP_INI_ALL, OnUpdateLong, strict_detection, zend_mbstring_globals, mbstring_globals)
 PHP_INI_END()
 /* }}} */
 
@@ -769,6 +772,7 @@ static void _php_mb_globals_ctor(zend_mbstring_globals *pglobals TSRMLS_DC)
        MBSTRG(current_filter_illegal_substchar) = 0x3f;        /* '?' */
        MBSTRG(func_overload) = 0;
        MBSTRG(encoding_translation) = 0;
+       MBSTRG(strict_detection) = 0;
        pglobals->outconv = NULL;
 #if HAVE_MBREGEX
        _php_mb_regex_globals_ctor(pglobals TSRMLS_CC);
@@ -2022,7 +2026,7 @@ MBSTRING_API char * php_mb_convert_encoding(char *input, size_t length, char *_t
                        string.no_encoding = from_encoding;
                } else if (size > 1) {
                        /* auto detect */
-                       from_encoding = mbfl_identify_encoding_no(&string, list, size);
+                       from_encoding = mbfl_identify_encoding_no(&string, list, size, MBSTRG(strict_detection));
                        if (from_encoding != mbfl_no_encoding_invalid) {
                                string.no_encoding = from_encoding;
                        } else {
@@ -2264,6 +2268,9 @@ PHP_FUNCTION(mb_detect_encoding)
                convert_to_long_ex(arg_strict);
                strict = Z_LVAL_PP(arg_strict);
        }
+       else {
+               strict = MBSTRG(strict_detection);
+       }
 
        if (size > 0 && list != NULL) {
                elist = list;
@@ -2555,7 +2562,7 @@ PHP_FUNCTION(mb_convert_variables)
                stack_max = PHP_MBSTR_STACK_BLOCK_SIZE;
                stack = (zval ***)safe_emalloc(stack_max, sizeof(zval **), 0);
                stack_level = 0;
-               identd = mbfl_encoding_detector_new(elist, elistsz);
+               identd = mbfl_encoding_detector_new(elist, elistsz, MBSTRG(strict_detection));
                if (identd != NULL) {
                        n = 2;
                        while (n < argc || stack_level > 0) {
@@ -3174,7 +3181,7 @@ PHP_FUNCTION(mb_send_mail)
                orig_str.no_encoding = MBSTRG(current_internal_encoding);
                if (orig_str.no_encoding == mbfl_no_encoding_invalid
                    || orig_str.no_encoding == mbfl_no_encoding_pass) {
-                       orig_str.no_encoding = mbfl_identify_encoding_no(&orig_str, MBSTRG(current_detect_order_list), MBSTRG(current_detect_order_list_size));
+                       orig_str.no_encoding = mbfl_identify_encoding_no(&orig_str, MBSTRG(current_detect_order_list), MBSTRG(current_detect_order_list_size), MBSTRG(strict_detection));
                }
                pstr = mbfl_mime_header_encode(&orig_str, &conv_str, tran_cs, head_enc, "\n", sizeof("Subject: [PHP-jp nnnnnnnn]"));
                if (pstr != NULL) {
@@ -3194,7 +3201,7 @@ PHP_FUNCTION(mb_send_mail)
 
                if (orig_str.no_encoding == mbfl_no_encoding_invalid
                    || orig_str.no_encoding == mbfl_no_encoding_pass) {
-                       orig_str.no_encoding = mbfl_identify_encoding_no(&orig_str, MBSTRG(current_detect_order_list), MBSTRG(current_detect_order_list_size));
+                       orig_str.no_encoding = mbfl_identify_encoding_no(&orig_str, MBSTRG(current_detect_order_list), MBSTRG(current_detect_order_list_size), MBSTRG(strict_detection));
                }
 
                pstr = NULL;
@@ -3571,7 +3578,7 @@ MBSTRING_API int php_mb_gpc_encoding_detector(char **arg_string, int *arg_length
        mbfl_string_init(&string);
        string.no_language = MBSTRG(current_language);
 
-       identd = mbfl_encoding_detector_new(elist, size);
+       identd = mbfl_encoding_detector_new(elist, size, MBSTRG(strict_detection));
 
        if (identd) {
                int n = 0;
index 3eed51b12be6fe51472686c13e695875091008b7..a4456896df93a24e874dd73adb83b5db9dd9e7a4 100644 (file)
@@ -180,6 +180,7 @@ ZEND_BEGIN_MODULE_GLOBALS(mbstring)
        int current_filter_illegal_substchar;
        long func_overload;
        zend_bool encoding_translation;
+       long strict_detection;
        mbfl_buffer_converter *outconv;
 #if HAVE_MBREGEX && defined(PHP_MBREGEX_GLOBALS)
        PHP_MBREGEX_GLOBALS