]> granicus.if.org Git - php/commitdiff
added strict detection mode in mb_detect_encoding to detect corrupted byte sequence.
authorRui Hirokawa <hirokawa@php.net>
Sun, 13 Jul 2003 07:34:28 +0000 (07:34 +0000)
committerRui Hirokawa <hirokawa@php.net>
Sun, 13 Jul 2003 07:34:28 +0000 (07:34 +0000)
ext/mbstring/mbfilter.c
ext/mbstring/mbfilter.h
ext/mbstring/mbstring.c

index 986077aa0f2bea8127aaf464a2de37729b8e0ddd..427221dee87733782224f8edbec4f8efdbb7b770 100644 (file)
@@ -7473,7 +7473,7 @@ mbfl_convert_encoding(
  * identify encoding
  */
 const mbfl_encoding *
-mbfl_identify_encoding(mbfl_string *string, enum mbfl_no_encoding *elist, int eliztsz TSRMLS_DC)
+mbfl_identify_encoding(mbfl_string *string, enum mbfl_no_encoding *elist, int eliztsz, int strict TSRMLS_DC)
 {
        int i, n, num, bad;
        unsigned char *p;
@@ -7517,7 +7517,7 @@ mbfl_identify_encoding(mbfl_string *string, enum mbfl_no_encoding *elist, int el
                                }
                                i++;
                        }
-                       if ((num - 1) <= bad) {
+                       if ((num - 1) <= bad && !strict) {
                                break;
                        }
                        p++;
@@ -7556,11 +7556,11 @@ mbfl_identify_encoding(mbfl_string *string, enum mbfl_no_encoding *elist, int el
 }
 
 const char*
-mbfl_identify_encoding_name(mbfl_string *string, enum mbfl_no_encoding *elist, int eliztsz TSRMLS_DC)
+mbfl_identify_encoding_name(mbfl_string *string, enum mbfl_no_encoding *elist, int eliztsz, int strict TSRMLS_DC)
 {
        const mbfl_encoding *encoding;
 
-       encoding = mbfl_identify_encoding(string, elist, eliztsz TSRMLS_CC);
+       encoding = mbfl_identify_encoding(string, elist, eliztsz, strict TSRMLS_CC);
        if (encoding != NULL &&
            encoding->no_encoding > mbfl_no_encoding_charset_min &&
            encoding->no_encoding < mbfl_no_encoding_charset_max) {
@@ -7575,7 +7575,7 @@ mbfl_identify_encoding_no(mbfl_string *string, enum mbfl_no_encoding *elist, int
 {
        const mbfl_encoding *encoding;
 
-       encoding = mbfl_identify_encoding(string, elist, eliztsz TSRMLS_CC);
+       encoding = mbfl_identify_encoding(string, elist, eliztsz, 0 TSRMLS_CC);
        if (encoding != NULL &&
            encoding->no_encoding > mbfl_no_encoding_charset_min &&
            encoding->no_encoding < mbfl_no_encoding_charset_max) {
index f39ed8b2f542453a57812097d0360ddb79e781e5..a8a55ae40f817808b5efd02f890e2e87bb6e581b 100644 (file)
@@ -460,10 +460,10 @@ mbfl_convert_encoding(mbfl_string *string, mbfl_string *result, enum mbfl_no_enc
  * identify encoding
  */
 const mbfl_encoding *
-mbfl_identify_encoding(mbfl_string *string, enum mbfl_no_encoding *elist, int eliztsz TSRMLS_DC);
+mbfl_identify_encoding(mbfl_string *string, enum mbfl_no_encoding *elist, int eliztsz, int strict TSRMLS_DC);
 
 const char *
-mbfl_identify_encoding_name(mbfl_string *string, enum mbfl_no_encoding *elist, int eliztsz TSRMLS_DC);
+mbfl_identify_encoding_name(mbfl_string *string, enum mbfl_no_encoding *elist, int eliztsz, int strict TSRMLS_DC);
 
 const enum mbfl_no_encoding
 mbfl_identify_encoding_no(mbfl_string *string, enum mbfl_no_encoding *elist, int eliztsz TSRMLS_DC);
index d03d6c05db69fb0402e91835aba9aa4b0b10f74c..46cd05864786fc37a7fd4eb915add74e9545869f 100644 (file)
@@ -2694,15 +2694,15 @@ PHP_FUNCTION(mb_strtolower)
 }
 /* }}} */
 
-/* {{{ proto string mb_detect_encoding(string str [, mixed encoding_list])
+/* {{{ proto string mb_detect_encoding(string str [, mixed encoding_list [, bool strict]])
    Encodings of the given string is returned (as a string) */
 PHP_FUNCTION(mb_detect_encoding)
 {
-       pval **arg_str, **arg_list;
+       pval **arg_str, **arg_list, **arg_strict;
        mbfl_string string;
        const char *ret;
        enum mbfl_no_encoding *elist;
-       int size, *list;
+       int size, *list, strict = 0;
 
        if (ZEND_NUM_ARGS() == 1) {
                if (zend_get_parameters_ex(1, &arg_str) == FAILURE) {
@@ -2712,6 +2712,10 @@ PHP_FUNCTION(mb_detect_encoding)
                if (zend_get_parameters_ex(2, &arg_str, &arg_list) == FAILURE) {
                        WRONG_PARAM_COUNT;
                }
+       } else if (ZEND_NUM_ARGS() == 3) {
+               if (zend_get_parameters_ex(3, &arg_str, &arg_list, &arg_strict) == FAILURE) {
+                       WRONG_PARAM_COUNT;
+               }
        } else {
                WRONG_PARAM_COUNT;
        }
@@ -2719,7 +2723,7 @@ PHP_FUNCTION(mb_detect_encoding)
        /* make encoding list */
        list = NULL;
        size = 0;
-       if (ZEND_NUM_ARGS() >= 2) {
+       if (ZEND_NUM_ARGS() >= 2 &&  Z_STRVAL_PP(arg_list)) {
                switch (Z_TYPE_PP(arg_list)) {
                case IS_ARRAY:
                        if (!php_mb_parse_encoding_array(*arg_list, &list, &size, 0)) {
@@ -2744,6 +2748,11 @@ PHP_FUNCTION(mb_detect_encoding)
                }
        }
 
+       if (ZEND_NUM_ARGS() == 3) {
+               convert_to_long_ex(arg_strict);
+               strict = Z_LVAL_PP(arg_strict);
+       }
+
        if (size > 0 && list != NULL) {
                elist = list;
        } else {
@@ -2756,7 +2765,7 @@ PHP_FUNCTION(mb_detect_encoding)
        string.no_language = MBSTRG(current_language);
        string.val = (unsigned char *)Z_STRVAL_PP(arg_str);
        string.len = Z_STRLEN_PP(arg_str);
-       ret = mbfl_identify_encoding_name(&string, elist, size TSRMLS_CC);
+       ret = mbfl_identify_encoding_name(&string, elist, size, strict TSRMLS_CC);
        if (list != NULL) {
                efree((void *)list);
        }