mirror of
https://github.com/php/php-src.git
synced 2024-11-24 18:34:21 +08:00
mb_strimwidth(): Add support for negative 'start' and 'width'
This commit is contained in:
parent
e30060da15
commit
70187267b4
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user