]> granicus.if.org Git - php/commitdiff
add php_mb_check_encoding
authorMasaki Kagaya <masakielastic@gmail.com>
Sun, 1 Mar 2015 12:43:09 +0000 (21:43 +0900)
committerAnatol Belski <ab@php.net>
Sun, 17 Jul 2016 12:19:45 +0000 (14:19 +0200)
ext/mbstring/mbstring.c
ext/mbstring/mbstring.h

index a5646ae5902befe8e2a09fe753cfceb1f123cc0d..a44a9dade1cc5a58b1a8df4dd72e63db28672220 100644 (file)
@@ -4672,40 +4672,32 @@ PHP_FUNCTION(mb_get_info)
 }
 /* }}} */
 
-/* {{{ proto bool mb_check_encoding([string var[, string encoding]])
-   Check if the string is valid for the specified encoding */
-PHP_FUNCTION(mb_check_encoding)
+MBSTRING_API int php_mb_check_encoding(const char *input, size_t length, const char *enc)
 {
-       char *var = NULL;
-       size_t var_len;
-       char *enc = NULL;
-       size_t enc_len;
-       mbfl_buffer_converter *convd;
        const mbfl_encoding *encoding = MBSTRG(current_internal_encoding);
+       mbfl_buffer_converter *convd;
        mbfl_string string, result, *ret = NULL;
        long illegalchars = 0;
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS(), "|ss", &var, &var_len, &enc, &enc_len) == FAILURE) {
-               return;
-       }
-
-       if (var == NULL) {
-               RETURN_BOOL(MBSTRG(illegalchars) == 0);
+       if (input == NULL) {
+               return MBSTRG(illegalchars) == 0;
        }
 
        if (enc != NULL) {
                encoding = mbfl_name2encoding(enc);
                if (!encoding || encoding == &mbfl_encoding_pass) {
                        php_error_docref(NULL, E_WARNING, "Invalid encoding \"%s\"", enc);
-                       RETURN_FALSE;
+                       return 0;
                }
        }
 
        convd = mbfl_buffer_converter_new2(encoding, encoding, 0);
+
        if (convd == NULL) {
                php_error_docref(NULL, E_WARNING, "Unable to create converter");
-               RETURN_FALSE;
+               return 0;
        }
+
        mbfl_buffer_converter_illegal_mode(convd, MBFL_OUTPUTFILTER_ILLEGAL_MODE_NONE);
        mbfl_buffer_converter_illegal_substchar(convd, 0);
 
@@ -4713,19 +4705,43 @@ PHP_FUNCTION(mb_check_encoding)
        mbfl_string_init_set(&string, mbfl_no_language_neutral, encoding->no_encoding);
        mbfl_string_init(&result);
 
-       string.val = (unsigned char *)var;
-       string.len = var_len;
+       string.val = (unsigned char *) input;
+       string.len = length;
+
        ret = mbfl_buffer_converter_feed_result(convd, &string, &result);
        illegalchars = mbfl_buffer_illegalchars(convd);
        mbfl_buffer_converter_delete(convd);
 
-       RETVAL_FALSE;
        if (ret != NULL) {
                if (illegalchars == 0 && string.len == result.len && memcmp(string.val, result.val, string.len) == 0) {
-                       RETVAL_TRUE;
+                       mbfl_string_clear(&result);
+                       return 1;
                }
+
                mbfl_string_clear(&result);
        }
+
+       return 0;
+}
+
+/* {{{ proto bool mb_check_encoding([string var[, string encoding]])
+   Check if the string is valid for the specified encoding */
+PHP_FUNCTION(mb_check_encoding)
+{
+       char *var = NULL;
+       size_t var_len;
+       char *enc = NULL;
+       size_t enc_len;
+
+       if (zend_parse_parameters(ZEND_NUM_ARGS(), "|ss", &var, &var_len, &enc, &enc_len) == FAILURE) {
+               return;
+    }
+
+       RETVAL_FALSE;
+
+       if (php_mb_check_encoding(var, var_len, enc)) {
+               RETVAL_TRUE;
+       }
 }
 /* }}} */
 
index 71d63b13debd47cc7ef9be045d8ba997b122ddb3..1283598cfbeac20b85c7b8ad72d773ab5c962e3c 100644 (file)
@@ -152,6 +152,7 @@ MBSTRING_API int php_mb_encoding_detector_ex(const char *arg_string, int arg_len
 MBSTRING_API int php_mb_encoding_converter_ex(char **str, int *len, const char *encoding_to,
                                                                                          const char *encoding_from);
 MBSTRING_API int php_mb_stripos(int mode, const char *old_haystack, unsigned int old_haystack_len, const char *old_needle, unsigned int old_needle_len, long offset, const char *from_encoding);
+MBSTRING_API int php_mb_check_encoding(const char *input, size_t length, const char *enc);
 
 /* internal use only */
 int _php_mb_ini_mbstring_internal_encoding_set(const char *new_value, uint new_value_length);