mb_strimwidth(): Add support for negative 'start' and 'width'

This commit is contained in:
Francois Laupretre 2016-01-03 13:47:20 +01:00 committed by Nikita Popov
parent e30060da15
commit 70187267b4
2 changed files with 39 additions and 13 deletions

View File

@ -3053,7 +3053,7 @@ PHP_FUNCTION(mb_strwidth)
PHP_FUNCTION(mb_strimwidth)
{
char *str, *trimmarker = NULL, *encoding = NULL;
zend_long from, width;
zend_long from, width, swidth;
size_t str_len, trimmarker_len, encoding_len;
mbfl_string string, result, marker, *ret;
@ -3081,13 +3081,25 @@ PHP_FUNCTION(mb_strimwidth)
string.val = (unsigned char *)str;
string.len = str_len;
if ((from < 0) || (width < 0)) {
swidth = mbfl_strwidth(&string);
}
if (from < 0) {
from += swidth;
}
if (from < 0 || (size_t)from > str_len) {
php_error_docref(NULL, E_WARNING, "Start position is out of range");
RETURN_FALSE;
}
if (width < 0) {
php_error_docref(NULL, E_WARNING, "Width is negative value");
width = swidth + width - from;
}
if (width < 0) {
php_error_docref(NULL, E_WARNING, "Width is out of range");
RETURN_FALSE;
}

View File

@ -14,30 +14,44 @@ include_once('common.inc');
// EUC-JP
$euc_jp = '0123この文字列は日本語です。EUC-JPを使っています。日本語は面倒臭い。';
print "String width: ".mb_strwidth($euc_jp,'EUC-JP')."\n";
print "1: ". mb_strimwidth($euc_jp, 0, 15,'...','EUC-JP') . "\n";
print "2: ". mb_strimwidth($euc_jp, 0, 100,'...','EUC-JP') . "\n";
print "3: ". mb_strimwidth($euc_jp, 15, 100,'...','EUC-JP') . "\n";
// Note: Did not start form -22 offset. Staring from 0.
$str = mb_strimwidth($euc_jp,-22, 100,'...','EUC-JP');
($str === FALSE) ? print "4 OK\n" : print "NG: $str\n";
print "4: ". mb_strimwidth($euc_jp, -30, 5,'...','EUC-JP') . "\n";
print "5: ". mb_strimwidth($euc_jp, 38, 5,'...','EUC-JP') . "\n";
print "6: ". mb_strimwidth($euc_jp, 38, -25,'...','EUC-JP') . "\n";
print "7: ". mb_strimwidth($euc_jp, -30, -25,'...','EUC-JP') . "\n";
$str = mb_strimwidth($euc_jp, 100, -10,'...','EUC-JP');
($str === FALSE) ? print "5 OK\n" : print "NG: $str\n";
$str = mb_strimwidth($euc_jp, 0, -100,'...','EUC-JP');
($str === FALSE) ? print "10 OK\n" : print "NG: $str\n";
$str = mb_strimwidth($euc_jp, 100, 10,'...','EUC-JP');
($str === FALSE) ? print "11 OK\n" : print "NG: $str\n";
$str = mb_strimwidth($euc_jp, -100, 10,'...','EUC-JP');
($str === FALSE) ? print "6 OK\n" : print "NG: $str\n";
($str === FALSE) ? print "12 OK\n" : print "NG: $str\n";
$str = mb_strimwidth($euc_jp, -10, -12,'...','EUC-JP');
($str === FALSE) ? print "13 OK\n" : print "NG: $str\n";
?>
--EXPECT--
String width: 68
1: 0123この文字...
2: 0123この文字列は日本語です。EUC-JPを使っています。日本語は面倒臭い。
3: 。EUC-JPを使っています。日本語は面倒臭い。
4: ¡£
5: ¡£
6: ¡£
7: ¡£
ERR: Warning
4 OK
10 OK
ERR: Warning
5 OK
11 OK
ERR: Warning
6 OK
12 OK
ERR: Warning
13 OK