aboutsummaryrefslogtreecommitdiffstats
path: root/phpBB/includes/diff
diff options
context:
space:
mode:
authorMeik Sievertsen <acydburn@phpbb.com>2008-07-28 13:37:16 +0000
committerMeik Sievertsen <acydburn@phpbb.com>2008-07-28 13:37:16 +0000
commit1b67e804224a4477031da03ff5108c621cf6d13b (patch)
tree4d6fc01dc442b7d0caaa0e38ac7a96cc5a597101 /phpBB/includes/diff
parentd8f2c4a1c4468440cf6c8657891e179bf7d222f5 (diff)
downloadforums-1b67e804224a4477031da03ff5108c621cf6d13b.tar
forums-1b67e804224a4477031da03ff5108c621cf6d13b.tar.gz
forums-1b67e804224a4477031da03ff5108c621cf6d13b.tar.bz2
forums-1b67e804224a4477031da03ff5108c621cf6d13b.tar.xz
forums-1b67e804224a4477031da03ff5108c621cf6d13b.zip
marge
git-svn-id: file:///svn/phpbb/trunk@8696 89ea8834-ac86-4346-8a33-228a782c2dd0
Diffstat (limited to 'phpBB/includes/diff')
-rw-r--r--phpBB/includes/diff/diff.php19
-rw-r--r--phpBB/includes/diff/engine.php20
-rw-r--r--phpBB/includes/diff/renderer.php28
3 files changed, 46 insertions, 21 deletions
diff --git a/phpBB/includes/diff/diff.php b/phpBB/includes/diff/diff.php
index 801480df95..487384ff8a 100644
--- a/phpBB/includes/diff/diff.php
+++ b/phpBB/includes/diff/diff.php
@@ -17,7 +17,7 @@ if (!defined('IN_PHPBB'))
}
/**
-* Code from pear.php.net, Text_Diff-0.2.1 (beta) package
+* Code from pear.php.net, Text_Diff-1.0.0 package
* http://pear.php.net/package/Text_Diff/
*
* Modified by phpBB Group to meet our coding standards
@@ -26,6 +26,9 @@ if (!defined('IN_PHPBB'))
* General API for generating and formatting diffs - the differences between
* two sequences of strings.
*
+* Copyright 2004 Geoffrey T. Dairiki <dairiki@dairiki.org>
+* Copyright 2004-2008 The Horde Project (http://www.horde.org/)
+*
* @package diff
* @author Geoffrey T. Dairiki <dairiki@dairiki.org>
*/
@@ -45,7 +48,7 @@ class diff
*/
function __construct(&$from_content, &$to_content, $preserve_cr = true)
{
- $diff_engine = &new diff_engine();
+ $diff_engine = new diff_engine();
$this->_edits = $diff_engine->diff($from_content, $to_content, $preserve_cr);
}
@@ -62,7 +65,7 @@ class diff
*
* Example:
* <code>
- * $diff = &new diff($lines1, $lines2);
+ * $diff = new diff($lines1, $lines2);
* $rev = $diff->reverse();
* </code>
*
@@ -285,7 +288,7 @@ class diff_op
var $orig;
var $final;
- function reverse()
+ function &reverse()
{
trigger_error('[diff] Abstract method', E_USER_ERROR);
}
@@ -413,7 +416,7 @@ class diff3 extends diff
*/
function diff3(&$orig, &$final1, &$final2)
{
- $diff_engine = &new diff_engine();
+ $diff_engine = new diff_engine();
$diff_1 = $diff_engine->diff($orig, $final1);
$diff_2 = $diff_engine->diff($orig, $final2);
@@ -548,7 +551,7 @@ class diff3 extends diff
function _diff3(&$edits1, &$edits2)
{
$edits = array();
- $bb = &new diff3_block_builder();
+ $bb = new diff3_block_builder();
$e1 = current($edits1);
$e2 = current($edits2);
@@ -565,7 +568,7 @@ class diff3 extends diff
}
$ncopy = min($e1->norig(), $e2->norig());
- $edits[] = &new diff3_op_copy(array_slice($e1->orig, 0, $ncopy));
+ $edits[] = new diff3_op_copy(array_slice($e1->orig, 0, $ncopy));
if ($e1->norig() > $ncopy)
{
@@ -759,7 +762,7 @@ class diff3_block_builder
}
else
{
- $edit = &new diff3_op($this->orig, $this->final1, $this->final2);
+ $edit = new diff3_op($this->orig, $this->final1, $this->final2);
$this->_init();
return $edit;
}
diff --git a/phpBB/includes/diff/engine.php b/phpBB/includes/diff/engine.php
index 576839ea60..ebf1469d67 100644
--- a/phpBB/includes/diff/engine.php
+++ b/phpBB/includes/diff/engine.php
@@ -17,21 +17,20 @@ if (!defined('IN_PHPBB'))
}
/**
-* Code from pear.php.net, Text_Diff-0.2.1 (beta) package
-* http://pear.php.net/package/Text_Diff/
+* Code from pear.php.net, Text_Diff-1.0.0 package
+* http://pear.php.net/package/Text_Diff/ (native engine)
*
* Modified by phpBB Group to meet our coding standards
* and being able to integrate into phpBB
*
-* Class used internally by Diff to actually compute the diffs. This class is
-* implemented using native PHP code.
+* Class used internally by Text_Diff to actually compute the diffs. This
+* class is implemented using native PHP code.
*
* The algorithm used here is mostly lifted from the perl module
* Algorithm::Diff (version 1.06) by Ned Konz, which is available at:
* http://www.perl.com/CPAN/authors/id/N/NE/NEDKONZ/Algorithm-Diff-1.06.zip
*
-* More ideas are taken from:
-* http://www.ics.uci.edu/~eppstein/161/960229.html
+* More ideas are taken from: http://www.ics.uci.edu/~eppstein/161/960229.html
*
* Some ideas (and a bit of code) are taken from analyze.c, of GNU
* diffutils-2.7, which can be found at:
@@ -41,6 +40,8 @@ if (!defined('IN_PHPBB'))
* Geoffrey T. Dairiki <dairiki@dairiki.org>. The original PHP version of this
* code was written by him, and is used/adapted with his permission.
*
+* Copyright 2004-2008 The Horde Project (http://www.horde.org/)
+*
* @author Geoffrey T. Dairiki <dairiki@dairiki.org>
* @package diff
*
@@ -251,7 +252,7 @@ class diff_engine
}
}
- $x1 = $xoff + (int)(($numer + ($xlim-$xoff)*$chunk) / $nchunks);
+ $x1 = $xoff + (int)(($numer + ($xlim - $xoff) * $chunk) / $nchunks);
for (; $x < $x1; $x++)
{
@@ -262,7 +263,8 @@ class diff_engine
}
$matches = $ymatches[$line];
- foreach ($matches as $y)
+ reset($matches);
+ while (list(, $y) = each($matches))
{
if (empty($this->in_seq[$y]))
{
@@ -273,7 +275,7 @@ class diff_engine
}
// no reset() here
- while (list($junk, $y) = each($matches))
+ while (list(, $y) = each($matches))
{
if ($y > $this->seq[$k - 1])
{
diff --git a/phpBB/includes/diff/renderer.php b/phpBB/includes/diff/renderer.php
index 7d5cd9e5d3..1fc5320db9 100644
--- a/phpBB/includes/diff/renderer.php
+++ b/phpBB/includes/diff/renderer.php
@@ -17,7 +17,7 @@ if (!defined('IN_PHPBB'))
}
/**
-* Code from pear.php.net, Text_Diff-0.2.1 (beta) package
+* Code from pear.php.net, Text_Diff-1.0.0 package
* http://pear.php.net/package/Text_Diff/
*
* Modified by phpBB Group to meet our coding standards
@@ -28,6 +28,8 @@ if (!defined('IN_PHPBB'))
* This class renders the diff in classic diff format. It is intended that
* this class be customized via inheritance, to obtain fancier outputs.
*
+* Copyright 2004-2008 The Horde Project (http://www.horde.org/)
+*
* @package diff
*/
class diff_renderer
@@ -105,7 +107,7 @@ class diff_renderer
unset($diff3);
- $diff = &new diff($diff_1, $diff_2);
+ $diff = new diff($diff_1, $diff_2);
}
$nlead = $this->_leading_context_lines;
@@ -116,19 +118,24 @@ class diff_renderer
foreach ($diffs as $i => $edit)
{
+ // If these are unchanged (copied) lines, and we want to keep leading or trailing context lines, extract them from the copy block.
if (is_a($edit, 'diff_op_copy'))
{
+ // Do we have any diff blocks yet?
if (is_array($block))
{
+ // How many lines to keep as context from the copy block.
$keep = ($i == sizeof($diffs) - 1) ? $ntrail : $nlead + $ntrail;
if (sizeof($edit->orig) <= $keep)
{
+ // We have less lines in the block than we want for context => keep the whole block.
$block[] = $edit;
}
else
{
if ($ntrail)
{
+ // Create a new block with as many lines as we need for the trailing context.
$context = array_slice($edit->orig, 0, $ntrail);
$block[] = &new diff_op_copy($context);
}
@@ -137,12 +144,15 @@ class diff_renderer
$block = false;
}
}
+ // Keep the copy block as the context for the next block.
$context = $edit->orig;
}
else
{
+ // Don't we have any diff blocks yet?
if (!is_array($block))
{
+ // Extract context lines from the preceding copy block.
$context = array_slice($context, sizeof($context) - $nlead);
$x0 = $xi - sizeof($context);
$y0 = $yi - sizeof($context);
@@ -219,6 +229,16 @@ class diff_renderer
$ybeg .= ',' . ($ybeg + $ylen - 1);
}
+ // this matches the GNU Diff behaviour
+ if ($xlen && !$ylen)
+ {
+ $ybeg--;
+ }
+ else if (!$xlen)
+ {
+ $xbeg--;
+ }
+
return $xbeg . ($xlen ? ($ylen ? 'c' : 'd') : 'a') . $ybeg;
}
@@ -449,11 +469,11 @@ class diff_renderer_inline extends diff_renderer
$splitted_text_1 = $this->_split_on_words($text1, $nl);
$splitted_text_2 = $this->_split_on_words($text2, $nl);
- $diff = &new diff($splitted_text_1, $splitted_text_2);
+ $diff = new diff($splitted_text_1, $splitted_text_2);
unset($splitted_text_1, $splitted_text_2);
// Get the diff in inline format.
- $renderer = &new diff_renderer_inline(array_merge($this->get_params(), array('split_level' => 'words')));
+ $renderer = new diff_renderer_inline(array_merge($this->get_params(), array('split_level' => 'words')));
// Run the diff and get the output.
return str_replace($nl, "\n", $renderer->render($diff)) . "\n";