.
*/
include_once 'phing/filters/BaseParamFilterReader.php';
include_once 'phing/filters/ChainableReader.php';
/**
* Reads the first n
lines of a stream.
* (Default is first 10 lines.)
*
* Example: *
* Or: *
* * @author Yannick Lecaillez * @author hans lellelid, hans@velum.net * @version $Revision: 1.6 $ $Date: 2004/03/15 14:45:06 $ * @access public * @see FilterReader * @package phing.filters */ class HeadFilter extends BaseParamFilterReader implements ChainableReader { /** * Parameter name for the number of lines to be returned. */ const LINES_KEY = "lines"; /** * Number of lines currently read in. * @var integer */ private $_linesRead = 0; /** * Number of lines to be returned in the filtered stream. * @var integer */ private $_lines = 10; /** * Returns first n lines of stream. * @return the resulting stream, or -1 * if the end of the resulting stream has been reached * * @exception IOException if the underlying stream throws an IOException * during reading */ function read($len = null) { if ( !$this->getInitialized() ) { $this->_initialize(); $this->setInitialized(true); } // note, if buffer contains fewer lines than // $this->_lines this code will not work. if($this->_linesRead < $this->_lines) { $buffer = $this->in->read($len); if($buffer === -1) { return -1; } // now grab first X lines from buffer $lines = explode("\n", $buffer); $linesCount = count($lines); // must account for possibility that the num lines requested could // involve more than one buffer read. $len = ($linesCount > $this->_lines ? $this->_lines - $this->_linesRead : $linesCount); $filtered_buffer = implode("\n", array_slice($lines, 0, $len) ); $this->_linesRead += $len; return $filtered_buffer; } return -1; // EOF, since the file is "finished" as far as subsequent filters are concerned. } /** * Sets the number of lines to be returned in the filtered stream. * * @param integer $lines the number of lines to be returned in the filtered stream. */ function setLines($lines) { $this->_lines = (int) $lines; } /** * Returns the number of lines to be returned in the filtered stream. * * @return integer The number of lines to be returned in the filtered stream. */ function getLines() { return $this->_lines; } /** * Creates a new HeadFilter using the passed in * Reader for instantiation. * * @param object A Reader object providing the underlying stream. * Must not be* *
null
.
*
* @return object A new filter based on this configuration, but filtering
* the specified reader.
*/
function chain(Reader $reader) {
$newFilter = new HeadFilter($reader);
$newFilter->setLines($this->getLines());
$newFilter->setInitialized(true);
$newFilter->setProject($this->getProject());
return $newFilter;
}
/**
* Scans the parameters list for the "lines" parameter and uses
* it to set the number of lines to be returned in the filtered stream.
*/
private function _initialize() {
$params = $this->getParameters();
if ( $params !== null ) {
for($i = 0, $_i=count($params) ; $i < $_i; $i++) {
if ( self::LINES_KEY == $params[$i]->getName() ) {
$this->_lines = (int) $params[$i]->getValue();
break;
}
}
}
}
}
?>