]> granicus.if.org Git - php/commitdiff
Made strspn() and strcspn() binary-safe.
authorAndrei Zmievski <andrei@php.net>
Mon, 13 Dec 1999 23:40:36 +0000 (23:40 +0000)
committerAndrei Zmievski <andrei@php.net>
Mon, 13 Dec 1999 23:40:36 +0000 (23:40 +0000)
# Please test if you can, especially cases with embedded chr(0).

@ Made strspn() and strcspn() binary-safe.

TODO
ext/standard/php_string.h
ext/standard/string.c

diff --git a/TODO b/TODO
index 87c2c207daa269683c866fb5a306ad5131d04b40..51f2258d683d2f4b757b8b3b02352d8ba33a841e 100644 (file)
--- a/TODO
+++ b/TODO
@@ -25,7 +25,6 @@ ext/standard
 ------------
     * strpad() (Andrei)
        * NOT binary safe:
-               strcspn()
                strtok()
                basename()
                dirname()
index d7078f0201e70569a9a68eec59c8deabead14d9e..3010676590c180cd7abd93680bad6ac218994b0d 100644 (file)
@@ -102,6 +102,8 @@ extern PHPAPI void php_char_to_str(char *str, uint len, char from, char *to, int
 
 extern PHPAPI void php_implode(pval *delim, pval *arr, pval *return_value);
 extern PHPAPI void php_explode(pval *delim, pval *str, pval *return_value);
-PHPAPI inline char *php_memnstr(char *haystack, char *needle, int needle_len, char *end);
+extern PHPAPI inline char *php_memnstr(char *haystack, char *needle, int needle_len, char *end);
+extern PHPAPI size_t php_strspn(char *s1, char *s2, char *s1_end, char *s2_end); 
+extern PHPAPI size_t php_strcspn(char *s1, char *s2, char *s1_end, char *s2_end); 
 
 #endif /* _PHPSTRING_H */
index 47896b913a5adfe5faa20d2e3ba95c9cab2e748f..cfea7aa4d7f5f742d1b4604dec2bd6fd11b0b000 100644 (file)
@@ -86,14 +86,16 @@ PHP_FUNCTION(bin2hex)
    Find length of initial segment consisting entirely of characters found in mask */
 PHP_FUNCTION(strspn)
 {
-       pval **s1,**s2;
+       zval **s1,**s2;
        
        if (ARG_COUNT(ht)!=2 || getParametersEx(2, &s1, &s2) == FAILURE) {
                WRONG_PARAM_COUNT;
        }
        convert_to_string_ex(s1);
        convert_to_string_ex(s2);
-       RETURN_LONG(strspn((*s1)->value.str.val,(*s2)->value.str.val));
+       RETURN_LONG(php_strspn((*s1)->value.str.val, (*s2)->value.str.val,
+                           (*s1)->value.str.val + (*s1)->value.str.len,
+                                                  (*s2)->value.str.val + (*s2)->value.str.len));
 }
 /* }}} */
 
@@ -108,7 +110,9 @@ PHP_FUNCTION(strcspn)
        }
        convert_to_string_ex(s1);
        convert_to_string_ex(s2);
-       RETURN_LONG(strcspn((*s1)->value.str.val,(*s2)->value.str.val));
+       RETURN_LONG(php_strcspn((*s1)->value.str.val, (*s2)->value.str.val,
+                                           (*s1)->value.str.val + (*s1)->value.str.len,
+                                                       (*s2)->value.str.val + (*s2)->value.str.len));
 }
 /* }}} */
 
@@ -532,6 +536,36 @@ PHPAPI char *php_stristr(unsigned char *s, unsigned char *t,
        return php_memnstr(s, t, t_len, s + s_len);
 }
 
+PHPAPI size_t php_strspn(char *s1, char *s2, char *s1_end, char *s2_end)
+{
+       register const char *p = s1, *spanp;
+       register char c = *p;
+
+cont:
+       for (spanp = s2; p != s1_end && spanp != s2_end;)
+               if (*spanp++ == c) {
+                       c = *(++p);
+                       goto cont;
+               }
+       return (p - s1);
+}
+
+PHPAPI size_t php_strcspn(char *s1, char *s2, char *s1_end, char *s2_end)
+{
+       register const char *p, *spanp;
+       register char c = *s1;
+
+       for (p = s1;;) {
+               spanp = s2;
+               do {
+                       if (*spanp == c || p == s1_end)
+                               return (p - s1);
+               } while (spanp++ < s2_end);
+               c = *(++p);
+       }
+       /* NOTREACHED */
+}
+
 /* {{{ proto string stristr(string haystack, string needle)
    Find first occurrence of a string within another, case insensitive */
 PHP_FUNCTION(stristr)