[svn r21477] FS#306 - The multi-byte string library: Implementation of a new function for case-sensitive string comparison api_strcmp(). When intl extension is installed, this function depends internally on the more reliable ICU locale, not on OS POSIX locale. Replacing strcmp() with api_strcmp() in some relevant places. Reworking of TableSort::sort_table() for avoiding unnecessary recursive calls.

skala
Ivan Tcholakov 16 years ago
parent 5c0df75c2f
commit 1df78517c1
  1. 44
      main/inc/lib/multibyte_string_functions.lib.php
  2. 44
      main/inc/lib/tablesort.lib.php
  3. 4
      main/mySpace/index.php
  4. 4
      main/tracking/courseLog.php

@ -1037,6 +1037,50 @@ function api_add_pcre_unicode_modifier($pcre, $encoding = null) {
return api_is_utf8($encoding) ? $pcre.'u' : $pcre;
}
/**
* ----------------------------------------------------------------------------
* Functions for string comparison
* ----------------------------------------------------------------------------
*/
/**
* Performs string comparison, case insensitive, language sensitive, replacement of strcmp().
* @param string $string1 The first string.
* @param string $string2 The second string.
* @param string $language (optional) The language in which comparison is to be made. If language is omitted, interface language is assumed then.
* @param string $encoding (optional) The used internally by this function character encoding. If it is omitted, the platform character set will be used by default.
* @link http://php.net/manual/en/function.strcmp.php
* @link http://php.net/manual/en/collator.compare.php
*/
function api_strcmp($string1, $string2, $language = null, $encoding = null) {
if (INTL_INSTALLED) {
$collator = api_get_collator($language);
if (is_object($collator)) {
$result = collator_compare($collator, api_utf8_encode($string1, $encoding), api_utf8_encode($string2, $encoding));
return $result === false ? 0 : $result;
}
}
return strcmp($string1, $string2);
}
/**
* Returns an instance of Collator class (ICU) created for a specified language.
* @param string $language (optional) The specified language. If it is omitted, then the interface language is assumed.
* @return object The corresponding instance of Collator class.
* @link http://php.net/manual/en/collator.create.php
*/
function api_get_collator($language = null) {
static $collator = array();
if (INTL_INSTALLED) {
if (!isset($collator[$language])) {
$locale = api_get_locale_from_language($language);
$collator[$language] = collator_create($locale);
}
return $collator[$language];
}
return null;
}
/**
* ----------------------------------------------------------------------------
* Encoding management functions

@ -95,37 +95,43 @@ class TableSort
if($column != strval(intval($column))){return $data;} //probably an attack
if(!in_array($direction,array(SORT_ASC,SORT_DESC))){return $data;} // probably an attack
$compare_function = '';
if ($type == SORT_REGULAR)
{
if (TableSort::is_image_column($data, $column))
{
$type = SORT_IMAGE;
}
elseif (TableSort::is_date_column($data, $column))
{
$type = SORT_DATE;
}
elseif (TableSort::is_numeric_column($data, $column))
{
$type = SORT_NUMERIC;
}
else
{
$type = SORT_STRING;
}
}
switch ($type)
{
case SORT_REGULAR :
if (TableSort::is_image_column($data, $column))
{
return TableSort::sort_table($data, $column, $direction, SORT_IMAGE);
}
elseif (TableSort::is_date_column($data, $column))
{
return TableSort::sort_table($data, $column, $direction, SORT_DATE);
}
elseif (TableSort::is_numeric_column($data, $column))
{
return TableSort::sort_table($data, $column, $direction, SORT_NUMERIC);
}
return TableSort::sort_table($data, $column, $direction, SORT_STRING);
break;
case SORT_NUMERIC :
$compare_function = 'strip_tags($el1) > strip_tags($el2)';
break;
case SORT_IMAGE :
//$compare_function = 'strnatcmp(TableSort::orderingstring(strip_tags($el1,"<img>")),TableSort::orderingstring(strip_tags($el2,"<img>"))) > 0';
$compare_function = 'strcmp(TableSort::orderingstring(strip_tags($el1,"<img>")),TableSort::orderingstring(strip_tags($el2,"<img>"))) > 0';
////$compare_function = 'strnatcmp(TableSort::orderingstring(strip_tags($el1,"<img>")),TableSort::orderingstring(strip_tags($el2,"<img>"))) > 0';
//$compare_function = 'strcmp(TableSort::orderingstring(strip_tags($el1,"<img>")),TableSort::orderingstring(strip_tags($el2,"<img>"))) > 0';
$compare_function = 'api_strcmp(TableSort::orderingstring(strip_tags($el1,"<img>")),TableSort::orderingstring(strip_tags($el2,"<img>"))) > 0';
break;
case SORT_DATE :
$compare_function = 'strtotime(strip_tags($el1)) > strtotime(strip_tags($el2))';
break;
case SORT_STRING :
default:
//$compare_function = 'strnatcmp(TableSort::orderingstring(strip_tags($el1)),TableSort::orderingstring(strip_tags($el2))) > 0';
$compare_function = 'strcmp(TableSort::orderingstring(strip_tags($el1)),TableSort::orderingstring(strip_tags($el2))) > 0';
////$compare_function = 'strnatcmp(TableSort::orderingstring(strip_tags($el1)),TableSort::orderingstring(strip_tags($el2))) > 0';
//$compare_function = 'strcmp(TableSort::orderingstring(strip_tags($el1)),TableSort::orderingstring(strip_tags($el2))) > 0';
$compare_function = 'api_strcmp(TableSort::orderingstring(strip_tags($el1)),TableSort::orderingstring(strip_tags($el2))) > 0';
break;
}
$function_body = '$el1 = $a['.$column.']; $el2 = $b['.$column.']; return ('.$direction.' == SORT_ASC ? ('.$compare_function.') : !('.$compare_function.'));';

@ -89,9 +89,9 @@ function sort_users($a,$b){
$a = trim(api_strtolower($a[$_SESSION['tracking_column']]));
$b = trim(api_strtolower($b[$_SESSION['tracking_column']]));
if($_SESSION['tracking_direction'] == 'DESC')
return strcmp($b, $a);
return api_strcmp($b, $a);
else
return strcmp($a, $b);
return api_strcmp($a, $b);
}

@ -128,9 +128,9 @@ function sort_users($a,$b) {
$a = trim(api_strtolower($a[$_SESSION['tracking_column']]));
$b = trim(api_strtolower($b[$_SESSION['tracking_column']]));
if ($_SESSION['tracking_direction'] == 'DESC') {
return strcmp($b, $a);
return api_strcmp($b, $a);
} else {
return strcmp($a, $b);
return api_strcmp($a, $b);
}
}

Loading…
Cancel
Save