From 3d0d5dbd0f35c47b21e2e574703a08f07ce677dd Mon Sep 17 00:00:00 2001
From: Aleksander Machniak <alec@alec.pl>
Date: Sun, 08 May 2016 08:27:56 -0400
Subject: [PATCH] Performance improvements in format_flowed() and unfold_flowed()

---
 program/lib/Roundcube/rcube_mime.php |   37 +++++++++++++++++++------------------
 1 files changed, 19 insertions(+), 18 deletions(-)

diff --git a/program/lib/Roundcube/rcube_mime.php b/program/lib/Roundcube/rcube_mime.php
index 56406b1..c951e5c 100644
--- a/program/lib/Roundcube/rcube_mime.php
+++ b/program/lib/Roundcube/rcube_mime.php
@@ -3,8 +3,8 @@
 /**
  +-----------------------------------------------------------------------+
  | This file is part of the Roundcube Webmail client                     |
- | Copyright (C) 2005-2014, The Roundcube Dev Team                       |
- | Copyright (C) 2011-2014, Kolab Systems AG                             |
+ | Copyright (C) 2005-2016, The Roundcube Dev Team                       |
+ | Copyright (C) 2011-2016, Kolab Systems AG                             |
  |                                                                       |
  | Licensed under the GNU General Public License version 3 or            |
  | any later version with exceptions for skins & plugins.                |
@@ -101,8 +101,9 @@
         // Special chars as defined by RFC 822 need to in quoted string (or escaped).
         $special_chars = '[\(\)\<\>\\\.\[\]@,;:"]';
 
-        if (!is_array($a))
+        if (!is_array($a)) {
             return $out;
+        }
 
         foreach ($a as $val) {
             $j++;
@@ -273,16 +274,17 @@
     public static function parse_headers($headers)
     {
         $a_headers = array();
-        $headers = preg_replace('/\r?\n(\t| )+/', ' ', $headers);
-        $lines = explode("\n", $headers);
-        $c = count($lines);
+        $headers   = preg_replace('/\r?\n(\t| )+/', ' ', $headers);
+        $lines     = explode("\n", $headers);
+        $count     = count($lines);
 
-        for ($i=0; $i<$c; $i++) {
+        for ($i=0; $i<$count; $i++) {
             if ($p = strpos($lines[$i], ': ')) {
                 $field = strtolower(substr($lines[$i], 0, $p));
                 $value = trim(substr($lines[$i], $p+1));
-                if (!empty($value))
+                if (!empty($value)) {
                     $a_headers[$field] = $value;
+                }
             }
         }
 
@@ -448,12 +450,11 @@
         $marks   = array();
 
         foreach ($text as $idx => $line) {
-            if (preg_match('/^(>+)/', $line, $m)) {
+            if ($q = strspn($line, '>')) {
                 // remove quote chars
-                $q    = strlen($m[1]);
-                $line = preg_replace('/^>+/', '', $line);
+                $line = substr($line, $q);
                 // remove (optional) space-staffing
-                $line = preg_replace('/^ /', '', $line);
+                if ($line[0] === ' ') $line = substr($line, 1);
 
                 // The same paragraph (We join current line with the previous one) when:
                 // - the same level of quoting
@@ -475,13 +476,12 @@
                 }
             }
             else {
-                $q = 0;
                 if ($line == '-- ') {
                     $last = $idx;
                 }
                 else {
                     // remove space-stuffing
-                    $line = preg_replace('/^ /', '', $line);
+                    if ($line[0] === ' ') $line = substr($line, 1);
 
                     if (isset($text[$last]) && $line && !$q_level
                         && $text[$last] != '-- '
@@ -527,12 +527,13 @@
 
         foreach ($text as $idx => $line) {
             if ($line != '-- ') {
-                if (preg_match('/^(>+)/', $line, $m)) {
+                if ($level = strspn($line, '>')) {
                     // remove quote chars
-                    $level  = strlen($m[1]);
-                    $line   = preg_replace('/^>+/', '', $line);
+                    $line = substr($line, $level);
                     // remove (optional) space-staffing and spaces before the line end
-                    $line   = preg_replace('/(^ | +$)/', '', $line);
+                    $line = rtrim($line, ' ');
+                    if ($line[0] === ' ') $line = substr($line, 1);
+
                     $prefix = str_repeat('>', $level) . ' ';
                     $line   = $prefix . self::wordwrap($line, $length - $level - 2, " \r\n$prefix", false, $charset);
                 }

--
Gitblit v1.9.1