76 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			76 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
namespace nur\b\io;
 | 
						|
 | 
						|
use nur\b\coll\AbstractIterator;
 | 
						|
use nur\str;
 | 
						|
 | 
						|
/**
 | 
						|
 * Class StreamReader: lecture depuis un flux
 | 
						|
 */
 | 
						|
class StreamReader extends AbstractIterator implements IReader {
 | 
						|
  use Treader, Tfilter;
 | 
						|
 | 
						|
  /** @var resource */
 | 
						|
  protected $fd;
 | 
						|
 | 
						|
  /** @var bool */
 | 
						|
  protected $close;
 | 
						|
 | 
						|
  function __construct($fd, ?bool $close=null) {
 | 
						|
    if ($close === null) $close = $fd !== null;
 | 
						|
    if ($fd === null) $fd = STDIN;
 | 
						|
    $this->fd = $fd;
 | 
						|
    $this->close = $close;
 | 
						|
  }
 | 
						|
 | 
						|
  function setEncodingFilter(string $from, string $to="utf-8"): void {
 | 
						|
    $this->_setEncodingFilter($from, $to);
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * @throws IOException
 | 
						|
   * @return resource
 | 
						|
   */
 | 
						|
  protected final function open() {
 | 
						|
    IOException::ensure_open($this->fd === null);
 | 
						|
    $this->_streamAppendFilters($this->fd);
 | 
						|
    return $this->fd;
 | 
						|
  }
 | 
						|
 | 
						|
  /** @throws IOException */
 | 
						|
  function getResource() {
 | 
						|
    return $this->open();
 | 
						|
  }
 | 
						|
 | 
						|
  /** @throws IOException */
 | 
						|
  function seek(int $offset=0, int $whence=SEEK_SET): int {
 | 
						|
    return fseek($this->open(), $offset, $whence);
 | 
						|
  }
 | 
						|
 | 
						|
  function readLine(): string {
 | 
						|
    $line = EOFException::ensure_not_eof(fgets($this->open()));
 | 
						|
    return str::strip_nl($line);
 | 
						|
  }
 | 
						|
 | 
						|
  protected function _next(&$key) {
 | 
						|
    return $this->readLine();
 | 
						|
  }
 | 
						|
  function key() { return $this->_key(); }
 | 
						|
  function current() { return $this->_current(); }
 | 
						|
 | 
						|
  function getContents(bool $close=true): string {
 | 
						|
    try {
 | 
						|
      return stream_get_contents($this->open());
 | 
						|
    } finally {
 | 
						|
      $this->close($close);
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  function close(bool $close=true): void {
 | 
						|
    if ($this->fd !== null && $this->close && $close) {
 | 
						|
      fclose($this->fd);
 | 
						|
      $this->fd = null;
 | 
						|
    }
 | 
						|
  }
 | 
						|
}
 |