This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Fix C<print $_> in debugger
[perl5.git] / lib / look.pl
index ebbaa73..e8dc8aa 100644 (file)
@@ -4,24 +4,22 @@
 ;# (stringwise) to $key.  Pass flags for dictionary order and case folding.
 
 sub look {
-    local(*FH,$key,$fold) = @_;
+    local(*FH,$key,$dict,$fold) = @_;
     local($max,$min,$mid,$_);
     local($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,
        $blksize,$blocks) = stat(FH);
     $blksize = 8192 unless $blksize;
     $key =~ s/[^\w\s]//g if $dict;
-    $key =~ y/A-Z/a-z/ if $fold;
-    $max = $size + $blksize - 1;
-    $max -= $size % $blksize;
-    while ($max - $min > $blksize) {
-       $mid = ($max + $min) / 2;
-       die "look: internal error"  if $mid % $blksize;
-       seek(FH,$mid,0);
-       $_ = <FH>;              # probably a partial line
+    $key = lc $key if $fold;
+    $max = int($size / $blksize);
+    while ($max - $min > 1) {
+       $mid = int(($max + $min) / 2);
+       seek(FH,$mid * $blksize,0);
+       $_ = <FH> if $mid;              # probably a partial line
        $_ = <FH>;
        chop;
        s/[^\w\s]//g if $dict;
-       y/A-Z/a-z/ if $fold;
+       $_ = lc $_ if $fold;
        if ($_ lt $key) {
            $min = $mid;
        }
@@ -29,11 +27,13 @@ sub look {
            $max = $mid;
        }
     }
+    $min *= $blksize;
     seek(FH,$min,0);
+    <FH> if $min;
     while (<FH>) {
        chop;
        s/[^\w\s]//g if $dict;
-       y/A-Z/a-z/ if $fold;
+       $_ = lc $_ if $fold;
        last if $_ ge $key;
        $min = tell(FH);
     }