<?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*$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
?>