]> granicus.if.org Git - php/commitdiff
mb_strimwidth(): Add support for negative 'start' and 'width'
authorFrancois Laupretre <francois@tekwire.net>
Sun, 3 Jan 2016 12:47:20 +0000 (13:47 +0100)
committerNikita Popov <nikic@php.net>
Wed, 9 Mar 2016 13:41:38 +0000 (14:41 +0100)
ext/mbstring/mbstring.c
ext/mbstring/tests/mb_strimwidth.phpt

index 9968a1dc5182a10da573ecdee4eac78b200c3ca5..aba1607a6d253873cb12e4c107f9f0fa624dc07b 100644 (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;
        }
 
index 82780d6756f2a476abb87b0babeff1613683bec5..f257604c6b6aaffe10e016868423a33e92b856a2 100644 (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, 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 "5 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