Skip to content

Commit ee6ccea

Browse files
masakielasticweltling
authored andcommitted
add php_mb_check_encoding
1 parent 2349332 commit ee6ccea

File tree

2 files changed

+37
-20
lines changed

2 files changed

+37
-20
lines changed

ext/mbstring/mbstring.c

+36-20
Original file line numberDiff line numberDiff line change
@@ -4672,60 +4672,76 @@ PHP_FUNCTION(mb_get_info)
46724672
}
46734673
/* }}} */
46744674

4675-
/* {{{ proto bool mb_check_encoding([string var[, string encoding]])
4676-
Check if the string is valid for the specified encoding */
4677-
PHP_FUNCTION(mb_check_encoding)
4675+
MBSTRING_API int php_mb_check_encoding(const char *input, size_t length, const char *enc)
46784676
{
4679-
char *var = NULL;
4680-
size_t var_len;
4681-
char *enc = NULL;
4682-
size_t enc_len;
4683-
mbfl_buffer_converter *convd;
46844677
const mbfl_encoding *encoding = MBSTRG(current_internal_encoding);
4678+
mbfl_buffer_converter *convd;
46854679
mbfl_string string, result, *ret = NULL;
46864680
long illegalchars = 0;
46874681

4688-
if (zend_parse_parameters(ZEND_NUM_ARGS(), "|ss", &var, &var_len, &enc, &enc_len) == FAILURE) {
4689-
return;
4690-
}
4691-
4692-
if (var == NULL) {
4693-
RETURN_BOOL(MBSTRG(illegalchars) == 0);
4682+
if (input == NULL) {
4683+
return MBSTRG(illegalchars) == 0;
46944684
}
46954685

46964686
if (enc != NULL) {
46974687
encoding = mbfl_name2encoding(enc);
46984688
if (!encoding || encoding == &mbfl_encoding_pass) {
46994689
php_error_docref(NULL, E_WARNING, "Invalid encoding \"%s\"", enc);
4700-
RETURN_FALSE;
4690+
return 0;
47014691
}
47024692
}
47034693

47044694
convd = mbfl_buffer_converter_new2(encoding, encoding, 0);
4695+
47054696
if (convd == NULL) {
47064697
php_error_docref(NULL, E_WARNING, "Unable to create converter");
4707-
RETURN_FALSE;
4698+
return 0;
47084699
}
4700+
47094701
mbfl_buffer_converter_illegal_mode(convd, MBFL_OUTPUTFILTER_ILLEGAL_MODE_NONE);
47104702
mbfl_buffer_converter_illegal_substchar(convd, 0);
47114703

47124704
/* initialize string */
47134705
mbfl_string_init_set(&string, mbfl_no_language_neutral, encoding->no_encoding);
47144706
mbfl_string_init(&result);
47154707

4716-
string.val = (unsigned char *)var;
4717-
string.len = var_len;
4708+
string.val = (unsigned char *) input;
4709+
string.len = length;
4710+
47184711
ret = mbfl_buffer_converter_feed_result(convd, &string, &result);
47194712
illegalchars = mbfl_buffer_illegalchars(convd);
47204713
mbfl_buffer_converter_delete(convd);
47214714

4722-
RETVAL_FALSE;
47234715
if (ret != NULL) {
47244716
if (illegalchars == 0 && string.len == result.len && memcmp(string.val, result.val, string.len) == 0) {
4725-
RETVAL_TRUE;
4717+
mbfl_string_clear(&result);
4718+
return 1;
47264719
}
4720+
47274721
mbfl_string_clear(&result);
47284722
}
4723+
4724+
return 0;
4725+
}
4726+
4727+
/* {{{ proto bool mb_check_encoding([string var[, string encoding]])
4728+
Check if the string is valid for the specified encoding */
4729+
PHP_FUNCTION(mb_check_encoding)
4730+
{
4731+
char *var = NULL;
4732+
size_t var_len;
4733+
char *enc = NULL;
4734+
size_t enc_len;
4735+
4736+
if (zend_parse_parameters(ZEND_NUM_ARGS(), "|ss", &var, &var_len, &enc, &enc_len) == FAILURE) {
4737+
return;
4738+
}
4739+
4740+
RETVAL_FALSE;
4741+
4742+
if (php_mb_check_encoding(var, var_len, enc)) {
4743+
RETVAL_TRUE;
4744+
}
47294745
}
47304746
/* }}} */
47314747

ext/mbstring/mbstring.h

+1
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,7 @@ MBSTRING_API int php_mb_encoding_detector_ex(const char *arg_string, int arg_len
152152
MBSTRING_API int php_mb_encoding_converter_ex(char **str, int *len, const char *encoding_to,
153153
const char *encoding_from);
154154
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);
155+
MBSTRING_API int php_mb_check_encoding(const char *input, size_t length, const char *enc);
155156

156157
/* internal use only */
157158
int _php_mb_ini_mbstring_internal_encoding_set(const char *new_value, uint new_value_length);

0 commit comments

Comments
 (0)