From 8ad4ef98b62d9f7c9d6e574f6bc5c84bb8ddcdea Mon Sep 17 00:00:00 2001 From: Yasuo Ohgaki Date: Wed, 10 Aug 2016 14:09:48 +0900 Subject: [PATCH] pull-request/1099 Request #65081 - implemeting mb_scrub --- ext/mbstring/mbstring.c | 58 ++++++++++++++++++++++++++++++-- ext/mbstring/mbstring.h | 2 ++ ext/mbstring/tests/mb_scrub.phpt | 14 ++++++++ 3 files changed, 72 insertions(+), 2 deletions(-) create mode 100644 ext/mbstring/tests/mb_scrub.phpt diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c index afa54ac98c..5f847dedc0 100644 --- a/ext/mbstring/mbstring.c +++ b/ext/mbstring/mbstring.c @@ -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) { diff --git a/ext/mbstring/mbstring.h b/ext/mbstring/mbstring.h index 2c32bb3995..9021a3a454 100644 --- a/ext/mbstring/mbstring.h +++ b/ext/mbstring/mbstring.h @@ -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 index 0000000000..131e13d536 --- /dev/null +++ b/ext/mbstring/tests/mb_scrub.phpt @@ -0,0 +1,14 @@ +--TEST-- +mb_scrub() +--SKIPIF-- + +--FILE-- + +--EXPECT-- +bool(true) +bool(true) -- 2.40.0