X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FUtil%2FReversedFileReader.php;h=0566002de29e899e75034972d51f2fa4ad023be1;hb=47a3d8e6ce8461a457dee46d43d5ad14166f8013;hp=8a3083f7d8d14a31489d3cd2263d65af3a29cbce;hpb=9368f5445dda8b63133c6051aa819f641a0ee61d;p=friendica.git diff --git a/src/Util/ReversedFileReader.php b/src/Util/ReversedFileReader.php index 8a3083f7d8..0566002de2 100644 --- a/src/Util/ReversedFileReader.php +++ b/src/Util/ReversedFileReader.php @@ -1,6 +1,6 @@ _fh = fopen($filename, 'r'); - if (!$this->_fh) { + /** @var string */ + private $value = null; + + /** + * Open $filename for read and reset iterator + * + * @param string $filename File to open + * @return $this + */ + public function open(string $filename) + { + $this->fh = fopen($filename, 'r'); + if (!$this->fh) { // this should use a custom exception. throw \Exception("Unable to open $filename"); } - $this->_filesize = filesize($filename); - $this->_pos = -1; - $this->_buffer = null; - $this->_key = -1; - $this->_value = null; - } - - public function _read($size) - { - $this->_pos -= $size; - fseek($this->_fh, $this->_pos); - return fread($this->_fh, $size); - } - - public function _readline() - { - $buffer =& $this->_buffer; - while (true) { - if ($this->_pos == 0) { - return array_pop($buffer); - } - if (count($buffer) > 1) { - return array_pop($buffer); - } - $buffer = explode(self::SEPARATOR, $this->_read(self::BUFFER_SIZE) . $buffer[0]); - } - } - - public function next() - { - ++$this->_key; - $this->_value = $this->_readline(); - } - - public function rewind() - { - if ($this->_filesize > 0) { - $this->_pos = $this->_filesize; - $this->_value = null; - $this->_key = -1; - $this->_buffer = explode(self::SEPARATOR, $this->_read($this->_filesize % self::BUFFER_SIZE ?: self::BUFFER_SIZE)); - $this->next(); - } - } - - public function key() + $this->filesize = filesize($filename); + $this->pos = -1; + $this->buffer = null; + $this->key = -1; + $this->value = null; + return $this; + } + + /** + * Read $size bytes behind last position + * + * @return string + */ + private function _read($size) + { + $this->pos -= $size; + fseek($this->fh, $this->pos); + return fread($this->fh, $size); + } + + /** + * Read next line from end of file + * Return null if no lines are left to read + * + * @return ?string + */ + private function _readline() + { + $buffer = & $this->buffer; + while (true) { + if ($this->pos == 0) { + return array_pop($buffer); + } + if (is_null($buffer)) { + return null; + } + if (count($buffer) > 1) { + return array_pop($buffer); + } + $buffer = explode(self::SEPARATOR, $this->_read(self::BUFFER_SIZE) . $buffer[0]); + } + } + + /** + * Fetch next line from end and set it as current iterator value. + * + * @see Iterator::next() + * @return void + */ + public function next() + { + ++$this->key; + $this->value = $this->_readline(); + } + + /** + * Rewind iterator to the first line at the end of file + * + * @see Iterator::rewind() + * @return void + */ + public function rewind() + { + if ($this->filesize > 0) { + $this->pos = $this->filesize; + $this->value = null; + $this->key = -1; + $this->buffer = explode(self::SEPARATOR, $this->_read($this->filesize % self::BUFFER_SIZE ?: self::BUFFER_SIZE)); + $this->next(); + } + } + + /** + * Return current line number, starting from zero at the end of file + * + * @see Iterator::key() + * @return int + */ + public function key() { - return $this->_key; + return $this->key; } - public function current() + /** + * Return current line + * + * @see Iterator::current() + * @return string + */ + public function current() { - return $this->_value; + return $this->value; } - public function valid() + /** + * Checks if current iterator value is valid, that is, we readed all lines in files + * + * @see Iterator::valid() + * @return bool + */ + public function valid() { - return ! is_null($this->_value); + return ! is_null($this->value); } }