Aleksander Machniak
2013-05-30 f031cb6c5e4fd3dcb7ea243d477825868d8ad17b
Fix performance regression in text wrapping function (#1489133) - don't use iconv here
2 files modified
53 ■■■■ changed files
CHANGELOG 1 ●●●● patch | view | raw | blame | history
program/lib/Roundcube/rcube_mime.php 52 ●●●● patch | view | raw | blame | history
CHANGELOG
@@ -1,6 +1,7 @@
CHANGELOG Roundcube Webmail
===========================
- Fix performance regression in text wrapping function (#1489133)
- Fix connection to posgtres db using unix socket (#1489132)
- Fix handling of comma when adding contact from contacts widget (#1489107)
- Fix bug where a message was opened in both preview pane and new window on double-click (#1489122)
program/lib/Roundcube/rcube_mime.php
@@ -587,23 +587,20 @@
     */
    public static function wordwrap($string, $width=75, $break="\n", $cut=false, $charset=null, $wrap_quoted=true)
    {
        if (!$charset) {
            $charset = RCUBE_CHARSET;
        }
        // Note: Never try to use iconv instead of mbstring functions here
        //       Iconv's substr/strlen are 100x slower (#1489113)
        // detect available functions
        $strlen_func  = function_exists('iconv_strlen') ? 'iconv_strlen' : 'mb_strlen';
        $strpos_func  = function_exists('iconv_strpos') ? 'iconv_strpos' : 'mb_strpos';
        $strrpos_func = function_exists('iconv_strrpos') ? 'iconv_strrpos' : 'mb_strrpos';
        $substr_func  = function_exists('iconv_substr') ? 'iconv_substr' : 'mb_substr';
        if ($charset && $charset != RCUBE_CHARSET && function_exists('mb_internal_encoding')) {
            mb_internal_encoding($charset);
        }
        // Convert \r\n to \n, this is our line-separator
        $string       = str_replace("\r\n", "\n", $string);
        $separator    = "\n"; // must be 1 character length
        $result       = array();
        while (($stringLength = $strlen_func($string, $charset)) > 0) {
            $breakPos = $strpos_func($string, $separator, 0, $charset);
        while (($stringLength = mb_strlen($string)) > 0) {
            $breakPos = mb_strpos($string, $separator, 0);
            // quoted line (do not wrap)
            if ($wrap_quoted && $string[0] == '>') {
@@ -612,7 +609,7 @@
                    $cutLength = null;
                }
                else {
                    $subString = $substr_func($string, 0, $breakPos, $charset);
                    $subString = mb_substr($string, 0, $breakPos);
                    $cutLength = $breakPos + 1;
                }
            }
@@ -623,39 +620,34 @@
                    $cutLength = null;
                }
                else {
                    $subString = $substr_func($string, 0, $breakPos, $charset);
                    $subString = mb_substr($string, 0, $breakPos);
                    $cutLength = $breakPos + 1;
                }
            }
            else {
                $subString = $substr_func($string, 0, $width, $charset);
                $subString = mb_substr($string, 0, $width);
                // last line
                if ($breakPos === false && $subString === $string) {
                    $cutLength = null;
                }
                else {
                    $nextChar = $substr_func($string, $width, 1, $charset);
                    $nextChar = mb_substr($string, $width, 1);
                    if ($nextChar === ' ' || $nextChar === $separator) {
                        $afterNextChar = $substr_func($string, $width + 1, 1, $charset);
                        $afterNextChar = mb_substr($string, $width + 1, 1);
                        if ($afterNextChar === false) {
                            $subString .= $nextChar;
                        }
                        $cutLength = $strlen_func($subString, $charset) + 1;
                        $cutLength = mb_strlen($subString) + 1;
                    }
                    else {
                        if ($strrpos_func[0] == 'm') {
                            $spacePos = $strrpos_func($subString, ' ', 0, $charset);
                        }
                        else {
                            $spacePos = $strrpos_func($subString, ' ', $charset);
                        }
                        $spacePos = mb_strrpos($subString, ' ', 0);
                        if ($spacePos !== false) {
                            $subString = $substr_func($subString, 0, $spacePos, $charset);
                            $subString = mb_substr($subString, 0, $spacePos);
                            $cutLength = $spacePos + 1;
                        }
                        else if ($cut === false && $breakPos === false) {
@@ -663,19 +655,19 @@
                            $cutLength = null;
                        }
                        else if ($cut === false) {
                            $spacePos = $strpos_func($string, ' ', 0, $charset);
                            $spacePos = mb_strpos($string, ' ', 0);
                            if ($spacePos !== false && $spacePos < $breakPos) {
                                $subString = $substr_func($string, 0, $spacePos, $charset);
                                $subString = mb_substr($string, 0, $spacePos);
                                $cutLength = $spacePos + 1;
                            }
                            else {
                                $subString = $substr_func($string, 0, $breakPos, $charset);
                                $subString = mb_substr($string, 0, $breakPos);
                                $cutLength = $breakPos + 1;
                            }
                        }
                        else {
                            $subString = $substr_func($subString, 0, $width, $charset);
                            $subString = mb_substr($subString, 0, $width);
                            $cutLength = $width;
                        }
                    }
@@ -685,13 +677,17 @@
            $result[] = $subString;
            if ($cutLength !== null) {
                $string = $substr_func($string, $cutLength, ($stringLength - $cutLength), $charset);
                $string = mb_substr($string, $cutLength, ($stringLength - $cutLength));
            }
            else {
                break;
            }
        }
        if ($charset && $charset != RCUBE_CHARSET && function_exists('mb_internal_encoding')) {
            mb_internal_encoding(RCUBE_CHARSET);
        }
        return implode($break, $result);
    }