From 0e70946d23660c4814db46cd3f89cb8340e51336 Mon Sep 17 00:00:00 2001
From: chris <chris@jalakai.co.uk>
Date: Thu, 31 Aug 2006 11:21:46 +0200
Subject: [PATCH] add unittests for bug#891

darcs-hash:20060831092146-9b6ab-b00aa29c982ab18117f476b3d01d5111915c9d4b.gz
---
 _test/cases/inc/utf8_substr.test.php | 13 +++++++++++++
 inc/fulltext.php                     |  5 ++---
 2 files changed, 15 insertions(+), 3 deletions(-)

diff --git a/_test/cases/inc/utf8_substr.test.php b/_test/cases/inc/utf8_substr.test.php
index 92bc65fe3..5cb93034a 100644
--- a/_test/cases/inc/utf8_substr.test.php
+++ b/_test/cases/inc/utf8_substr.test.php
@@ -26,5 +26,18 @@ class utf8_substr_test extends UnitTestCase {
         }
     }
 
+    function test2_bug891() {
+        // we test multiple cases here - format: in, offset, length, out
+        $tests   = array();
+
+        $str = str_pad('',strlen('в')*66000,'в').'@@';
+        $tests[] = array($str, 65600, 1, 'в');
+        $tests[] = array($str,0,66000,$str);
+
+        foreach($tests as $test){
+            $this->assertEqual(utf8_substr($test[0],$test[1],$test[2]),$test[3]);
+        }
+    }
+
 }
 //Setup VIM: ex: et ts=4 enc=utf-8 :
diff --git a/inc/fulltext.php b/inc/fulltext.php
index fa3ec05d2..280ba0c89 100644
--- a/inc/fulltext.php
+++ b/inc/fulltext.php
@@ -333,7 +333,6 @@ switch ($algorithm) {
       // establish context, 100 bytes surrounding the match string
       // first look to see if we can go 100 either side,
       // then drop to 50 adding any excess if the other side can't go to 50,
-      // NOTE: these are byte adjustments and will have to be corrected for utf-8
         $pre = min($utf8_idx-$utf8_offset,100);
         $post = min($len-$utf8_idx-$utf8_len,100);
 
@@ -371,9 +370,9 @@ switch ($algorithm) {
       } else {
         // code for strings too large for utf8_substr
         // use a larger context number as its bytes not characters
-        $pre = 70;
+        // no need to check for short pre, $idx is nearly 64k
         $post = min(strlen($text)-$idx-strlen($str), 70);
-        if ($post < 70) { $pre = 70 - $post; }
+        $pre = ($post < 70) ?  140 - $post : 70;
 
         $start = utf8_correctIdx($text,$idx - $pre);
         $end = utf8_correctIdx($text, $idx + strlen($str) + $post);
-- 
GitLab