summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Zend/zend_builtin_functions.c18
-rw-r--r--Zend/zend_operators.c18
-rw-r--r--Zend/zend_operators.h1
3 files changed, 36 insertions, 1 deletions
diff --git a/Zend/zend_builtin_functions.c b/Zend/zend_builtin_functions.c
index 15a875e0e5..102ab24df8 100644
--- a/Zend/zend_builtin_functions.c
+++ b/Zend/zend_builtin_functions.c
@@ -31,6 +31,7 @@ static ZEND_FUNCTION(func_get_arg);
static ZEND_FUNCTION(func_get_args);
static ZEND_FUNCTION(strlen);
static ZEND_FUNCTION(strcmp);
+static ZEND_FUNCTION(strncmp);
static ZEND_FUNCTION(strcasecmp);
static ZEND_FUNCTION(each);
static ZEND_FUNCTION(error_reporting);
@@ -55,6 +56,7 @@ static zend_function_entry builtin_functions[] = {
ZEND_FE(func_get_args, NULL)
ZEND_FE(strlen, NULL)
ZEND_FE(strcmp, NULL)
+ ZEND_FE(strncmp, NULL)
ZEND_FE(strcasecmp, NULL)
ZEND_FE(each, first_arg_force_ref)
ZEND_FE(error_reporting, NULL)
@@ -197,6 +199,22 @@ ZEND_FUNCTION(strcmp)
}
/* }}} */
+/* {{{ proto int strncmp(string str1, string str2, int len)
+ Binary safe string comparison */
+ZEND_FUNCTION(strncmp)
+{
+ zval **s1, **s2, **s3;
+
+ if (ZEND_NUM_ARGS() != 3 || zend_get_parameters_ex(3, &s1, &s2, &s3) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_string_ex(s1);
+ convert_to_string_ex(s2);
+ convert_to_long_ex(s3);
+ RETURN_LONG(zend_binary_zval_strncmp(*s1,*s2,*s3));
+}
+/* }}} */
+
/* {{{ proto int strcasecmp(string str1, string str2)
Binary safe case-insensitive string comparison */
ZEND_FUNCTION(strcasecmp)
diff --git a/Zend/zend_operators.c b/Zend/zend_operators.c
index 7bbf4ccc3f..b8de6d3562 100644
--- a/Zend/zend_operators.c
+++ b/Zend/zend_operators.c
@@ -1230,6 +1230,18 @@ 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, int length)
+{
+ int retval;
+
+ retval = memcmp(s1, s2, MIN(length, MIN(len1, len2)));
+ if (!retval) {
+ return (len1 - len2);
+ } else {
+ return retval;
+ }
+}
+
ZEND_API int zend_binary_strcasecmp(char *s1, uint len1, char *s2, uint len2)
{
@@ -1256,6 +1268,11 @@ 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);
}
+ZEND_API int zend_binary_zval_strncmp(zval *s1, zval *s2, zval *s3)
+{
+ return zend_binary_strncmp(s1->value.str.val, s1->value.str.len, s2->value.str.val, s2->value.str.len, s3->value.lval);
+}
+
ZEND_API int zend_binary_zval_strcasecmp(zval *s1, zval *s2)
{
@@ -1263,7 +1280,6 @@ ZEND_API int zend_binary_zval_strcasecmp(zval *s1, zval *s2)
}
-
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 82c4f7cbd0..e106f1481b 100644
--- a/Zend/zend_operators.h
+++ b/Zend/zend_operators.h
@@ -70,6 +70,7 @@ ZEND_API int compare_function(zval *result, zval *op1, zval *op2);
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_strcmp(char *s1, uint len1, char *s2, uint len2);
ZEND_API int zend_binary_strcasecmp(char *s1, uint len1, char *s2, uint len2);