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: 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); +}

« previous php.version4 (#13469) next »