download this file: class.revfile.php view text/plain: class.revfile.php file encoding: UTF-8 [goback]
<?php
##
## reverse file reading by line
##
## -- san2@2012.11.10: new build
##
## example
##
## if(!$fp = rev::fopen($f,'r')) return;
## while(!rev::feof($fp)) echo rev::fgets($fp);
## rev::fclose($fp);
##
class rev
{
## file open and seek to EOF
##
function fopen($file, $mode)
{
if(!$fp = fopen($file,$mode)) return FALSE;
fseek($fp,0,SEEK_END); // seek to eof
return $fp;
}
## boolean file first of file pointer
##
function feof($fp)
{
return (ftell($fp) ? FALSE : TRUE); // first == TRUE
}
## fgets() and go to pre line
##
function fgets(&$fp)
{
$p0 = ftell($fp);
if($p0 <= 1)
{
rewind($fp);
$c = fgets($fp);
rewind($fp);
return $c;
}
$t = $p0 - 1;
fseek($fp,$t);
fgets($fp);
$p = ftell($fp);
if($t > 1)
{
while($p0 == $p)
{
$t = $t*2 - $p; // same as $ot-($p-$t) or strlen($c)*-2
if($t <= 1) // overall
{
$t = 0;
break;
}
fseek($fp,$t);
fgets($fp);
$p = ftell($fp);
}
}
else $t = 0; // p0 == 2
fseek($fp,$t);
$p = $t; // goto pre position
while(1)
{
$c = fgets($fp);
$m = ftell($fp);
if($m == $p0)
{
fseek($fp,$p); // seek to pre position
break;
}
$c = fgets($fp); // next line
$p = ftell($fp);
if($p == $p0) // found pre p0 positio
{
fseek($fp,$m);
break;
}
}
return $c;
}
function fclose($fp)
{
return fclose($fp);
}
} // end of class
?>