|
5 | 5 | * PHP version 5 |
6 | 6 | * |
7 | 7 | * Copyright (c) 2009 Chris Boulton <chris.boulton@interspire.com> |
8 | | - * |
| 8 | + * |
9 | 9 | * All rights reserved. |
10 | | - * |
11 | | - * Redistribution and use in source and binary forms, with or without |
| 10 | + * |
| 11 | + * Redistribution and use in source and binary forms, with or without |
12 | 12 | * modification, are permitted provided that the following conditions are met: |
13 | 13 | * |
14 | 14 | * - Redistributions of source code must retain the above copyright notice, |
15 | 15 | * this list of conditions and the following disclaimer. |
16 | 16 | * - Redistributions in binary form must reproduce the above copyright notice, |
17 | 17 | * this list of conditions and the following disclaimer in the documentation |
18 | 18 | * and/or other materials provided with the distribution. |
19 | | - * - Neither the name of the Chris Boulton nor the names of its contributors |
20 | | - * may be used to endorse or promote products derived from this software |
| 19 | + * - Neither the name of the Chris Boulton nor the names of its contributors |
| 20 | + * may be used to endorse or promote products derived from this software |
21 | 21 | * without specific prior written permission. |
22 | 22 | * |
23 | | - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
24 | | - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
25 | | - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
26 | | - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE |
27 | | - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
28 | | - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
29 | | - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
30 | | - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
31 | | - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
32 | | - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
| 23 | + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
| 24 | + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
| 25 | + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
| 26 | + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE |
| 27 | + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
| 28 | + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
| 29 | + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
| 30 | + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
| 31 | + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
| 32 | + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
33 | 33 | * POSSIBILITY OF SUCH DAMAGE. |
34 | 34 | * |
35 | 35 | * @package DiffLib |
@@ -82,12 +82,18 @@ public function render() |
82 | 82 |
|
83 | 83 | list($start, $end) = $this->getChangeExtent($fromLine, $toLine); |
84 | 84 | if($start != 0 || $end != 0) { |
85 | | - $last = $end + strlen($fromLine); |
86 | | - $fromLine = substr_replace($fromLine, "\0", $start, 0); |
87 | | - $fromLine = substr_replace($fromLine, "\1", $last + 1, 0); |
88 | | - $last = $end + strlen($toLine); |
89 | | - $toLine = substr_replace($toLine, "\0", $start, 0); |
90 | | - $toLine = substr_replace($toLine, "\1", $last + 1, 0); |
| 85 | + $realEnd = mb_strlen($fromLine) + $end; |
| 86 | + $fromLine = mb_substr($fromLine, 0, $start) |
| 87 | + . "\0" |
| 88 | + . mb_substr($fromLine, $start, $realEnd - $start) |
| 89 | + . "\1" |
| 90 | + . mb_substr($fromLine, $realEnd); |
| 91 | + $realEnd = mb_strlen($toLine) + $end; |
| 92 | + $toLine = mb_substr($toLine, 0, $start) |
| 93 | + . "\0" |
| 94 | + . mb_substr($toLine, $start, $realEnd - $start) |
| 95 | + . "\1" |
| 96 | + . mb_substr($toLine, $realEnd); |
91 | 97 | $a[$i1 + $i] = $fromLine; |
92 | 98 | $b[$j1 + $i] = $toLine; |
93 | 99 | } |
@@ -149,13 +155,13 @@ public function render() |
149 | 155 | private function getChangeExtent($fromLine, $toLine) |
150 | 156 | { |
151 | 157 | $start = 0; |
152 | | - $limit = min(strlen($fromLine), strlen($toLine)); |
153 | | - while($start < $limit && $fromLine{$start} == $toLine{$start}) { |
| 158 | + $limit = min(mb_strlen($fromLine), mb_strlen($toLine)); |
| 159 | + while($start < $limit && mb_substr($fromLine, $start, 1) == mb_substr($toLine, $start, 1)) { |
154 | 160 | ++$start; |
155 | 161 | } |
156 | 162 | $end = -1; |
157 | 163 | $limit = $limit - $start; |
158 | | - while(-$end <= $limit && substr($fromLine, $end, 1) == substr($toLine, $end, 1)) { |
| 164 | + while(-$end <= $limit && mb_substr($fromLine, $end, 1) == mb_substr($toLine, $end, 1)) { |
159 | 165 | --$end; |
160 | 166 | } |
161 | 167 | return array( |
|
0 commit comments