]> granicus.if.org Git - php/commitdiff
pull-request/1099
authorYasuo Ohgaki <yohgaki@php.net>
Wed, 10 Aug 2016 05:09:48 +0000 (14:09 +0900)
committerYasuo Ohgaki <yohgaki@php.net>
Wed, 10 Aug 2016 05:09:48 +0000 (14:09 +0900)
Request #65081 - implemeting mb_scrub

ext/mbstring/mbstring.c
ext/mbstring/mbstring.h
ext/mbstring/tests/mb_scrub.phpt [new file with mode: 0644]

index afa54ac98cd4b9c4f18e16d3b0c71cbfa0d49077..5f847dedc0bc8eb8fb1f8b8cb9f35d9bec00785c 100644 (file)
@@ -430,6 +430,11 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_mb_check_encoding, 0, 0, 0)
        ZEND_ARG_INFO(0, encoding)
 ZEND_END_ARG_INFO()
 
+ZEND_BEGIN_ARG_INFO_EX(arginfo_mb_scrub, 0, 0, 1)
+       ZEND_ARG_INFO(0, str)
+       ZEND_ARG_INFO(0, encoding)
+ZEND_END_ARG_INFO()
+
 ZEND_BEGIN_ARG_INFO_EX(arginfo_mb_ord, 0, 0, 1)
        ZEND_ARG_INFO(0, str)
        ZEND_ARG_INFO(0, encoding)
@@ -565,8 +570,9 @@ const zend_function_entry mbstring_functions[] = {
        PHP_FE(mb_send_mail,                    arginfo_mb_send_mail)
        PHP_FE(mb_get_info,                             arginfo_mb_get_info)
        PHP_FE(mb_check_encoding,               arginfo_mb_check_encoding)
-       PHP_FE(mb_ord,          arginfo_mb_ord)
-       PHP_FE(mb_chr,          arginfo_mb_chr)
+       PHP_FE(mb_ord,                                  arginfo_mb_ord)
+       PHP_FE(mb_chr,                                  arginfo_mb_chr)
+       PHP_FE(mb_scrub,                                arginfo_mb_scrub)
 #if HAVE_MBREGEX
        PHP_MBREGEX_FUNCTION_ENTRIES
 #endif
@@ -5069,6 +5075,54 @@ PHP_FUNCTION(mb_chr)
 /* }}} */
 
 
+static inline char* php_mb_scrub(const char* str, size_t str_len, const char* enc)
+{
+       size_t ret_len;
+
+       return php_mb_convert_encoding(str, str_len, enc, enc, &ret_len);
+}
+
+
+/* {{{ proto bool mb_scrub([string str[, string encoding]]) */
+PHP_FUNCTION(mb_scrub)
+{
+       char* str;
+       size_t str_len;
+       char *enc = NULL;
+       size_t enc_len;
+       char *ret;
+
+#ifndef FAST_ZPP
+       if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|s", &str, &str_len, &enc, &enc_len) == FAILURE) {
+               return;
+       }
+#else
+       ZEND_PARSE_PARAMETERS_START(1, 2)
+               Z_PARAM_STRING(str, str_len)
+               Z_PARAM_OPTIONAL
+               Z_PARAM_STRING(enc, enc_len)
+ZEND_PARSE_PARAMETERS_END();
+#endif
+
+       if (enc == NULL) {
+               enc = (char *) MBSTRG(current_internal_encoding)->name;
+       } else if (!mbfl_is_support_encoding(enc)) {
+               php_error_docref(NULL, E_WARNING, "Unknown encoding \"%s\"", enc);
+               RETURN_FALSE;
+       }
+
+       ret = php_mb_scrub(str, str_len, enc);
+
+       if (ret == NULL) {
+               RETURN_FALSE;
+       }
+
+       RETVAL_STRING(ret);
+       efree(ret);
+}
+/* }}} */
+
+
 /* {{{ php_mb_populate_current_detect_order_list */
 static void php_mb_populate_current_detect_order_list(void)
 {
index 2c32bb3995be51e6c0deb8133a92b16bc25c4b16..9021a3a454c70b95cca9882c56b779a92b77307d 100644 (file)
@@ -132,6 +132,8 @@ PHP_FUNCTION(mb_get_info);
 PHP_FUNCTION(mb_check_encoding);
 PHP_FUNCTION(mb_ord);
 PHP_FUNCTION(mb_chr);
+PHP_FUNCTION(mb_scrub);
+
 
 MBSTRING_API char *php_mb_safe_strrchr_ex(const char *s, unsigned int c,
                                     size_t nbytes, const mbfl_encoding *enc);
diff --git a/ext/mbstring/tests/mb_scrub.phpt b/ext/mbstring/tests/mb_scrub.phpt
new file mode 100644 (file)
index 0000000..131e13d
--- /dev/null
@@ -0,0 +1,14 @@
+--TEST--
+mb_scrub()
+--SKIPIF--
+<?php extension_loaded('mbstring') or die('skip mbstring not available'); ?>
+--FILE--
+<?php
+var_dump(
+    "?" === mb_scrub("\x80"),
+    "?" === mb_scrub("\x80", 'UTF-8')
+);
+?>
+--EXPECT--
+bool(true)
+bool(true)