]> granicus.if.org Git - php/commitdiff
added mb_stripos( ), mb_strripos( ).
authorSeiji Masugata <masugata@php.net>
Thu, 30 Mar 2006 15:43:54 +0000 (15:43 +0000)
committerSeiji Masugata <masugata@php.net>
Thu, 30 Mar 2006 15:43:54 +0000 (15:43 +0000)
ext/mbstring/mbstring.c
ext/mbstring/mbstring.h

index e1b66e1d56981c09592684ed5554ead28a5a68a4..bb9c43f0c890e5477d33c81e767104692944fbcd 100644 (file)
@@ -173,6 +173,8 @@ static const struct mb_overload_def mb_ovld[] = {
        {MB_OVERLOAD_STRING, "strlen", "mb_strlen", "mb_orig_strlen"},
        {MB_OVERLOAD_STRING, "strpos", "mb_strpos", "mb_orig_strpos"},
        {MB_OVERLOAD_STRING, "strrpos", "mb_strrpos", "mb_orig_strrpos"},
+       {MB_OVERLOAD_STRING, "stripos", "mb_stripos", "mb_orig_stripos"},
+       {MB_OVERLOAD_STRING, "strripos", "mb_strripos", "mb_orig_stripos"},
        {MB_OVERLOAD_STRING, "strstr", "mb_strstr", "mb_orig_strstr"},
        {MB_OVERLOAD_STRING, "strrchr", "mb_strrchr", "mb_orig_strrchr"},
        {MB_OVERLOAD_STRING, "substr", "mb_substr", "mb_orig_substr"},
@@ -207,6 +209,8 @@ zend_function_entry mbstring_functions[] = {
        PHP_FE(mb_strlen,                               NULL)
        PHP_FE(mb_strpos,                               NULL)
        PHP_FE(mb_strrpos,                              NULL)
+       PHP_FE(mb_stripos,                              NULL)
+       PHP_FE(mb_strripos,                             NULL)
        PHP_FE(mb_strstr,                               NULL)
        PHP_FE(mb_strrchr,                              NULL)
        PHP_FE(mb_substr_count,                 NULL)
@@ -1677,6 +1681,58 @@ PHP_FUNCTION(mb_strrpos)
 }
 /* }}} */
 
+/* {{{ proto int mb_stripos(string haystack, string needle [, int offset [, string encoding]])
+   Finds position of first occurrence of a string within another, case insensitive */
+PHP_FUNCTION(mb_stripos)
+{
+       int n;
+       long offset;
+       char *old_haystack, *old_needle;
+       char *from_encoding = (char*)mbfl_no2preferred_mime_name(MBSTRG(current_internal_encoding));
+       int old_haystack_len, old_needle_len, from_encoding_len;
+       n = -1;
+       offset = 0;
+
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss|ls", &old_haystack, &old_haystack_len, &old_needle, &old_needle_len, &offset, &from_encoding, &from_encoding_len ) == FAILURE) {
+               RETURN_FALSE;
+       }
+
+ n = php_mb_stripos(0, old_haystack, old_haystack_len, old_needle, old_needle_len, offset, from_encoding TSRMLS_CC);
+
+       if (n >= 0) {
+               RETVAL_LONG(n);
+       } else {
+               RETVAL_FALSE;
+       }
+}
+/* }}} */
+
+/* {{{ proto int mb_strripos(string haystack, string needle [, int offset [, string encoding]])
+   Finds position of last occurrence of a string within another, case insensitive */
+PHP_FUNCTION(mb_strripos)
+{
+       int n;
+       long offset;
+       char *old_haystack, *old_needle;
+       char *from_encoding = (char*)mbfl_no2preferred_mime_name(MBSTRG(current_internal_encoding));
+       int old_haystack_len, old_needle_len, from_encoding_len;
+       n = -1;
+       offset = 0;
+
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss|ls", &old_haystack, &old_haystack_len, &old_needle, &old_needle_len, &offset, &from_encoding, &from_encoding_len ) == FAILURE) {
+               RETURN_FALSE;
+       }
+
+ n = php_mb_stripos(1, old_haystack, old_haystack_len, old_needle, old_needle_len, offset, from_encoding TSRMLS_CC);
+
+       if (n >= 0) {
+               RETVAL_LONG(n);
+       } else {
+               RETVAL_FALSE;
+       }
+}
+/* }}} */
+
 /* {{{ proto string mb_strstr(string haystack, string needle[, bool part[, string encoding]])
    Finds first occurrence of a string within another */
 PHP_FUNCTION(mb_strstr)
@@ -4008,6 +4064,71 @@ MBSTRING_API int php_mb_gpc_encoding_detector(char **arg_string, int *arg_length
 }
 /* }}} */
 
+/* {{{ MBSTRING_API int php_mb_stripos()
+ */
+
+MBSTRING_API int php_mb_stripos(int mode, char *old_haystack, int old_haystack_len, char *old_needle, int old_needle_len, long offset, char *from_encoding TSRMLS_DC)
+{
+       int n;
+       mbfl_string haystack, needle;
+       n = -1;
+
+       mbfl_string_init(&haystack);
+       mbfl_string_init(&needle);
+       haystack.no_language = MBSTRG(current_language);
+       haystack.no_encoding = MBSTRG(current_internal_encoding);
+       needle.no_language = MBSTRG(current_language);
+       needle.no_encoding = MBSTRG(current_internal_encoding);
+
+       do {
+               haystack.val = php_unicode_convert_case(PHP_UNICODE_CASE_UPPER, old_haystack, (size_t) old_haystack_len, &haystack.len, from_encoding TSRMLS_CC);
+
+               if (!haystack.val) {
+                       break;
+               }
+
+               if (haystack.len <= 0) {
+                       php_error_docref(NULL TSRMLS_CC, E_WARNING, "Empty haystack");
+                       break;
+               }
+
+               needle.val = php_unicode_convert_case(PHP_UNICODE_CASE_UPPER, old_needle, (size_t) old_needle_len, &needle.len, from_encoding TSRMLS_CC);
+
+               if (!needle.val) {
+                       break;
+               }
+
+               if (needle.len <= 0) {
+                       php_error_docref(NULL TSRMLS_CC, E_WARNING, "Empty needle");
+                       break;
+               }
+
+               haystack.no_encoding = needle.no_encoding = mbfl_name2no_encoding(from_encoding);
+               if (haystack.no_encoding == mbfl_no_encoding_invalid) {
+                       php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unknown encoding \"%s\"", from_encoding);
+                       break;
+               }
+
+               if (offset < 0 || (unsigned long)offset > haystack.len) {
+                       php_error_docref(NULL TSRMLS_CC, E_WARNING, "Offset is out of range");
+                       break;
+               }
+
+               n = mbfl_strpos(&haystack, &needle, offset, mode);
+       } while(0);
+
+       if(haystack.val){
+               efree(haystack.val);
+       }
+
+       if(needle.val){
+               efree(needle.val);
+       }
+
+ return n;
+}
+/* }}} */
+
 #ifdef ZEND_MULTIBYTE
 /* {{{ MBSTRING_API int php_mb_set_zend_encoding() */
 MBSTRING_API int php_mb_set_zend_encoding(TSRMLS_D)
index 5d6c75466d0b045077e1411ccda260a7aba95e9b..bd408ea182a528212a15e941fbbf570026b3a28c 100644 (file)
@@ -104,6 +104,8 @@ PHP_FUNCTION(mb_output_handler);
 PHP_FUNCTION(mb_strlen);
 PHP_FUNCTION(mb_strpos);
 PHP_FUNCTION(mb_strrpos);
+PHP_FUNCTION(mb_stripos);
+PHP_FUNCTION(mb_strripos);
 PHP_FUNCTION(mb_strstr);
 PHP_FUNCTION(mb_strrchr);
 PHP_FUNCTION(mb_substr_count);
@@ -155,6 +157,8 @@ MBSTRING_API int php_mb_gpc_encoding_converter(char **str, int *len, int num, co
 
 MBSTRING_API int php_mb_gpc_encoding_detector(char **arg_string, int *arg_length, int num, char *arg_list TSRMLS_DC);
 
+MBSTRING_API int php_mb_stripos(int mode, char *old_haystack, int old_haystack_len, char *old_needle, int old_needle_len, long offset, char *from_encoding TSRMLS_DC);
+
 ZEND_BEGIN_MODULE_GLOBALS(mbstring)
        enum mbfl_no_language language;
        enum mbfl_no_language current_language;