public function main($text1, $text2, $checklines = true, $deadline = null)
{
// Set a deadline by which time the diff must be complete.
if (!isset($deadline)) {
if ($this->getTimeout() <= 0) {
$deadline = PHP_INT_MAX;
} else {
$deadline = microtime(1) + $this->getTimeout();
}
}
if (!isset($text1, $text2)) {
throw new \InvalidArgumentException();
}
// Check for equality (speedup).
if ($text1 == $text2) {
if ($text1 != '') {
$this->setChanges(array(array(self::EQUAL, $text1)));
return $this;
}
return $this;
}
$prevInternalEncoding = mb_internal_encoding();
if ($prevInternalEncoding != 'UCS-2LE') {
mb_internal_encoding('UCS-2LE');
$text1 = iconv($prevInternalEncoding, 'UCS-2LE', $text1);
$text2 = iconv($prevInternalEncoding, 'UCS-2LE', $text2);
}
// Trim off common prefix (speedup).
$commonLength = $this->getToolkit()->commonPrefix($text1, $text2);
if ($commonLength == 0) {
$commonPrefix = '';
} else {
$commonPrefix = mb_substr($text1, 0, $commonLength);
$text1 = mb_substr($text1, $commonLength);
$text2 = mb_substr($text2, $commonLength);
}
// Trim off common suffix (speedup).
$commonLength = $this->getToolkit()->commonSuffix($text1, $text2);
if ($commonLength == 0) {
$commonSuffix = '';
} else {
$commonSuffix = mb_substr($text1, -$commonLength);
$text1 = mb_substr($text1, 0, -$commonLength);
$text2 = mb_substr($text2, 0, -$commonLength);
}
// Compute the diff on the middle block.
$diffs = $this->compute($text1, $text2, $checklines, $deadline);
// Restore the prefix and suffix.
if ($commonPrefix != '') {
array_unshift($diffs, array(self::EQUAL, $commonPrefix));
}
if ($commonSuffix != '') {
array_push($diffs, array(self::EQUAL, $commonSuffix));
}
if ($prevInternalEncoding != 'UCS-2LE') {
mb_internal_encoding($prevInternalEncoding);
foreach ($diffs as &$change) {
$change[1] = iconv('UCS-2LE', $prevInternalEncoding, $change[1]);
}
unset($change);
}
$this->setChanges($diffs);
$this->cleanupMerge();
return $this;
}