X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FUtil%2FReversedFileReader.php;h=58fb2cb3faaceab460c86ed8192cb103625725fe;hb=e1863951986ba5be173758324a00652bc5af870c;hp=c4fe131aee9d68d8766b99a9edaabfabd97d518d;hpb=dd2abc7aff18998205e18c7021097285fe72c821;p=friendica.git diff --git a/src/Util/ReversedFileReader.php b/src/Util/ReversedFileReader.php index c4fe131aee..58fb2cb3fa 100644 --- a/src/Util/ReversedFileReader.php +++ b/src/Util/ReversedFileReader.php @@ -1,6 +1,6 @@ fh = fopen($filename, 'r'); if (!$this->fh) { // this should use a custom exception. - throw \Exception("Unable to open $filename"); + throw new \Exception("Unable to open $filename"); } $this->filesize = filesize($filename); $this->pos = -1; @@ -70,20 +70,35 @@ class ReversedFileReader implements \Iterator return $this; } - private function _read($size) + /** + * Read $size bytes behind last position + * + * @param int $size + * @return string + */ + private function _read(int $size): string { $this->pos -= $size; fseek($this->fh, $this->pos); return fread($this->fh, $size); } - private function _readline() + /** + * Read next line from end of file + * Return null if no lines are left to read + * + * @return string|null Depending on data being buffered + */ + private function _readline(): ?string { $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); } @@ -91,12 +106,26 @@ class ReversedFileReader implements \Iterator } } + /** + * Fetch next line from end and set it as current iterator value. + * + * @see Iterator::next() + * @return void + */ + #[\ReturnTypeWillChange] 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 + */ + #[\ReturnTypeWillChange] public function rewind() { if ($this->filesize > 0) { @@ -108,17 +137,35 @@ class ReversedFileReader implements \Iterator } } - public function key() + /** + * Return current line number, starting from zero at the end of file + * + * @see Iterator::key() + * @return int + */ + public function key(): int { return $this->key; } - public function current() + /** + * Return current line + * + * @see Iterator::current() + * @return string + */ + public function current(): string { return $this->value; } - public function valid() + /** + * Checks if current iterator value is valid, that is, we read all lines in files + * + * @see Iterator::valid() + * @return bool + */ + public function valid(): bool { return ! is_null($this->value); }