cvs: /php4/ext/standard strnatcmp.c /php4/ext/standard Makefile.in array.c basic_functions.c php_array.h php_string.h string.c
| From: | Andrei Zmievski | Date: | Wed, 12 Apr 2000 19:39:32 +0000 |
| Subject: | cvs: /php4/ext/standard strnatcmp.c /php4/ext/standard Makefile.in array.c basic_functions.c php_array.h php_string.h string.c | ||
| Groups: | php.version4 | ||
| Request: | Send a blank email to php-version4+get-13469@lists.php.net to get a copy of this message | ||
andrei Wed Apr 12 12:39:32 2000 EDT
Added files:
/php4/ext/standard strnatcmp.c
Modified files:
/php4/ext/standard Makefile.in array.c basic_functions.c
php_array.h php_string.h string.c
Log:
Added natural comparison/sorting routines using code from Martin Pool.
@- Added natural comparison/sorting routines strnatcmp(), strnatcasecmp(),
@ natsort(), and natcasesort(). These are useful for comparing and sorting
@ strings that contain numbers. Based on the code from Martin Pool
@ <mbp@humbug.org.au>. See http://www.linuxcare.com.au/projects/natsort/
@ for more info on natural sorting. (Andrei)
Index: php4/ext/standard/Makefile.in
diff -u php4/ext/standard/Makefile.in:1.3 php4/ext/standard/Makefile.in:1.4
--- php4/ext/standard/Makefile.in:1.3 Wed Mar 29 16:43:09 2000
+++ php4/ext/standard/Makefile.in Wed Apr 12 12:39:02 2000
@@ -11,7 +11,8 @@
formatted_print.c fsock.c head.c html.c image.c info.c iptc.c lcg.c \
link.c mail.c math.c md5.c metaphone.c microtime.c pack.c pageinfo.c \
parsedate.c quot_print.c rand.c reg.c soundex.c string.c \
- syslog.c type.c uniqid.c url.c url_scanner.c var.c output.c assert.c
+ syslog.c type.c uniqid.c url.c url_scanner.c var.c output.c assert.c \
+ strnatcmp.c
include $(topsrcdir)/build/ltlib.mk
Index: php4/ext/standard/array.c
diff -u php4/ext/standard/array.c:1.37 php4/ext/standard/array.c:1.38
--- php4/ext/standard/array.c:1.37 Tue Apr 4 01:52:57 2000
+++ php4/ext/standard/array.c Wed Apr 12 12:39:02 2000
@@ -39,6 +39,7 @@
#include "php_globals.h"
#include "php_array.h"
#include "basic_functions.h"
+#include "php_string.h"
#ifdef ZTS
int array_globals_id;
@@ -252,6 +253,98 @@
{
return array_data_compare(a,b)*-1;
}
+
+static int array_natural_general_compare(const void *a, const void *b, int fold_case)
+{
+ Bucket *f, *s;
+ zval *fval, *sval;
+ zval first, second;
+ int result;
+
+ f = *((Bucket **) a);
+ s = *((Bucket **) b);
+
+ fval = *((pval **) f->pData);
+ sval = *((pval **) s->pData);
+ first = *fval;
+ second = *sval;
+ if (fval->type != IS_STRING) {
+ zval_copy_ctor(&first);
+ convert_to_string(&first);
+ }
+ if (sval->type != IS_STRING) {
+ zval_copy_ctor(&first);
+ convert_to_string(&second);
+ }
+
+ result = strnatcmp_ex(first.value.str.val, first.value.str.len,
+ second.value.str.val, second.value.str.len, fold_case);
+
+ if (fval->type != IS_STRING)
+ zval_dtor(&first);
+ if (sval->type != IS_STRING)
+ zval_dtor(&second);
+
+ return result;
+}
+
+static int array_natural_compare(const void *a, const void *b)
+{
+ return array_natural_general_compare(a, b, 0);
+}
+
+static int array_natural_case_compare(const void *a, const void *b)
+{
+ return array_natural_general_compare(a, b, 1);
+}
+
+static void php_natsort(INTERNAL_FUNCTION_PARAMETERS, int fold_case)
+{
+ zval **array;
+ HashTable *target_hash;
+
+ if (ARG_COUNT(ht) != 1 || zend_get_parameters_ex(1, &array) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+
+ target_hash = HASH_OF(*array);
+ if (!target_hash) {
+ php_error(E_WARNING, "Wrong datatype in %s() call",
+ get_active_function_name());
+ return;
+ }
+
+ if (fold_case) {
+ if (zend_hash_sort(target_hash, qsort, array_natural_case_compare, 0) == FAILURE) {
+ return;
+ }
+ } else {
+ if (zend_hash_sort(target_hash, qsort, array_natural_compare, 0) == FAILURE) {
+ return;
+ }
+ }
+
+ RETURN_TRUE;
+}
+
+
+/* {{{ proto void natsort(array array_arg)
+ Sort an array using natural sort */
+PHP_FUNCTION(natsort)
+{
+ php_natsort(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0);
+}
+/* }}} */
+
+
+/* {{{ proto void natcasesort(array array_arg)
+ Sort an array using case-insensitive natural sort */
+PHP_FUNCTION(natcasesort)
+{
+ php_natsort(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1);
+}
+/* }}} */
+
/* {{{ proto void asort(array array_arg)
Sort an array and maintain index association */
Index: php4/ext/standard/basic_functions.c
diff -u php4/ext/standard/basic_functions.c:1.182 php4/ext/standard/basic_functions.c:1.183
--- php4/ext/standard/basic_functions.c:1.182 Mon Apr 10 13:21:01 2000
+++ php4/ext/standard/basic_functions.c Wed Apr 12 12:39:02 2000
@@ -120,6 +120,8 @@
PHP_FE(php_logo_guid, NULL)
PHP_FE(zend_logo_guid, NULL)
+ PHP_FE(strnatcmp, NULL)
+ PHP_FE(strnatcasecmp, NULL)
PHP_FE(strspn, NULL)
PHP_FE(strcspn, NULL)
PHP_FE(strtok, NULL)
@@ -446,6 +448,8 @@
/* functions from array.c */
PHP_FE(ksort, first_arg_force_ref)
PHP_FE(krsort, first_arg_force_ref)
+ PHP_FE(natsort, first_arg_force_ref)
+ PHP_FE(natcasesort, first_arg_force_ref)
PHP_FE(asort, first_arg_force_ref)
PHP_FE(arsort, first_arg_force_ref)
PHP_FE(sort, first_arg_force_ref)
Index: php4/ext/standard/php_array.h
diff -u php4/ext/standard/php_array.h:1.6 php4/ext/standard/php_array.h:1.7
--- php4/ext/standard/php_array.h:1.6 Mon Mar 6 12:37:11 2000
+++ php4/ext/standard/php_array.h Wed Apr 12 12:39:02 2000
@@ -19,7 +19,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: php_array.h,v 1.6 2000/03/06 20:37:11 ssb Exp $ */
+/* $Id: php_array.h,v 1.7 2000/04/12 19:39:02 andrei Exp $ */
#ifndef _PHP_ARRAY_H
#define _PHP_ARRAY_H
@@ -29,6 +29,8 @@
PHP_FUNCTION(ksort);
PHP_FUNCTION(krsort);
+PHP_FUNCTION(natsort);
+PHP_FUNCTION(natcasesort);
PHP_FUNCTION(asort);
PHP_FUNCTION(arsort);
PHP_FUNCTION(sort);
Index: php4/ext/standard/php_string.h
diff -u php4/ext/standard/php_string.h:1.10 php4/ext/standard/php_string.h:1.11
--- php4/ext/standard/php_string.h:1.10 Thu Feb 10 11:41:19 2000
+++ php4/ext/standard/php_string.h Wed Apr 12 12:39:02 2000
@@ -29,7 +29,7 @@
*/
-/* $Id: php_string.h,v 1.10 2000/02/10 19:41:19 zeev Exp $ */
+/* $Id: php_string.h,v 1.11 2000/04/12 19:39:02 andrei Exp $ */
/* Synced with php 3.0 revision 1.43 1999-06-16 [ssb] */
@@ -82,6 +82,14 @@
PHP_FUNCTION(strip_tags);
PHP_FUNCTION(str_repeat);
PHP_FUNCTION(substr_replace);
+PHP_FUNCTION(strnatcmp);
+PHP_FUNCTION(strnatcasecmp);
+
+#define strnatcmp(a, b) \
+ strnatcmp_ex(a, strlen(a), b, strlen(b), 0)
+#define strnatcasecmp(a, b) \
+ strnatcmp_ex(a, strlen(a), b, strlen(b), 1)
+PHPAPI int strnatcmp_ex(char const *a, size_t a_len, char const *b, size_t b_len, int fold_case);
PHPAPI char *php_strtoupper(char *s, size_t len);
PHPAPI char *php_strtolower(char *s, size_t len);
Index: php4/ext/standard/string.c
diff -u php4/ext/standard/string.c:1.105 php4/ext/standard/string.c:1.106
--- php4/ext/standard/string.c:1.105 Thu Mar 30 06:34:46 2000
+++ php4/ext/standard/string.c Wed Apr 12 12:39:02 2000
@@ -18,7 +18,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: string.c,v 1.105 2000/03/30 14:34:46 andrei Exp $ */
+/* $Id: string.c,v 1.106 2000/04/12 19:39:02 andrei Exp $ */
/* Synced with php 3.0 revision 1.193 1999-06-16 [ssb] */
@@ -2456,3 +2456,29 @@
}
}
/* }}} */
+
+static void php_strnatcmp(INTERNAL_FUNCTION_PARAMETERS, int fold_case)
+{
+ zval **s1, **s2;
+
+ if (ARG_COUNT(ht)!=2 || zend_get_parameters_ex(2, &s1, &s2) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+
+ convert_to_string_ex(s1);
+ convert_to_string_ex(s2);
+
+ RETURN_LONG(strnatcmp_ex((*s1)->value.str.val, (*s1)->value.str.len,
+ (*s2)->value.str.val, (*s2)->value.str.len,
+ fold_case));
+}
+
+PHP_FUNCTION(strnatcmp)
+{
+ php_strnatcmp(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0);
+}
+
+PHP_FUNCTION(strnatcasecmp)
+{
+ php_strnatcmp(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1);
+}