summaryrefslogtreecommitdiff
path: root/ext/mbstring/mbstring.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/mbstring/mbstring.c')
-rw-r--r--ext/mbstring/mbstring.c56
1 files changed, 36 insertions, 20 deletions
diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c
index a5646ae590..a44a9dade1 100644
--- a/ext/mbstring/mbstring.c
+++ b/ext/mbstring/mbstring.c
@@ -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;
+ }
}
/* }}} */