| line | stmt | bran | cond | sub | pod | time | code | 
| 1 |  |  |  |  |  |  | ;# Usage: &look(*FILEHANDLE,$key,$dict,$fold) | 
| 2 |  |  |  |  |  |  | # | 
| 3 |  |  |  |  |  |  | # This library is no longer being maintained, and is included for backward | 
| 4 |  |  |  |  |  |  | # compatibility with Perl 4 programs which may require it. | 
| 5 |  |  |  |  |  |  | # | 
| 6 |  |  |  |  |  |  | # In particular, this should not be used as an example of modern Perl | 
| 7 |  |  |  |  |  |  | # programming techniques. | 
| 8 |  |  |  |  |  |  | # | 
| 9 |  |  |  |  |  |  | ;# Sets file position in FILEHANDLE to be first line greater than or equal | 
| 10 |  |  |  |  |  |  | ;# (stringwise) to $key.  Pass flags for dictionary order and case folding. | 
| 11 |  |  |  |  |  |  |  | 
| 12 |  |  |  |  |  |  | sub look { | 
| 13 | 0 |  |  | 0 |  |  | local(*FH,$key,$dict,$fold) = @_; | 
| 14 | 0 |  |  |  |  |  | local($max,$min,$mid,$_); | 
| 15 | 0 |  |  |  |  |  | local($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime, | 
| 16 |  |  |  |  |  |  | $blksize,$blocks) = stat(FH); | 
| 17 | 0 | 0 |  |  |  |  | $blksize = 8192 unless $blksize; | 
| 18 | 0 | 0 |  |  |  |  | $key =~ s/[^\w\s]//g if $dict; | 
| 19 | 0 | 0 |  |  |  |  | $key = lc $key if $fold; | 
| 20 | 0 |  |  |  |  |  | $max = int($size / $blksize); | 
| 21 | 0 |  |  |  |  |  | while ($max - $min > 1) { | 
| 22 | 0 |  |  |  |  |  | $mid = int(($max + $min) / 2); | 
| 23 | 0 |  |  |  |  |  | seek(FH,$mid * $blksize,0); | 
| 24 | 0 | 0 |  |  |  |  | $_ =  if $mid;		# probably a partial line | 
| 25 | 0 |  |  |  |  |  | $_ = ; | 
| 26 | 0 |  |  |  |  |  | chop; | 
| 27 | 0 | 0 |  |  |  |  | s/[^\w\s]//g if $dict; | 
| 28 | 0 | 0 |  |  |  |  | $_ = lc $_ if $fold; | 
| 29 | 0 | 0 |  |  |  |  | if ($_ lt $key) { | 
| 30 | 0 |  |  |  |  |  | $min = $mid; | 
| 31 |  |  |  |  |  |  | } | 
| 32 |  |  |  |  |  |  | else { | 
| 33 | 0 |  |  |  |  |  | $max = $mid; | 
| 34 |  |  |  |  |  |  | } | 
| 35 |  |  |  |  |  |  | } | 
| 36 | 0 |  |  |  |  |  | $min *= $blksize; | 
| 37 | 0 |  |  |  |  |  | seek(FH,$min,0); | 
| 38 | 0 | 0 |  |  |  |  | if $min; | 
| 39 | 0 |  |  |  |  |  | while () { | 
| 40 | 0 |  |  |  |  |  | chop; | 
| 41 | 0 | 0 |  |  |  |  | s/[^\w\s]//g if $dict; | 
| 42 | 0 | 0 |  |  |  |  | $_ = lc $_ if $fold; | 
| 43 | 0 | 0 |  |  |  |  | last if $_ ge $key; | 
| 44 | 0 |  |  |  |  |  | $min = tell(FH); | 
| 45 |  |  |  |  |  |  | } | 
| 46 | 0 |  |  |  |  |  | seek(FH,$min,0); | 
| 47 | 0 |  |  |  |  |  | $min; | 
| 48 |  |  |  |  |  |  | } | 
| 49 |  |  |  |  |  |  |  | 
| 50 |  |  |  |  |  |  | 1; |