summaryrefslogtreecommitdiff
path: root/Zend
diff options
context:
space:
mode:
authorStanislav Malyshev <stas@php.net>2000-07-26 11:32:15 +0000
committerStanislav Malyshev <stas@php.net>2000-07-26 11:32:15 +0000
commit1373a16280f98f8d0f3fab762979e7a7400363fe (patch)
treedcfe5d2d46eddc791bc4a81831d661419426e297 /Zend
parent9bb4011d06ea64af4b357468e08521d4295e52d3 (diff)
downloadphp-git-1373a16280f98f8d0f3fab762979e7a7400363fe.tar.gz
Add strncasecmp function
@ Added strncasecmp function (Andi)
Diffstat (limited to 'Zend')
-rw-r--r--Zend/zend_builtin_functions.c18
-rw-r--r--Zend/zend_operators.c25
-rw-r--r--Zend/zend_operators.h2
3 files changed, 45 insertions, 0 deletions
diff --git a/Zend/zend_builtin_functions.c b/Zend/zend_builtin_functions.c
index 079943afef..2bfe2764e1 100644
--- a/Zend/zend_builtin_functions.c
+++ b/Zend/zend_builtin_functions.c
@@ -33,6 +33,7 @@ static ZEND_FUNCTION(strlen);
static ZEND_FUNCTION(strcmp);
static ZEND_FUNCTION(strncmp);
static ZEND_FUNCTION(strcasecmp);
+static ZEND_FUNCTION(strncasecmp);
static ZEND_FUNCTION(each);
static ZEND_FUNCTION(error_reporting);
static ZEND_FUNCTION(define);
@@ -76,6 +77,7 @@ static zend_function_entry builtin_functions[] = {
ZEND_FE(strcmp, NULL)
ZEND_FE(strncmp, NULL)
ZEND_FE(strcasecmp, NULL)
+ ZEND_FE(strncasecmp, NULL)
ZEND_FE(each, first_arg_force_ref)
ZEND_FE(error_reporting, NULL)
ZEND_FE(define, NULL)
@@ -274,6 +276,22 @@ ZEND_FUNCTION(strcasecmp)
}
/* }}} */
+/* {{{ proto int strncasecmp(string str1, string str2, int len)
+ Binary safe string comparison */
+ZEND_FUNCTION(strncasecmp)
+{
+ zval **s1, **s2, **s3;
+
+ if (ZEND_NUM_ARGS() != 3 || zend_get_parameters_ex(3, &s1, &s2, &s3) == FAILURE) {
+ ZEND_WRONG_PARAM_COUNT();
+ }
+ convert_to_string_ex(s1);
+ convert_to_string_ex(s2);
+ convert_to_long_ex(s3);
+ RETURN_LONG(zend_binary_zval_strncasecmp(*s1,*s2,*s3));
+}
+/* }}} */
+
ZEND_FUNCTION(each)
{
zval **array,*entry,**entry_ptr, *tmp;
diff --git a/Zend/zend_operators.c b/Zend/zend_operators.c
index 6b51218827..e1e7cd2d36 100644
--- a/Zend/zend_operators.c
+++ b/Zend/zend_operators.c
@@ -1473,6 +1473,25 @@ ZEND_API int zend_binary_strcasecmp(char *s1, uint len1, char *s2, uint len2)
}
+ZEND_API int zend_binary_strncasecmp(char *s1, uint len1, char *s2, uint len2, uint length)
+{
+ int len;
+ int c1,c2;
+
+ len = MIN(length, MIN(len1, len2));
+
+ while (len--) {
+ c1 = tolower(*s1++);
+ c2 = tolower(*s2++);
+ if (c1 != c2) {
+ return c1 - c2;
+ }
+ }
+
+ return len1 - len2;
+}
+
+
ZEND_API int zend_binary_zval_strcmp(zval *s1, zval *s2)
{
return zend_binary_strcmp(s1->value.str.val, s1->value.str.len, s2->value.str.val, s2->value.str.len);
@@ -1490,6 +1509,12 @@ ZEND_API int zend_binary_zval_strcasecmp(zval *s1, zval *s2)
}
+ZEND_API int zend_binary_zval_strncasecmp(zval *s1, zval *s2, zval *s3)
+{
+ return zend_binary_strncasecmp(s1->value.str.val, s1->value.str.len, s2->value.str.val, s2->value.str.len, s3->value.lval);
+}
+
+
ZEND_API void zendi_smart_strcmp(zval *result, zval *s1, zval *s2)
{
int ret1,ret2;
diff --git a/Zend/zend_operators.h b/Zend/zend_operators.h
index ef9c8da3ab..3cdbda42ce 100644
--- a/Zend/zend_operators.h
+++ b/Zend/zend_operators.h
@@ -148,9 +148,11 @@ ZEND_API void zend_str_tolower(char *str, unsigned int length);
ZEND_API int zend_binary_zval_strcmp(zval *s1, zval *s2);
ZEND_API int zend_binary_zval_strncmp(zval *s1, zval *s2, zval *s3);
ZEND_API int zend_binary_zval_strcasecmp(zval *s1, zval *s2);
+ZEND_API int zend_binary_zval_strncasecmp(zval *s1, zval *s2, zval *s3);
ZEND_API int zend_binary_strcmp(char *s1, uint len1, char *s2, uint len2);
ZEND_API int zend_binary_strncmp(char *s1, uint len1, char *s2, uint len2, uint length);
ZEND_API int zend_binary_strcasecmp(char *s1, uint len1, char *s2, uint len2);
+ZEND_API int zend_binary_strncasecmp(char *s1, uint len1, char *s2, uint len2, uint length);
ZEND_API void zendi_smart_strcmp(zval *result, zval *s1, zval *s2);
ZEND_API void zend_compare_symbol_tables(zval *result, HashTable *ht1, HashTable *ht2);