zoe             Mon Jul  6 20:45:03 2009 UTC

  Added files:                 
    /phpruntests/QA/ext/spl/examples    directorytreeiterator.inc 
                                        regexfindfile.inc 
                                        recursivedualiterator.inc 
                                        dualiterator.inc 
                                        callbackfilteriterator.inc 
                                        directorygraphiterator.inc 
                                        dbareader.inc autoload.inc 
                                        findfile.inc searchiterator.inc 
                                        dbaarray.inc directorytree.inc 
                                        recursivecomparedualiterator.inc 
                                        directoryfilterdots.inc 
                                        cachingrecursiveiterator.inc 
                                        keyfilter.inc inigroups.inc 
  Log:
  building test suite
  
http://cvs.php.net/viewvc.cgi/phpruntests/QA/ext/spl/examples/directorytreeiterator.inc?view=markup&rev=1.1
Index: phpruntests/QA/ext/spl/examples/directorytreeiterator.inc
+++ phpruntests/QA/ext/spl/examples/directorytreeiterator.inc
<?php

/** @file directorytreeiterator.inc
 * @ingroup Examples
 * @brief class DirectoryTreeIterator
 * @author  Marcus Boerger
 * @date    2003 - 2005
 *
 * SPL - Standard PHP Library
 */

/** @ingroup Examples
 * @brief   DirectoryIterator to generate ASCII graphic directory trees
 * @author  Marcus Boerger
 * @version 1.1
 */
class DirectoryTreeIterator extends RecursiveIteratorIterator
{
        /** Construct from a path.
         * @param $path directory to iterate
         */
        function __construct($path)
        {
                parent::__construct(
                        new RecursiveCachingIterator(
                                new RecursiveDirectoryIterator($path, 
RecursiveDirectoryIterator::KEY_AS_FILENAME
                                ), 
                                
CachingIterator::CALL_TOSTRING|CachingIterator::CATCH_GET_CHILD
                        ), 
                        parent::SELF_FIRST
                );
        }

        /** @return the current element prefixed with ASCII graphics
         */     
        function current()
        {
                $tree = '';
                for ($l=0; $l < $this->getDepth(); $l++) {
                        $tree .= $this->getSubIterator($l)->hasNext() ? '| ' : 
'  ';
                }
                return $tree . ($this->getSubIterator($l)->hasNext() ? '|-' : 
'\-') 
                       . $this->getSubIterator($l)->__toString();
        }

        /** Aggregates the inner iterator
         */     
        function __call($func, $params)
        {
                return call_user_func_array(array($this->getSubIterator(), 
$func), $params);
        }
}

?>
http://cvs.php.net/viewvc.cgi/phpruntests/QA/ext/spl/examples/regexfindfile.inc?view=markup&rev=1.1
Index: phpruntests/QA/ext/spl/examples/regexfindfile.inc
+++ phpruntests/QA/ext/spl/examples/regexfindfile.inc
<?php

/** @file regexfindfile.inc
 * @ingroup Examples
 * @brief class RegexFindFile
 * @author  Marcus Boerger
 * @date    2003 - 2005
 *
 * SPL - Standard PHP Library
 */

/** @ingroup Examples
 * @brief   Find files by regular expression
 * @author  Marcus Boerger
 * @version 1.1
 *
 */
class RegexFindFile extends FindFile
{
        /** Construct from path and regular expression
         *
         * @param $path the directory to search in
         *              If path contains ';' then this parameter is split and 
every
         *              part of it is used as separate directory.
         * @param $regex perl style regular expression to find files with
         */
        function __construct($path, $regex)
        {
                parent::__construct($path, $regex);
        }

        /** @return whether the current filename matches the regular expression.
         */
        function accept()
        {
                return preg_match($this->getSearch(), $this->current());
        }
}

?>
http://cvs.php.net/viewvc.cgi/phpruntests/QA/ext/spl/examples/recursivedualiterator.inc?view=markup&rev=1.1
Index: phpruntests/QA/ext/spl/examples/recursivedualiterator.inc
+++ phpruntests/QA/ext/spl/examples/recursivedualiterator.inc
<?php

/** @file recursivedualiterator.inc
 * @ingroup Examples
 * @brief class RecursiveDualIterator
 * @author  Marcus Boerger
 * @date    2003 - 2006
 *
 * SPL - Standard PHP Library
 */

/** @ingroup Examples
 * @brief   Synchronous iteration over two recursive iterators
 * @author  Marcus Boerger
 * @version 1.0
 */
class RecursiveDualIterator extends DualIterator implements RecursiveIterator
{
        private $ref;

        /** construct iterator from two RecursiveIterator instances
         *
         * @param lhs   Left  Hand Side Iterator
         * @param rhs   Right Hand Side Iterator
         * @param flags iteration flags
         */
        function __construct(RecursiveIterator $lhs, RecursiveIterator $rhs, 
                                $flags = 0x33 /*DualIterator::DEFAULT_FLAGS*/)
        {
                parent::__construct($lhs, $rhs, $flags);
        }

        /** @return whether both LHS and RHS have children
         */
        function hasChildren()
        {
                return $this->getLHS()->hasChildren() && 
$this->getRHS()->hasChildren();        
        }

        /** @return new RecursiveDualIterator (late binding) for the two inner 
         * iterators current children.
         */
        function getChildren()
        {
                if (empty($this->ref))
                {
                        $this->ref = new ReflectionClass($this);
                }
                return $this->ref->newInstance(
                                        $this->getLHS()->getChildren(), 
$this->getRHS()->getChildren(), $this->getFlags());
        }

        /** @return whether both inner iterators are valid, have same 
hasChildren()
         * state and identical current and key values or both are non valid.
         */
        function areIdentical()
        {
                return $this->getLHS()->hasChildren() === 
$this->getRHS()->hasChildren()
                        && parent::areIdentical();
        }

        /** @return whether both inner iterators are valid, have same 
hasChildren()
         * state and equal current and key values or both are invalid.
         */
        function areEqual()
        {
                return $this->getLHS()->hasChildren() === 
$this->getRHS()->hasChildren()
                        && parent::areEqual();
        }
}

?>

http://cvs.php.net/viewvc.cgi/phpruntests/QA/ext/spl/examples/dualiterator.inc?view=markup&rev=1.1
Index: phpruntests/QA/ext/spl/examples/dualiterator.inc
+++ phpruntests/QA/ext/spl/examples/dualiterator.inc
<?php

/** @file dualiterator.inc
 * @ingroup Examples
 * @brief class DualIterator
 * @author  Marcus Boerger
 * @date    2003 - 2006
 *
 * SPL - Standard PHP Library
 */

/** @ingroup Examples
 * @brief   Synchronous iteration over two iterators
 * @author  Marcus Boerger
 * @version 1.3
 */
class DualIterator implements Iterator
{
        const CURRENT_LHS   = 0x01;
        const CURRENT_RHS   = 0x02;
        const CURRENT_ARRAY = 0x03;
        const CURRENT_0     = 0x00;

        const KEY_LHS   = 0x10;
        const KEY_RHS   = 0x20;
        const KEY_0     = 0x00;
        
        const DEFAULT_FLAGS = 0x13;
        
        private $lhs;
        private $rhs;
        private $flags;

        /** construct iterator from two iterators
         *
         * @param lhs   Left  Hand Side Iterator
         * @param rhs   Right Hand Side Iterator
         * @param flags iteration flags
         */
        function __construct(Iterator $lhs, Iterator $rhs, 
                                        $flags = 0x13 
/*DualIterator::DEFAULT_FLAGS*/)
        {
                $this->lhs   = $lhs;
                $this->rhs   = $rhs;
                $this->flags = $flags;
        }

        /** @return Left Hand Side Iterator
         */
        function getLHS()
        {
                return $this->lhs;
        }

        /** @return Right Hand Side Iterator
         */
        function getRHS()
        {
                return $this->rhs;
        }

        /** @param flags new flags
         */
        function setFlags($flags)
        {
                $this->flags = $flags;
        }

        /** @return current flags
         */
        function getFlags()
        {
                return $this->flags;
        }

        /** rewind both inner iterators
         */     
        function rewind()
        {
                $this->lhs->rewind();
                $this->rhs->rewind();   
        }

        /** @return whether both inner iterators are valid
         */     
        function valid()
        {
                return $this->lhs->valid() && $this->rhs->valid();      
        }

        /** @return current value depending on CURRENT_* flags
         */     
        function current()
        {
                switch($this->flags & 0x0F)
                {
                default:
                case self::CURRENT_ARRAY:
                        return array($this->lhs->current(), 
$this->rhs->current());
                case self::CURRENT_LHS:
                        return $this->lhs->current();
                case self::CURRENT_RHS:
                        return $this->rhs->current();
                case self::CURRENT_0:
                        return NULL;
                }
        }

        /** @return key value depending on KEY_* flags
         */     
        function key()
        {
                switch($this->flags & 0xF0)
                {
                default:
                case self::KEY_LHS:
                        return $this->lhs->key();
                case self::KEY_RHS:
                        return $this->rhs->key();
                case self::KEY_0:
                        return NULL;
                }
        }

        /** move both inner iterators forward
         */     
        function next()
        {
                $this->lhs->next();
                $this->rhs->next();
        }

        /** @return whether both inner iterators are valid and have identical 
         * current and key values or both are non valid.
         */
        function areIdentical()
        {
                return $this->valid()
                     ? $this->lhs->current() === $this->rhs->current()
                        && $this->lhs->key()     === $this->rhs->key()
                         : $this->lhs->valid()   ==  $this->rhs->valid();
        }

        /** @return whether both inner iterators are valid and have equal 
current 
         * and key values or both are non valid.
         */
        function areEqual()
        {
                return $this->valid()
                     ? $this->lhs->current() ==  $this->rhs->current()
                        && $this->lhs->key()     ==  $this->rhs->key()
                         : $this->lhs->valid()   ==  $this->rhs->valid();
        }

        /** Compare two iterators
         *
         * @param lhs   Left  Hand Side Iterator
         * @param rhs   Right Hand Side Iterator
         * @param identical whether to use areEqual() or areIdentical()
         * @return whether both iterators are equal/identical
         *
         * @note If one implements RecursiveIterator the other must do as well.
         *       And if both do then a recursive comparison is being used.
         */
        static function compareIterators(Iterator $lhs, Iterator $rhs, 
                                         $identical = false)
        {
                if ($lhs instanceof RecursiveIterator)
                {
                        if ($rhs instanceof RecursiveIterator)
                        {
                                $it = new RecursiveDualIterator($lhs, $rhs, 
                                                                self::CURRENT_0 
| self::KEY_0);
                                $it = new RecursiveCompareDualIterator($it);
                        }
                        else
                        {
                                return false;
                        }
                }
                else
                {
                        $it = new DualIterator($lhs, $rhs, self::CURRENT_0 | 
self::KEY_0);
                }

                if ($identical)
                {
                        foreach($it as $n)
                        {
                                if (!$it->areIdentical())
                                {
                                        return false;
                                }
                        }
                }
                else
                {
                        foreach($it as $n)
                        {
                                if (!$it->areEqual())
                                {
                                        return false;
                                }
                        }
                }
                return $identical ? $it->areIdentical() : $it->areEqual();
        }
}

?>

http://cvs.php.net/viewvc.cgi/phpruntests/QA/ext/spl/examples/callbackfilteriterator.inc?view=markup&rev=1.1
Index: phpruntests/QA/ext/spl/examples/callbackfilteriterator.inc
+++ phpruntests/QA/ext/spl/examples/callbackfilteriterator.inc
<?php

/** @file callbackfilteriterator.inc
 * @ingroup Examples
 * @brief class CallbackFilterIterator
 * @author  Marcus Boerger
 * @author  Kevin McArthur
 * @date    2006 - 2006
 *
 * SPL - Standard PHP Library
 */

/** @ingroup Examples
 * @brief   A non abstract FiletrIterator that uses a callback foreach element
 * @author  Marcus Boerger
 * @author  Kevin McArthur
 * @version 1.0
 */
class CallbackFilterIterator extends FilterIterator
{
        const USE_FALSE = 0;  /**< mode: accept no elements, no callback */
        const USE_TRUE  = 1;  /**< mode: accept all elements, no callback */
        const USE_VALUE = 2;  /**< mode: pass value to callback */
        const USE_KEY   = 3;  /**< mode: pass key to callback */
        const USE_BOTH  = 4;  /**< mode: pass value and key to callback */

        const REPLACE   = 0x00000001; /**< flag: pass key/value by reference */

        private $callback; /**< callback to use */
        private $mode;     /**< mode any of USE_VALUE, USE_KEY, USE_BOTH */
        private $flags;    /**< flags (REPLACE) */
        private $key;      /**< key value */
        private $current;  /**< current value */

        /** Construct a CallbackFilterIterator
         *
         * @param it        inner iterator (iterator to filter)
         * @param callback  callback function
         * @param mode      any of USE_VALUE, USE_KEY, USE_BOTH
         * @param flags     any of 0, REPLACE
         */
        public function __construct(Iterator $it, $callback, $mode = 
self::USE_VALUE, $flags = 0)
        {
                parent::__construct($it);
                $this->callback = $callback;
                $this->mode     = $mode;
                $this->flags    = $flags;
        }

        /** Call the filter callback
         * @return result of filter callback
         */
        public function accept()
        {
                $this->key     = parent::key();
                $this->current = parent::current();

                switch($this->mode) {
                default:
                case self::USE_FALSE;
                        return false;
                case self::USE_TRUE:
                        return true;
                case self::USE_VALUE:
                        if($this->flags & self::REPLACE) {
                                return (bool) call_user_func($this->callback, 
&$this->current);
                        } else {
                                return (bool) call_user_func($this->callback, 
$this->current);
                        }
                case self::USE_KEY:
                        if($this->flags & self::REPLACE) {
                                return (bool) call_user_func($this->callback, 
&$this->key);
                        } else {
                                return (bool) call_user_func($this->callback, 
$this->key);
                        }
                case SELF::USE_BOTH:
                        if($this->flags & self::REPLACE) {
                                return (bool) call_user_func($this->callback, 
&$this->key, &$this->current);
                        } else {
                                return (bool) call_user_func($this->callback, 
$this->key, $this->current);
                        }
                }
        }

        /** @return current key value */
        function key()
        {
                return $this->key;
        }

        /** @return current value */
        function current()
        {
                return $this->current;
        }

        /** @return operation mode */
        function getMode()
        {
                return $this->mode;
        }

        /** @param $mode set new mode, @see mode */
        function setMode($mode)
        {
                $this->mode = $mode;
        }

        /** @return operation flags */
        function getFlags()
        {
                return $this->flags;
        }

        /** @param $flags set new flags, @see flags */
        function setFlags($flags)
        {
                $this->flags = $flags;
        }
}

?>
http://cvs.php.net/viewvc.cgi/phpruntests/QA/ext/spl/examples/directorygraphiterator.inc?view=markup&rev=1.1
Index: phpruntests/QA/ext/spl/examples/directorygraphiterator.inc
+++ phpruntests/QA/ext/spl/examples/directorygraphiterator.inc
<?php

/** @file directorygraphiterator.inc
 * @ingroup Examples
 * @brief class DirectoryGraphIterator
 * @author  Marcus Boerger
 * @date    2003 - 2005
 *
 * SPL - Standard PHP Library
 */

/** @ingroup Examples
 * @brief   A tree iterator that only shows directories.
 * @author  Marcus Boerger
 * @version 1.1
 */
class DirectoryGraphIterator extends DirectoryTreeIterator
{
        function __construct($path)
        {
                RecursiveIteratorIterator::__construct(
                        new RecursiveCachingIterator(
                                new ParentIterator(
                                        new RecursiveDirectoryIterator($path, 
RecursiveDirectoryIterator::KEY_AS_FILENAME
                                        )
                                ), 
                                
CachingIterator::CALL_TOSTRING|CachingIterator::CATCH_GET_CHILD
                        ), 
                        parent::SELF_FIRST
                );
        }
}

?>
http://cvs.php.net/viewvc.cgi/phpruntests/QA/ext/spl/examples/dbareader.inc?view=markup&rev=1.1
Index: phpruntests/QA/ext/spl/examples/dbareader.inc
+++ phpruntests/QA/ext/spl/examples/dbareader.inc
<?php

/** @file dbareader.inc
 * @ingroup Examples
 * @brief class DbaReader
 * @author  Marcus Boerger
 * @date    2003 - 2005
 *
 * SPL - Standard PHP Library
 */

/** @ingroup Examples
 * @brief   This implements a DBA Iterator.
 * @author  Marcus Boerger
 * @version 1.0
 */
class DbaReader implements Iterator
{

        protected $db = NULL;
        private $key = false;
        private $val = false;

        /**
         * Open database $file with $handler in read only mode.
         *
         * @param file    Database file to open.
         * @param handler Handler to use for database access.
         */
        function __construct($file, $handler) {
                if (!$this->db = dba_open($file, 'r', $handler)) {
                    throw new exception('Could not open file ' . $file);
                }
        }
        
        /**
         * Close database.
         */
        function __destruct() {
                dba_close($this->db);
        }

        /**
         * Rewind to first element.
         */
        function rewind() {
                $this->key = dba_firstkey($this->db);
                $this->fetch_data();
        }

        /**
         * Move to next element.
         *
         * @return void
         */
        function next() {
                $this->key = dba_nextkey($this->db);
                $this->fetch_data();
        }

    /**
     * Fetches the current data if $key is valid
     */ 
        private function fetch_data() {
                if ($this->key !== false) {
                        $this->val = dba_fetch($this->key, $this->db);
                }
        }

        /**
         * @return Current data.
         */
        function current() {
                return $this->val;
        }

        /**
         * @return Whether more elements are available.
         */
        function valid() {
                if ($this->db && $this->key !== false) {
                        return true;
                } else {
                        return false;
                }
        }

        /**
         * @return Current key.
         */
        function key() {
                return $this->key;
        }
}

?>
http://cvs.php.net/viewvc.cgi/phpruntests/QA/ext/spl/examples/autoload.inc?view=markup&rev=1.1
Index: phpruntests/QA/ext/spl/examples/autoload.inc
+++ phpruntests/QA/ext/spl/examples/autoload.inc
<?php

/** @file autoload.inc
 * @ingroup Examples
 * @brief function __autoload
 * @author  Marcus Boerger
 * @date    2003 - 2005
 *
 * SPL - Standard PHP Library
 */

/** \internal
 * Tries to load class $classname from directory $dir.
 */
function __load_class($classname, $dir)
{
        $file = $dir . '/' . $classname . '.inc';
        if (file_exists($file))
        {
                require_once($file);
                return true;
        }
        return false;
}

/** 
 * @brief   Class loader for SPL example classes
 * @author  Marcus Boerger
 * @version 1.0
 *
 * Loads classes automatically from include_path as given by ini or from
 * current directory of script or include file.
 */
function __autoload($classname) {
        $classname = strtolower($classname);
        $inc = split(':', ini_get('include_path'));
        $inc[] = '.';
        $inc[] = dirname($_SERVER['PATH_TRANSLATED']);
        foreach($inc as $dir)
        {
                if (__load_class($classname, $dir))
                {
                        fprintf(STDERR, 'Loading class('.$classname.")\n");
                        return;
                }
        }
        fprintf(STDERR, 'Class not found ('.$classname.")\n");
}

?>
http://cvs.php.net/viewvc.cgi/phpruntests/QA/ext/spl/examples/findfile.inc?view=markup&rev=1.1
Index: phpruntests/QA/ext/spl/examples/findfile.inc
+++ phpruntests/QA/ext/spl/examples/findfile.inc
<?php

/** @file findfile.inc
 * @ingroup Examples
 * @brief class FindFile
 * @author  Marcus Boerger
 * @date    2003 - 2005
 *
 * SPL - Standard PHP Library
 */

if (!class_exists("FindFile", false)) require_once("findfile.inc");
if (!class_exists("AppendIterator", false)) require_once("appenditerator.inc");

/** @ingroup Examples
 * @brief   Base class to find files
 * @author  Marcus Boerger
 * @version 1.1
 *
 */
class FindFile extends FilterIterator
{
        /** @internal filename to find */
        private $file;

        /** Construct from path and filename
         *
         * @param $path the directory to search in
         *              If path contains ';' then this parameter is split and 
every
         *              part of it is used as separate directory.
         * @param $file the name of the files to search fro
         */
        function __construct($path, $file)
        {
                $this->file = $file;
                $list = split(PATH_SEPARATOR, $path);
                if (count($list) <= 1) {
                        parent::__construct(new RecursiveIteratorIterator(new 
RecursiveDirectoryIterator($path)));
                } else {
                        $it = new AppendIterator();
                        foreach($list as $path) {
                                $it->append(new RecursiveIteratorIterator(new 
RecursiveDirectoryIterator($path)));
                        }
                        parent::__construct($it);
                }
        }

        /** @return whether the current file matches the given filename
         */
        function accept()
        {
                return !strcmp($this->current(), $this->file);
        }

        /** @return the filename to search for.
         * @note This may be overloaded and contain a regular expression for an
         *       extended class that uses regular expressions to search.
         */
        function getSearch()
        {
                return $this->file;
        }
}

?>
http://cvs.php.net/viewvc.cgi/phpruntests/QA/ext/spl/examples/searchiterator.inc?view=markup&rev=1.1
Index: phpruntests/QA/ext/spl/examples/searchiterator.inc
+++ phpruntests/QA/ext/spl/examples/searchiterator.inc
<?php

/** @file searchiterator.inc
 * @ingroup Examples
 * @brief abstract class SearchIterator
 * @author  Marcus Boerger
 * @date    2003 - 2005
 *
 * SPL - Standard PHP Library
 */

/** @ingroup Examples
 * @brief Iterator to search for a specific element
 * @author  Marcus Boerger
 * @version 1.0
 *
 * This extended FilterIterator stops after finding the first acceptable
 * value.
 */
abstract class SearchIterator extends FilterIterator
{
        /** @internal whether an entry was found already */
        private $done = false;

        /** Rewind and reset so that it once again searches.
         * @return void
         */
        function rewind()
        {
                parent::rewind();
                $this->done = false;
        }

        /** @return whether the current element is valid
         * which can only happen once per iteration.
         */
        function valid()
        {
                return !$this->done && parent::valid();
        }
        
        /** Do not move forward but instead mark as finished.
         * @return void
         */
        function next()
        {
                $this->done = true;
        }

        /** Aggregates the inner iterator
         */     
        function __call($func, $params)
        {
                return call_user_func_array(array($this->getInnerIterator(), 
$func), $params);
        }
}

?>
http://cvs.php.net/viewvc.cgi/phpruntests/QA/ext/spl/examples/dbaarray.inc?view=markup&rev=1.1
Index: phpruntests/QA/ext/spl/examples/dbaarray.inc
+++ phpruntests/QA/ext/spl/examples/dbaarray.inc
<?php

/** @file dbaarray.inc
 * @ingroup Examples
 * @brief class DbaArray
 * @author  Marcus Boerger
 * @date    2003 - 2005
 *
 * SPL - Standard PHP Library
 */

if (!class_exists("DbaReader", false)) require_once("dbareader.inc");

/** @ingroup Examples
 * @brief   This implements a DBA Array
 * @author  Marcus Boerger
 * @version 1.0
 */
class DbaArray extends DbaReader implements ArrayAccess
{

        /**
         * Open database $file with $handler in read only mode.
         *
         * @param file    Database file to open.
         * @param handler Handler to use for database access.
         */
        function __construct($file, $handler)
        {
                $this->db = dba_popen($file, "c", $handler);
                if (!$this->db) {
                        throw new exception("Databse could not be opened");
                }
        }

        /**
         * Close database.
         */
        function __destruct()
        {
                parent::__destruct();
        }

        /**
         * Read an entry.
         *
         * @param $name key to read from
         * @return value associated with $name
         */
        function offsetGet($name)
        {
                $data = dba_fetch($name, $this->db); 
                if($data) {
                        if (ini_get('magic_quotes_runtime')) {
                                $data = stripslashes($data);
                        }
                        //return unserialize($data);
                        return $data;
                }
                else 
                {
                        return NULL;
                }
        }

        /**
         * Set an entry.
         *
         * @param $name key to write to
         * @param $value value to write
         */
        function offsetSet($name, $value)
        {
                //dba_replace($name, serialize($value), $this->db);
                dba_replace($name, $value, $this->db);
                return $value;
        }

        /**
         * @return whether key $name exists.
         */
        function offsetExists($name)
        {
                return dba_exists($name, $this->db);
        }

        /**
         * Delete a key/value pair.
         *
         * @param $name key to delete.
         */
        function offsetUnset($name)
        {
                return dba_delete($name, $this->db);
        }
}

?>
http://cvs.php.net/viewvc.cgi/phpruntests/QA/ext/spl/examples/directorytree.inc?view=markup&rev=1.1
Index: phpruntests/QA/ext/spl/examples/directorytree.inc
+++ phpruntests/QA/ext/spl/examples/directorytree.inc
<?php

/** @file directorytree.inc
 * @ingroup Examples
 * @brief class DirectoryTree
 * @author  Marcus Boerger
 * @date    2003 - 2005
 *
 * SPL - Standard PHP Library
 */

/** @ingroup Examples
 * @brief   A directory iterator that does not show '.' and '..'.
 * @author  Marcus Boerger
 * @version 1.0
 */
class DirectoryTree extends RecursiveIteratorIterator
{
        /** Construct from a path.
         * @param $path directory to iterate
         */
        function __construct($path) {
                parent::__construct(new DirectoryFilterDots($path));
        }
}

?>
http://cvs.php.net/viewvc.cgi/phpruntests/QA/ext/spl/examples/recursivecomparedualiterator.inc?view=markup&rev=1.1
Index: phpruntests/QA/ext/spl/examples/recursivecomparedualiterator.inc
+++ phpruntests/QA/ext/spl/examples/recursivecomparedualiterator.inc
<?php

/** @file recursivecomparedualiterator.inc
 * @ingroup Examples
 * @brief class DualIterator
 * @author  Marcus Boerger
 * @date    2003 - 2006
 *
 * SPL - Standard PHP Library
 */

/** @ingroup Examples
 * @brief   Recursive comparison iterator for a RecursiveDualIterator
 * @author  Marcus Boerger
 * @version 1.0
 */
class RecursiveCompareDualIterator extends RecursiveIteratorIterator
{
        /** Used to keep end of recursion equality. That is en leaving a nesting
         * level we need to check whether both child iterators are at their end.
         */
        protected $equal = false;

        /** Construct from RecursiveDualIterator
         *
         * @param $it      RecursiveDualIterator
         * @param $mode    should be LEAVES_ONLY
         * @param $flags   should be 0
         */
        function __construct(RecursiveDualIterator $it, $mode = 
self::LEAVES_ONLY, $flags = 0)
        {
                parent::__construct($it);
        }

        /** Rewind iteration andcomparison process. Starting with $equal = true.
         */     
        function rewind()
        {
                $this->equal = true;
                parent::rewind();
        }

        /** Calculate $equal
         * @see $equal
         */
        function endChildren()
        {
                $this->equal &= !$this->getInnerIterator()->getLHS()->valid()
                             && !$this->getInnerIterator()->getRHS()->valid();
        }

        /** @return whether both inner iterators are valid and have identical 
         * current and key values or both are non valid.
         */
        function areIdentical()
        {
                return $this->equal && 
$this->getInnerIterator()->areIdentical();
        }

        /** @return whether both inner iterators are valid and have equal 
current 
         * and key values or both are non valid.
         */
        function areEqual()
        {
                return $this->equal && $this->getInnerIterator()->areEqual();
        }
}

?>

http://cvs.php.net/viewvc.cgi/phpruntests/QA/ext/spl/examples/directoryfilterdots.inc?view=markup&rev=1.1
Index: phpruntests/QA/ext/spl/examples/directoryfilterdots.inc
+++ phpruntests/QA/ext/spl/examples/directoryfilterdots.inc
<?php

/** @file directoryfilterdots.inc
 * @ingroup Examples
 * @brief class DirectoryFilterDots
 * @author  Marcus Boerger
 * @date    2003 - 2006
 *
 * SPL - Standard PHP Library
 */

/** @ingroup Examples
 * @brief   A filtered DirectoryIterator
 * @author  Marcus Boerger
 * @version 1.2
 *
 * This Iterator takes a pathname from which it creates a 
RecursiveDirectoryIterator
 * and makes it recursive. Further more it filters the entries '.' and '..'.
 */
class DirectoryFilterDots extends RecursiveFilterIterator
{
        /** Construct from a path.
         * @param $path directory to iterate
         */
        function __construct($path)
        {
                parent::__construct(new RecursiveDirectoryIterator($path));
        }

        /** @return whether the current entry is neither '.' nor '..'
         */     
        function accept()
        {
                return !$this->getInnerIterator()->isDot();
        }

        /** @return the current entries path name
         */
        function key()
        {
                return $this->getInnerIterator()->getPathname();
        }
}

?>

http://cvs.php.net/viewvc.cgi/phpruntests/QA/ext/spl/examples/cachingrecursiveiterator.inc?view=markup&rev=1.1
Index: phpruntests/QA/ext/spl/examples/cachingrecursiveiterator.inc
+++ phpruntests/QA/ext/spl/examples/cachingrecursiveiterator.inc
<?php

/** @file cachingrecursiveiterator.inc
 * @ingroup Examples
 * @brief class CachingRecursiveIterator
 * @author  Marcus Boerger
 * @date    2003 - 2005
 *
 * SPL - Standard PHP Library
 */

/** @ingroup Examples
 * @brief   Compatibility to PHP 5.0
 * @author  Marcus Boerger
 * @version 1.2
 * @deprecated
 *
 * Class RecursiveCachingIterator was named CachingRecursiveIterator until
 * PHP 5.0.6.
 *
 * @see RecursiveCachingIterator
 */

class CachingRecursiveIterator extends RecursiveCachingIterator
{
}

?>
http://cvs.php.net/viewvc.cgi/phpruntests/QA/ext/spl/examples/keyfilter.inc?view=markup&rev=1.1
Index: phpruntests/QA/ext/spl/examples/keyfilter.inc
+++ phpruntests/QA/ext/spl/examples/keyfilter.inc
<?php

/** @file keyfilter.inc
 * @ingroup Examples
 * @brief class KeyFilter
 * @author  Marcus Boerger
 * @date    2003 - 2005
 *
 * SPL - Standard PHP Library
 */

/** @ingroup Examples
 * @brief   Regular expression filter for string iterators
 * @author  Marcus Boerger
 * @version 1.1
 *
 * Instances of this class act as a filter around iterators whose elements
 * are strings. In other words you can put an iterator into the constructor
 * and the instance will only return elements which match the given regular 
 * expression.
 */
class KeyFilter extends FilterIterator
{
        /** @internal regular exoression used as filter */
        private $regex;

        /**
         * Constructs a filter around an iterator whose elemnts are strings.
         * If the given iterator is of type spl_sequence then its rewind()
         * method is called.
         *
         * @param it     Object that implements at least spl_forward
         * @param regex  Regular expression used as a filter.
         */
        function __construct(Iterator $it, $regex)
        {
                parent::__construct($it);
                $this->regex = $regex;
        }

        /** \return whether the current key mathes the regular expression 
         */
        function accept()
        {
                return ereg($this->regex, $this->getInnerIterator()->key());
        }
        
        /** @return regular expression used as filter
         */
        function getRegex()
        {
                return $this->regex;
        }

        /**
         * hidden __clone
         */
        protected function __clone()
        {
                // disallow clone 
        }
}

?>
http://cvs.php.net/viewvc.cgi/phpruntests/QA/ext/spl/examples/inigroups.inc?view=markup&rev=1.1
Index: phpruntests/QA/ext/spl/examples/inigroups.inc
+++ phpruntests/QA/ext/spl/examples/inigroups.inc
<?php

/** @file inigroups.inc
 * @ingroup Examples
 * @brief class IniGroups
 * @author  Marcus Boerger
 * @date    2003 - 2005
 *
 * SPL - Standard PHP Library
 */

if (!class_exists("KeyFilter", false)) require_once("keyfilter.inc");
if (!class_exists("DbaReader", false)) require_once("dbareader.inc");

/** @ingroup Examples
 * @brief   Class to iterate all groups within an ini file.
 * @author  Marcus Boerger
 * @version 1.1
 *
 * Using this class you can iterator over all groups of a ini file.
 * 
 * This class uses a 'is-a' relation to KeyFilter in contrast to a 'has-a'
 * relation. Doing so both current() and key() methods must be overwritten. 
 * If it would use a 'has-a' relation there would be much more to type...
 * but for puritists that would allow correctness in so far as then no 
 * key() would be needed.
 */
class IniGroups extends KeyFilter
{
        /**
         * Construct an ini file group iterator from a filename.
         *
         * @param file Ini file to open.
         */
        function __construct($file) {
                parent::__construct(new DbaReader($file, 'inifile'), 
'^\[.*\]$');
        }

        /**
         * @return The current group.
         */
        function current() {
                return substr(parent::key(),1,-1);
        }

        /**
         * @return The current group.
         */
        function key() {
                return substr(parent::key(),1,-1);
        }
}

?>
-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to