]> granicus.if.org Git - php/commitdiff
added mb_strstr( ).
authorSeiji Masugata <masugata@php.net>
Tue, 28 Mar 2006 16:05:16 +0000 (16:05 +0000)
committerSeiji Masugata <masugata@php.net>
Tue, 28 Mar 2006 16:05:16 +0000 (16:05 +0000)
ext/mbstring/mbstring.c
ext/mbstring/mbstring.h

index b63d82ac4dce93082a87e9c4cafbcd8057fbc662..e66a67ade36810e235edbb79cc9129b1aff65e4e 100644 (file)
@@ -173,6 +173,7 @@ 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, "strstr", "mb_strstr", "mb_orig_strstr"},
        {MB_OVERLOAD_STRING, "substr", "mb_substr", "mb_orig_substr"},
        {MB_OVERLOAD_STRING, "strtolower", "mb_strtolower", "mb_orig_strtolower"},
        {MB_OVERLOAD_STRING, "strtoupper", "mb_strtoupper", "mb_orig_strtoupper"},
@@ -205,6 +206,7 @@ zend_function_entry mbstring_functions[] = {
        PHP_FE(mb_strlen,                               NULL)
        PHP_FE(mb_strpos,                               NULL)
        PHP_FE(mb_strrpos,                              NULL)
+       PHP_FE(mb_strstr,                               NULL)
        PHP_FE(mb_substr_count,                 NULL)
        PHP_FE(mb_substr,                               NULL)
        PHP_FE(mb_strcut,                               NULL)
@@ -1673,6 +1675,69 @@ PHP_FUNCTION(mb_strrpos)
 }
 /* }}} */
 
+/* {{{ proto string mb_strstr(string haystack, string needle[, bool part[, string encoding]])
+   Finds first occurrence of a string within another */
+PHP_FUNCTION(mb_strstr)
+{
+       int n, len, mblen;
+       mbfl_string haystack, needle, result, *ret = NULL;;
+       char *enc_name = NULL;
+       int enc_name_len;
+       zend_bool part = 0;
+
+       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);
+
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss|bs", (char **)&haystack.val, &haystack.len, (char **)&needle.val, &needle.len, &part, &enc_name, &enc_name_len) == FAILURE) {
+               RETURN_FALSE;
+       }
+
+       if (enc_name != NULL) {
+               haystack.no_encoding = needle.no_encoding = mbfl_name2no_encoding(enc_name);
+               if (haystack.no_encoding == mbfl_no_encoding_invalid) {
+                       php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unknown encoding \"%s\"", enc_name);
+                       RETURN_FALSE;
+               }
+       }
+
+       if (haystack.len <= 0) {
+               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Empty haystack");
+               RETURN_FALSE;
+       }
+       if (needle.len <= 0) {
+               php_error_docref(NULL TSRMLS_CC, E_WARNING,"Empty needle");
+               RETURN_FALSE;
+       }
+       n = mbfl_strpos(&haystack, &needle, 0, 0);
+       if (n >= 0) {
+               if (part) {
+                       mblen = mbfl_strlen(&haystack);
+                       ret = mbfl_substr(&haystack, &result, 0, n);
+                       if (ret != NULL) {
+                               RETVAL_STRINGL((char *)ret->val, ret->len, 0);
+                       } else {
+                               RETVAL_FALSE;
+                       }
+               } else {
+                       mblen = mbfl_strlen(&haystack);
+                       len = (mblen - n);
+                       ret = mbfl_substr(&haystack, &result, n, len);
+                       if (ret != NULL) {
+                               RETVAL_STRINGL((char *)ret->val, ret->len, 0);
+                       } else {
+                               RETVAL_FALSE;
+                       }
+               }
+       } else {
+               RETVAL_FALSE;
+       }
+}
+/* }}} */
+
 /* {{{ proto int mb_substr_count(string haystack, string needle [, string encoding])
    Count the number of substring occurrences */
 PHP_FUNCTION(mb_substr_count)
index 71628a02c3a25962d400f8f25ba83f4cee3e03cf..6a60f350dff8d5f42c05bb272b16ca042c975071 100644 (file)
@@ -104,6 +104,7 @@ PHP_FUNCTION(mb_output_handler);
 PHP_FUNCTION(mb_strlen);
 PHP_FUNCTION(mb_strpos);
 PHP_FUNCTION(mb_strrpos);
+PHP_FUNCTION(mb_strstr);
 PHP_FUNCTION(mb_substr_count);
 PHP_FUNCTION(mb_substr);
 PHP_FUNCTION(mb_strcut);