|
|
|
@ -70,8 +70,8 @@ PHP_FUNCTION(grapheme_strlen) |
|
|
|
} |
|
|
|
|
|
|
|
ret_len = grapheme_ascii_check(string, string_len); |
|
|
|
|
|
|
|
if ( ret_len >= 0 ) |
|
|
|
|
|
|
|
if ( ret_len >= 0 ) |
|
|
|
RETURN_LONG(ret_len); |
|
|
|
|
|
|
|
/* convert the string to UTF-16. */ |
|
|
|
@ -87,7 +87,7 @@ PHP_FUNCTION(grapheme_strlen) |
|
|
|
efree( ustring ); |
|
|
|
RETURN_NULL(); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
ret_len = grapheme_split_string(ustring, ustring_len, NULL, 0 TSRMLS_CC ); |
|
|
|
|
|
|
|
efree( ustring ); |
|
|
|
@ -110,37 +110,37 @@ PHP_FUNCTION(grapheme_strpos) |
|
|
|
long loffset = 0; |
|
|
|
int32_t offset = 0; |
|
|
|
int ret_pos, uchar_pos; |
|
|
|
|
|
|
|
|
|
|
|
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss|l", (char **)&haystack, &haystack_len, (char **)&needle, &needle_len, &loffset) == FAILURE) { |
|
|
|
|
|
|
|
|
|
|
|
intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR, |
|
|
|
"grapheme_strpos: unable to parse input param", 0 TSRMLS_CC ); |
|
|
|
|
|
|
|
|
|
|
|
RETURN_FALSE; |
|
|
|
} |
|
|
|
|
|
|
|
if ( OUTSIDE_STRING(loffset, haystack_len) ) { |
|
|
|
|
|
|
|
|
|
|
|
intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR, "grapheme_strpos: Offset not contained in string", 1 TSRMLS_CC ); |
|
|
|
|
|
|
|
|
|
|
|
RETURN_FALSE; |
|
|
|
} |
|
|
|
|
|
|
|
/* we checked that it will fit: */ |
|
|
|
/* we checked that it will fit: */ |
|
|
|
offset = (int32_t) loffset; |
|
|
|
|
|
|
|
/* the offset is 'grapheme count offset' so it still might be invalid - we'll check it later */ |
|
|
|
|
|
|
|
if (needle_len == 0) { |
|
|
|
|
|
|
|
|
|
|
|
intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR, "grapheme_strpos: Empty delimiter", 1 TSRMLS_CC ); |
|
|
|
|
|
|
|
|
|
|
|
RETURN_FALSE; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/* quick check to see if the string might be there |
|
|
|
* I realize that 'offset' is 'grapheme count offset' but will work in spite of that |
|
|
|
* I realize that 'offset' is 'grapheme count offset' but will work in spite of that |
|
|
|
*/ |
|
|
|
found = (unsigned char *)php_memnstr((char *)haystack + offset, (char *)needle, needle_len, (char *)haystack + haystack_len); |
|
|
|
|
|
|
|
@ -178,31 +178,31 @@ PHP_FUNCTION(grapheme_stripos) |
|
|
|
int32_t offset = 0; |
|
|
|
int ret_pos, uchar_pos; |
|
|
|
int is_ascii; |
|
|
|
|
|
|
|
|
|
|
|
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss|l", (char **)&haystack, &haystack_len, (char **)&needle, &needle_len, &loffset) == FAILURE) { |
|
|
|
|
|
|
|
|
|
|
|
intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR, |
|
|
|
"grapheme_stripos: unable to parse input param", 0 TSRMLS_CC ); |
|
|
|
|
|
|
|
|
|
|
|
RETURN_FALSE; |
|
|
|
} |
|
|
|
|
|
|
|
if ( OUTSIDE_STRING(loffset, haystack_len) ) { |
|
|
|
|
|
|
|
|
|
|
|
intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR, "grapheme_stripos: Offset not contained in string", 1 TSRMLS_CC ); |
|
|
|
|
|
|
|
|
|
|
|
RETURN_FALSE; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/* we checked that it will fit: */ |
|
|
|
offset = (int32_t) loffset; |
|
|
|
|
|
|
|
/* the offset is 'grapheme count offset' so it still might be invalid - we'll check it later */ |
|
|
|
|
|
|
|
if (needle_len == 0) { |
|
|
|
|
|
|
|
|
|
|
|
intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR, "grapheme_stripos: Empty delimiter", 1 TSRMLS_CC ); |
|
|
|
|
|
|
|
|
|
|
|
RETURN_FALSE; |
|
|
|
} |
|
|
|
|
|
|
|
@ -252,40 +252,40 @@ PHP_FUNCTION(grapheme_strrpos) |
|
|
|
int32_t offset = 0; |
|
|
|
int32_t ret_pos; |
|
|
|
int is_ascii; |
|
|
|
|
|
|
|
|
|
|
|
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss|l", (char **)&haystack, &haystack_len, (char **)&needle, &needle_len, &loffset) == FAILURE) { |
|
|
|
|
|
|
|
|
|
|
|
intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR, |
|
|
|
"grapheme_strrpos: unable to parse input param", 0 TSRMLS_CC ); |
|
|
|
|
|
|
|
|
|
|
|
RETURN_FALSE; |
|
|
|
} |
|
|
|
|
|
|
|
if ( OUTSIDE_STRING(loffset, haystack_len) ) { |
|
|
|
|
|
|
|
|
|
|
|
intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR, "grapheme_strpos: Offset not contained in string", 1 TSRMLS_CC ); |
|
|
|
|
|
|
|
|
|
|
|
RETURN_FALSE; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/* we checked that it will fit: */ |
|
|
|
offset = (int32_t) loffset; |
|
|
|
|
|
|
|
/* the offset is 'grapheme count offset' so it still might be invalid - we'll check it later */ |
|
|
|
|
|
|
|
if (needle_len == 0) { |
|
|
|
|
|
|
|
|
|
|
|
intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR, "grapheme_strpos: Empty delimiter", 1 TSRMLS_CC ); |
|
|
|
|
|
|
|
|
|
|
|
RETURN_FALSE; |
|
|
|
} |
|
|
|
|
|
|
|
is_ascii = grapheme_ascii_check(haystack, haystack_len) >= 0; |
|
|
|
|
|
|
|
if ( is_ascii ) { |
|
|
|
|
|
|
|
|
|
|
|
ret_pos = grapheme_strrpos_ascii(haystack, haystack_len, needle, needle_len, offset); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if ( ret_pos >= 0 ) { |
|
|
|
RETURN_LONG(ret_pos); |
|
|
|
@ -307,7 +307,7 @@ PHP_FUNCTION(grapheme_strrpos) |
|
|
|
} else { |
|
|
|
RETURN_FALSE; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
/* }}} */ |
|
|
|
@ -322,31 +322,31 @@ PHP_FUNCTION(grapheme_strripos) |
|
|
|
int32_t offset = 0; |
|
|
|
int32_t ret_pos; |
|
|
|
int is_ascii; |
|
|
|
|
|
|
|
|
|
|
|
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss|l", (char **)&haystack, &haystack_len, (char **)&needle, &needle_len, &loffset) == FAILURE) { |
|
|
|
|
|
|
|
|
|
|
|
intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR, |
|
|
|
"grapheme_strrpos: unable to parse input param", 0 TSRMLS_CC ); |
|
|
|
|
|
|
|
|
|
|
|
RETURN_FALSE; |
|
|
|
} |
|
|
|
|
|
|
|
if ( OUTSIDE_STRING(loffset, haystack_len) ) { |
|
|
|
|
|
|
|
|
|
|
|
intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR, "grapheme_strpos: Offset not contained in string", 1 TSRMLS_CC ); |
|
|
|
|
|
|
|
|
|
|
|
RETURN_FALSE; |
|
|
|
} |
|
|
|
|
|
|
|
/* we checked that it will fit: */ |
|
|
|
offset = (int32_t) loffset; |
|
|
|
|
|
|
|
|
|
|
|
/* the offset is 'grapheme count offset' so it still might be invalid - we'll check it later */ |
|
|
|
|
|
|
|
if (needle_len == 0) { |
|
|
|
|
|
|
|
|
|
|
|
intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR, "grapheme_strpos: Empty delimiter", 1 TSRMLS_CC ); |
|
|
|
|
|
|
|
|
|
|
|
RETURN_FALSE; |
|
|
|
} |
|
|
|
|
|
|
|
@ -361,7 +361,7 @@ PHP_FUNCTION(grapheme_strripos) |
|
|
|
php_strtolower((char *)haystack_dup, haystack_len); |
|
|
|
|
|
|
|
ret_pos = grapheme_strrpos_ascii(haystack_dup, haystack_len, needle_dup, needle_len, offset); |
|
|
|
|
|
|
|
|
|
|
|
efree(haystack_dup); |
|
|
|
efree(needle_dup); |
|
|
|
|
|
|
|
@ -385,7 +385,7 @@ PHP_FUNCTION(grapheme_strripos) |
|
|
|
} else { |
|
|
|
RETURN_FALSE; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
/* }}} */ |
|
|
|
@ -407,17 +407,17 @@ PHP_FUNCTION(grapheme_substr) |
|
|
|
int32_t (*iter_func)(UBreakIterator *); |
|
|
|
|
|
|
|
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sl|l", (char **)&str, &str_len, &lstart, &length) == FAILURE) { |
|
|
|
|
|
|
|
|
|
|
|
intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR, |
|
|
|
"grapheme_substr: unable to parse input param", 0 TSRMLS_CC ); |
|
|
|
|
|
|
|
|
|
|
|
RETURN_FALSE; |
|
|
|
} |
|
|
|
|
|
|
|
if ( OUTSIDE_STRING(lstart, str_len) ) { |
|
|
|
|
|
|
|
|
|
|
|
intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR, "grapheme_substr: start not contained in string", 1 TSRMLS_CC ); |
|
|
|
|
|
|
|
|
|
|
|
RETURN_FALSE; |
|
|
|
} |
|
|
|
|
|
|
|
@ -456,7 +456,7 @@ PHP_FUNCTION(grapheme_substr) |
|
|
|
if( U_FAILURE(status) ) { |
|
|
|
RETURN_FALSE; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
ubrk_setText(bi, ustr, ustr_len, &status); |
|
|
|
|
|
|
|
if ( start < 0 ) { |
|
|
|
@ -482,9 +482,9 @@ PHP_FUNCTION(grapheme_substr) |
|
|
|
} |
|
|
|
|
|
|
|
if ( 0 != start || sub_str_start_pos >= ustr_len ) { |
|
|
|
|
|
|
|
|
|
|
|
intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR, "grapheme_substr: start not contained in string", 1 TSRMLS_CC ); |
|
|
|
|
|
|
|
|
|
|
|
efree(ustr); |
|
|
|
ubrk_close(bi); |
|
|
|
RETURN_FALSE; |
|
|
|
@ -541,11 +541,11 @@ PHP_FUNCTION(grapheme_substr) |
|
|
|
|
|
|
|
length += iter_val; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if ( UBRK_DONE == sub_str_end_pos && length < 0) { |
|
|
|
|
|
|
|
|
|
|
|
intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR, "grapheme_substr: length not contained in string", 1 TSRMLS_CC ); |
|
|
|
|
|
|
|
|
|
|
|
efree(ustr); |
|
|
|
ubrk_close(bi); |
|
|
|
RETURN_FALSE; |
|
|
|
@ -586,17 +586,17 @@ static void strstr_common_handler(INTERNAL_FUNCTION_PARAMETERS, int f_ignore_cas |
|
|
|
zend_bool part = 0; |
|
|
|
|
|
|
|
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss|b", (char **)&haystack, &haystack_len, (char **)&needle, &needle_len, &part) == FAILURE) { |
|
|
|
|
|
|
|
|
|
|
|
intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR, |
|
|
|
"grapheme_strstr: unable to parse input param", 0 TSRMLS_CC ); |
|
|
|
|
|
|
|
|
|
|
|
RETURN_FALSE; |
|
|
|
} |
|
|
|
|
|
|
|
if (needle_len == 0) { |
|
|
|
|
|
|
|
|
|
|
|
intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR, "grapheme_strpos: Empty delimiter", 1 TSRMLS_CC ); |
|
|
|
|
|
|
|
|
|
|
|
RETURN_FALSE; |
|
|
|
} |
|
|
|
|
|
|
|
@ -604,7 +604,7 @@ static void strstr_common_handler(INTERNAL_FUNCTION_PARAMETERS, int f_ignore_cas |
|
|
|
if ( !f_ignore_case ) { |
|
|
|
|
|
|
|
/* ASCII optimization: quick check to see if the string might be there |
|
|
|
* I realize that 'offset' is 'grapheme count offset' but will work in spite of that |
|
|
|
* I realize that 'offset' is 'grapheme count offset' but will work in spite of that |
|
|
|
*/ |
|
|
|
found = (unsigned char *)php_memnstr((char *)haystack, (char *)needle, needle_len, (char *)haystack + haystack_len); |
|
|
|
|
|
|
|
@ -640,7 +640,7 @@ static void strstr_common_handler(INTERNAL_FUNCTION_PARAMETERS, int f_ignore_cas |
|
|
|
|
|
|
|
if (part) { |
|
|
|
RETURN_STRINGL(((char *)haystack), ret_pos, 1); |
|
|
|
} |
|
|
|
} |
|
|
|
else { |
|
|
|
RETURN_STRINGL(((char *)haystack) + ret_pos, haystack_len - ret_pos, 1); |
|
|
|
} |
|
|
|
@ -752,7 +752,7 @@ grapheme_extract_count_iter(UBreakIterator *bi, int32_t size, unsigned char *pst |
|
|
|
size--; |
|
|
|
} |
|
|
|
|
|
|
|
/* pos is one past the last UChar - and represent the number of code units to |
|
|
|
/* pos is one past the last UChar - and represent the number of code units to |
|
|
|
advance in the utf-8 buffer |
|
|
|
*/ |
|
|
|
|
|
|
|
@ -790,23 +790,23 @@ PHP_FUNCTION(grapheme_extract) |
|
|
|
zval *next = NULL; /* return offset of next part of the string */ |
|
|
|
|
|
|
|
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sl|llz", (char **)&str, &str_len, &size, &extract_type, &lstart, &next) == FAILURE) { |
|
|
|
|
|
|
|
|
|
|
|
intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR, |
|
|
|
"grapheme_extract: unable to parse input param", 0 TSRMLS_CC ); |
|
|
|
|
|
|
|
|
|
|
|
RETURN_FALSE; |
|
|
|
} |
|
|
|
|
|
|
|
if ( NULL != next ) { |
|
|
|
if ( !PZVAL_IS_REF(next) ) { |
|
|
|
intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR, |
|
|
|
intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR, |
|
|
|
"grapheme_extract: 'next' was not passed by reference", 0 TSRMLS_CC ); |
|
|
|
|
|
|
|
|
|
|
|
RETURN_FALSE; |
|
|
|
} |
|
|
|
else { |
|
|
|
/* initialize next */ |
|
|
|
ZVAL_LONG(next, start); |
|
|
|
ZVAL_LONG(next, lstart); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
@ -814,7 +814,7 @@ PHP_FUNCTION(grapheme_extract) |
|
|
|
|
|
|
|
intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR, |
|
|
|
"grapheme_extract: unknown extract type param", 0 TSRMLS_CC ); |
|
|
|
|
|
|
|
|
|
|
|
RETURN_FALSE; |
|
|
|
} |
|
|
|
|
|
|
|
@ -845,7 +845,7 @@ PHP_FUNCTION(grapheme_extract) |
|
|
|
if ( pstr >= str_end ) { |
|
|
|
intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR, |
|
|
|
"grapheme_extract: invalid input string", 0 TSRMLS_CC ); |
|
|
|
|
|
|
|
|
|
|
|
RETURN_FALSE; |
|
|
|
} |
|
|
|
} |
|
|
|
@ -856,9 +856,9 @@ PHP_FUNCTION(grapheme_extract) |
|
|
|
/* if the string is all ASCII up to size+1 - or str_len whichever is first - then we are done. |
|
|
|
(size + 1 because the size-th character might be the beginning of a grapheme cluster) |
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
if ( -1 != grapheme_ascii_check(pstr, size + 1 < str_len ? size + 1 : str_len ) ) { |
|
|
|
long nsize = ( size < str_len ? size : str_len ); |
|
|
|
long nsize = ( size < str_len ? size : str_len ); |
|
|
|
if ( NULL != next ) { |
|
|
|
ZVAL_LONG(next, start+nsize); |
|
|
|
} |
|
|
|
|