helly Sat May 8 08:24:15 2004 EDT Added files: /php-src/ext/spl/internal cachingiterator.inc cachingrecursiveiterator.inc filteriterator.inc limititerator.inc parentiterator.inc recursiveiterator.inc recursiveiteratoriterator.inc seekableiterator.inc /php-src/ext/spl/examples dbaarray.inc dbareader.inc inigroups.inc keyfilter.inc
Removed files: /php-src/ext/spl/examples IniGroups.inc KeyFilter.inc cachingiterator.inc cachingrecursiveiterator.inc dba_reader.inc directorygraphiterator.inc filteriterator.inc limititerator.inc parentiterator.inc recursiveiterator.inc recursiveiteratoriterator.inc seekableiterator.inc Modified files: /php-src/ext/spl/examples autoload.inc dba_array.php dba_dump.php directoryfilterdots.inc directorytree.inc directorytreeiterator.inc emptyiterator.inc findfile.inc findregex.php infiniteiterator.inc ini_groups.php searchiterator.inc tree.php Log: - Update examples - Update documentation - Move classes/interfaces already implemented in c to new subdir internal
http://cvs.php.net/diff.php/php-src/ext/spl/examples/autoload.inc?r1=1.3&r2=1.4&ty=u Index: php-src/ext/spl/examples/autoload.inc diff -u php-src/ext/spl/examples/autoload.inc:1.3 php-src/ext/spl/examples/autoload.inc:1.4 --- php-src/ext/spl/examples/autoload.inc:1.3 Sun May 2 18:55:22 2004 +++ php-src/ext/spl/examples/autoload.inc Sat May 8 08:24:15 2004 @@ -1,5 +1,8 @@ <?php +/** \internal + * Tries to load class $classname from directory $dir. + */ function __load_class($classname, $dir) { $file = $dir . '/' . $classname . '.inc'; @@ -11,6 +14,14 @@ 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); foreach(split(':', ini_get('include_path')) as $dir) http://cvs.php.net/diff.php/php-src/ext/spl/examples/dba_array.php?r1=1.3&r2=1.4&ty=u Index: php-src/ext/spl/examples/dba_array.php diff -u php-src/ext/spl/examples/dba_array.php:1.3 php-src/ext/spl/examples/dba_array.php:1.4 --- php-src/ext/spl/examples/dba_array.php:1.3 Thu Dec 4 14:39:46 2003 +++ php-src/ext/spl/examples/dba_array.php Sat May 8 08:24:15 2004 @@ -9,7 +9,7 @@ * * Note: configure with --enable-dba * - * (c) Marcus Boerger, 2003 + * (c) Marcus Boerger, 2003 - 2004 */ if ($argc < 4) { @@ -24,55 +24,7 @@ exit(1); } -class DbaArray implements ArrayAccess { - private $db; - - function __construct($file, $handler) - { - $this->db = dba_popen($file, "c", $handler); - if (!$this->db) { - throw new exception("Databse could not be opened"); - } - } - - function __destruct() - { - dba_close($this->db); - } - - function get($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; - } - } - - function set($name, $value) - { - //dba_replace($name, serialize($value), $this->db); - dba_replace($name, $value, $this->db); - return $value; - } - - function exists($name) - { - return dba_exists($name, $this->db); - } - - function del($name) - { - return dba_delete($name, $this->db); - } -} +if (!class_exists("DbaReader", false)) require_once("dbareader.inc"); try { if ($argc > 2) { http://cvs.php.net/diff.php/php-src/ext/spl/examples/dba_dump.php?r1=1.6&r2=1.7&ty=u Index: php-src/ext/spl/examples/dba_dump.php diff -u php-src/ext/spl/examples/dba_dump.php:1.6 php-src/ext/spl/examples/dba_dump.php:1.7 --- php-src/ext/spl/examples/dba_dump.php:1.6 Thu May 6 18:55:25 2004 +++ php-src/ext/spl/examples/dba_dump.php Sat May 8 08:24:15 2004 @@ -9,7 +9,7 @@ * * Note: configure with --enable-dba * - * (c) Marcus Boerger, 2003 + * (c) Marcus Boerger, 2003 - 2004 */ if ($argc < 3) { @@ -24,13 +24,13 @@ exit(1); } -require_once("dba_reader.inc"); -require_once("KeyFilter.inc"); +if (!class_exists("DbaReader")) require_once("dbareader.inc"); +if (!class_exists("KeyFilter")) require_once("keyfilter.inc"); $db = new DbaReader($argv[1], $argv[2]); if ($argc>3) { - $db = new keyFilter($db, $argv[3]); + $db = new KeyFilter($db, $argv[3]); } foreach($db as $key => $val) { http://cvs.php.net/diff.php/php-src/ext/spl/examples/directoryfilterdots.inc?r1=1.1&r2=1.2&ty=u Index: php-src/ext/spl/examples/directoryfilterdots.inc diff -u php-src/ext/spl/examples/directoryfilterdots.inc:1.1 php-src/ext/spl/examples/directoryfilterdots.inc:1.2 --- php-src/ext/spl/examples/directoryfilterdots.inc:1.1 Sun Nov 9 09:05:36 2003 +++ php-src/ext/spl/examples/directoryfilterdots.inc Sat May 8 08:24:15 2004 @@ -1,24 +1,48 @@ <?php +/** \ingroup Examples + * @brief A filtered DirectoryIterator + * @author Marcus Boerger + * @version 1.0 + * + * This Iteraotr takes a pathname from which it creates a DirectoryIterator + * and makes it recursive. Further more it filters the entries '.' and '..'. + */ class DirectoryFilterDots extends FilterIterator implements RecursiveIterator { - function __construct($path) { + /** Construct from a path. + * @param $path directory to iterate + */ + function __construct($path) + { parent::__construct(new DirectoryIterator($path)); } - - function accept() { + + /** @return whether the current entry is neither '.' nor '..' + */ + function accept() + { return !$this->it->isDot(); } - function hasChildren() { + /** @return whether the current entry is a directory + */ + function hasChildren() + { return $this->it->hasChildren(); } - function getChildren() { + /** @return the current subdirectory as a new DirectoryFilterDots instance. + */ + function getChildren() + { return new DirectoryFilterDots($this->it->getPathname()); } - function key() { + /** @return the current entries path name + */ + function key() + { return $this->it->getPathname(); } } http://cvs.php.net/diff.php/php-src/ext/spl/examples/directorytree.inc?r1=1.1&r2=1.2&ty=u Index: php-src/ext/spl/examples/directorytree.inc diff -u php-src/ext/spl/examples/directorytree.inc:1.1 php-src/ext/spl/examples/directorytree.inc:1.2 --- php-src/ext/spl/examples/directorytree.inc:1.1 Sun Nov 9 09:05:36 2003 +++ php-src/ext/spl/examples/directorytree.inc Sat May 8 08:24:15 2004 @@ -1,7 +1,15 @@ <?php +/** \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/diff.php/php-src/ext/spl/examples/directorytreeiterator.inc?r1=1.10&r2=1.11&ty=u Index: php-src/ext/spl/examples/directorytreeiterator.inc diff -u php-src/ext/spl/examples/directorytreeiterator.inc:1.10 php-src/ext/spl/examples/directorytreeiterator.inc:1.11 --- php-src/ext/spl/examples/directorytreeiterator.inc:1.10 Tue Mar 16 05:16:52 2004 +++ php-src/ext/spl/examples/directorytreeiterator.inc Sat May 8 08:24:15 2004 @@ -1,12 +1,22 @@ <?php +/** \ingroup Examples + * @brief DirectoryIterator to generate ASCII graphic directory trees + * @author Marcus Boerger + * @version 1.0 + */ class DirectoryTreeIterator extends RecursiveIteratorIterator { + /** Construct from a path. + * @param $path directory to iterate + */ function __construct($path) { parent::__construct(new CachingRecursiveIterator(new RecursiveDirectoryIterator($path), CIT_CALL_TOSTRING|CIT_CATCH_GET_CHILD), 1); } - + + /** @return the current element prefixed with ASCII graphics + */ function current() { $tree = ''; @@ -16,7 +26,9 @@ 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/diff.php/php-src/ext/spl/examples/emptyiterator.inc?r1=1.1&r2=1.2&ty=u Index: php-src/ext/spl/examples/emptyiterator.inc diff -u php-src/ext/spl/examples/emptyiterator.inc:1.1 php-src/ext/spl/examples/emptyiterator.inc:1.2 --- php-src/ext/spl/examples/emptyiterator.inc:1.1 Tue Apr 27 14:15:00 2004 +++ php-src/ext/spl/examples/emptyiterator.inc Sat May 8 08:24:15 2004 @@ -1,6 +1,6 @@ <?php -/** +/** \ingroup Examples * @brief An empty Iterator * @author Marcus Boerger * @version 1.0 @@ -8,26 +8,42 @@ */ class EmptyIterator implements Iterator { + /** No operation. + * @return void + */ function rewind() { // nothing to do } + /** @return \c false + */ function valid() { return false; } + /** This function must not be called. It throws an exception upon access. + * @throw Exception + * @return void + */ function current() { throw new Exception('Accessing the value of an EmptyIterator'); } + /** This function must not be called. It throws an exception upon access. + * @throw Exception + * @return void + */ function key() { throw new Exception('Accessing the key of an EmptyIterator'); } + /** No operation. + * @return void + */ function next() { // nothing to do http://cvs.php.net/diff.php/php-src/ext/spl/examples/findfile.inc?r1=1.3&r2=1.4&ty=u Index: php-src/ext/spl/examples/findfile.inc diff -u php-src/ext/spl/examples/findfile.inc:1.3 php-src/ext/spl/examples/findfile.inc:1.4 --- php-src/ext/spl/examples/findfile.inc:1.3 Wed Apr 28 15:58:47 2004 +++ php-src/ext/spl/examples/findfile.inc Sat May 8 08:24:15 2004 @@ -1,15 +1,26 @@ <?php +if (!class_exists("FindFile")) require_once("findfile.inc"); +if (!class_exists("AppendIterator")) require_once("appenditerator.inc"); + /** * @brief Base class to find files * @author Marcus Boerger - * @version 1.0 + * @version 1.1 * */ class FindFile extends FilterIterator { - protected $file; + /** @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; @@ -25,10 +36,21 @@ } } + /** @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; + } } ?> \ No newline at end of file http://cvs.php.net/diff.php/php-src/ext/spl/examples/findregex.php?r1=1.1&r2=1.2&ty=u Index: php-src/ext/spl/examples/findregex.php diff -u php-src/ext/spl/examples/findregex.php:1.1 php-src/ext/spl/examples/findregex.php:1.2 --- php-src/ext/spl/examples/findregex.php:1.1 Sun Jan 25 08:03:24 2004 +++ php-src/ext/spl/examples/findregex.php Sat May 8 08:24:15 2004 @@ -24,15 +24,10 @@ exit(1); } -class RegexFindFile extends FindFile -{ - function accept() - { - return preg_match($this->file, $this->current()); - } -} +if (!class_exists("RegexFindFile")) require_once("regexfindfile.inc"); -foreach(new RegexFindFile($argv[1], $argv[2]) as $file) { +foreach(new RegexFindFile($argv[1], $argv[2]) as $file) +{ echo $file->getPathname()."\n"; } http://cvs.php.net/diff.php/php-src/ext/spl/examples/infiniteiterator.inc?r1=1.1&r2=1.2&ty=u Index: php-src/ext/spl/examples/infiniteiterator.inc diff -u php-src/ext/spl/examples/infiniteiterator.inc:1.1 php-src/ext/spl/examples/infiniteiterator.inc:1.2 --- php-src/ext/spl/examples/infiniteiterator.inc:1.1 Tue Apr 27 14:15:00 2004 +++ php-src/ext/spl/examples/infiniteiterator.inc Sat May 8 08:24:15 2004 @@ -1,6 +1,6 @@ <?php -/** +/** \ingroup Examples * @brief An infinite Iterator * @author Marcus Boerger * @version 1.0 @@ -22,38 +22,57 @@ */ class InfiniteIterator implements Iterator { + /** @internal + * The inner Iterator. */ private $it; + /** Construct from another Iterator. + * @param $it the inner Iterator. + */ function __construct(Iterator $it) { $this->it = $it; } + /** @return the inner iterator + */ function getInnerIterator() { return $this->it; } + /** Rewind the inner iterator. + * @return void + */ function rewind() { $this->it->rewind(); } + /** @return whether the current element is valid + */ function valid() { return $this->it->valid(); } + /** @return the current value + */ function current() { return $this->it->current(); } + /** @return the current key + */ function key() { return $this->it->key(); } + /** Move the inner Iterator forward to its next element or rewind it. + * @return void + */ function next() { $this->it->next(); @@ -62,6 +81,13 @@ $this->it->rewind(); } } + + /** Aggregates the inner iterator + */ + function __call($func, $params) + { + return call_user_func_array(array($this->getSubIterator(), $func), $params); + } } ?> \ No newline at end of file http://cvs.php.net/diff.php/php-src/ext/spl/examples/ini_groups.php?r1=1.3&r2=1.4&ty=u Index: php-src/ext/spl/examples/ini_groups.php diff -u php-src/ext/spl/examples/ini_groups.php:1.3 php-src/ext/spl/examples/ini_groups.php:1.4 --- php-src/ext/spl/examples/ini_groups.php:1.3 Thu May 6 18:55:25 2004 +++ php-src/ext/spl/examples/ini_groups.php Sat May 8 08:24:15 2004 @@ -24,8 +24,8 @@ exit(1); } -require_once("dba_reader.inc"); -require_once("IniGroups.inc"); +if (!class_exists("KeyFilter")) require_once("keyfilter.inc"); +if (!class_exists("IniGroups")) require_once("inigroups.inc"); $it = new IniGroups($argv[1]); if ($argc>2) { http://cvs.php.net/diff.php/php-src/ext/spl/examples/searchiterator.inc?r1=1.3&r2=1.4&ty=u Index: php-src/ext/spl/examples/searchiterator.inc diff -u php-src/ext/spl/examples/searchiterator.inc:1.3 php-src/ext/spl/examples/searchiterator.inc:1.4 --- php-src/ext/spl/examples/searchiterator.inc:1.3 Mon Mar 8 12:33:30 2004 +++ php-src/ext/spl/examples/searchiterator.inc Sat May 8 08:24:15 2004 @@ -1,21 +1,49 @@ <?php +/** @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; - function rewind() { + /** Rewind and reset so that it once again searches. + * @return void + */ + function rewind() + { parent::rewind(); $this->done = false; } - function valid() { + /** @return whether the current element is valid + * which can only happen once per iteration. + */ + function valid() + { return !$this->done && parent::valid(); } - function next() { + /** 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->getSubIterator(), $func), $params); + } } ?> \ No newline at end of file http://cvs.php.net/diff.php/php-src/ext/spl/examples/tree.php?r1=1.7&r2=1.8&ty=u Index: php-src/ext/spl/examples/tree.php diff -u php-src/ext/spl/examples/tree.php:1.7 php-src/ext/spl/examples/tree.php:1.8 --- php-src/ext/spl/examples/tree.php:1.7 Sat Dec 13 09:40:06 2003 +++ php-src/ext/spl/examples/tree.php Sat May 8 08:24:15 2004 @@ -6,7 +6,7 @@ * * Simply specify the path to tree with parameter <path>. * - * (c) Marcus Boerger, 2003 + * (c) Marcus Boerger, 2003 - 2004 */ // The following line only operates on classes which are converted to c already. @@ -26,8 +26,11 @@ exit(1); } +if (!class_exists("DirectoryTreeIterator")) require_once("directorytreeiterator.inc"); + echo $argv[1]."\n"; -foreach(new DirectoryGraphIterator($argv[1]) as $file) { +foreach(new DirectoryTreeIterator($argv[1]) as $file) +{ echo $file . "\n"; } http://cvs.php.net/co.php/php-src/ext/spl/internal/cachingiterator.inc?r=1.1&p=1 Index: php-src/ext/spl/internal/cachingiterator.inc +++ php-src/ext/spl/internal/cachingiterator.inc <?php define('CIT_CALL_TOSTRING', 1); define('CIT_CATCH_GET_CHILD', 2); class CachingIterator { protected $it; protected $current; protected $key; protected $valid; protected $strValue; function __construct(Iterator $it, $flags = CIT_CALL_TOSTRING) { $this->it = $it; $this->flags = $flags & (CIT_CALL_TOSTRING|CIT_CATCH_GET_CHILD); $this->next(); } function rewind() { $this->it->rewind(); $this->next(); } function next() { if ($this->valid = $this->it->valid()) { $this->current = $this->it->current(); $this->key = $this->it->key(); if ($this->flags & CIT_CALL_TOSTRING) { if (is_object($this->current)) { $this->strValue = $this->current->__toString(); } else { $this->strValue = (string)$this->current; } } } else { $this->current = NULL; $this->key = NULL; $this->strValue = NULL; } $this->it->next(); } function valid() { return $this->valid; } function hasNext() { return $this->it->valid(); } function current() { return $this->current; } function key() { return $this->key; } function __call($func, $params) { return call_user_func_array(array($this->it, $func), $params); } function __toString() { if (!$this->flags & CIT_CALL_TOSTRING) { throw new exception('CachingIterator does not fetch string value (see CachingIterator::__construct)'); } return $this->strValue; } } ?> http://cvs.php.net/co.php/php-src/ext/spl/internal/cachingrecursiveiterator.inc?r=1.1&p=1 Index: php-src/ext/spl/internal/cachingrecursiveiterator.inc +++ php-src/ext/spl/internal/cachingrecursiveiterator.inc <?php class CachingRecursiveIterator extends CachingIterator implements RecursiveIterator { protected $hasChildren; protected $getChildren; function __construct(RecursiveIterator $it, $flags = CIT_CALL_TOSTRING) { parent::__construct($it, $flags); } function rewind(); { $this->hasChildren = false; $this->getChildren = NULL; parent::rewind(); } function next() { if ($this->hasChildren = $this->it->hasChildren()) { try { //$this->getChildren = new CachingRecursiveIterator($this->it->getChildren(), $this->flags); // workaround memleaks... $child = $this->it->getChildren(); $this->getChildren = new CachingRecursiveIterator($child, $this->flags); } catch(Exception $e) { if (!$this->flags & CIT_CATCH_GET_CHILD) { throw $e; } $this->hasChildren = false; $this->getChildren = NULL; } } else { $this->getChildren = NULL; } parent::next(); } function hasChildren() { return $this->hasChildren; } function getChildren() { return $this->getChildren; } } ?> http://cvs.php.net/co.php/php-src/ext/spl/internal/filteriterator.inc?r=1.1&p=1 Index: php-src/ext/spl/internal/filteriterator.inc +++ php-src/ext/spl/internal/filteriterator.inc <?php /** * @brief Regular expression filter for string iterators * @author Marcus Boerger * @version 1.0 * * Instances of this class act as a filter around iterators. In other words * you can put an iterator into the constructor and the instance will only * return selected (accepted) elements. */ abstract class FilterIterator implements Iterator { protected $it; /** * 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 */ function __construct(Iterator $it) { $this->it = $it; } /** * Rewind the inner iterator. */ function rewind() { $this->it->rewind(); $this->fetch(); } /** * Accept function to decide whether an element of the inner iterator * should be accessible through the Filteriterator. * * @return whether or not to expose the current element of the inner * iterator. */ abstract function accept(); /** * Fetch next element and store it. * * @return void */ protected function fetch() { while ($this->it->valid()) { if ($this->accept()) { return; } $this->it->next(); }; } /** * Move to next element * * @return void */ function next() { $this->it->next(); $this->fetch(); } /** * @return Whether more elements are available */ function valid() { return $this->it->valid(); } /** * @return The current key */ function key() { return $this->it->key(); } /** * @return The current value */ function current() { return $this->it->current(); } /** * hidden __clone */ protected function __clone() { // disallow clone } } ?> http://cvs.php.net/co.php/php-src/ext/spl/internal/limititerator.inc?r=1.1&p=1 Index: php-src/ext/spl/internal/limititerator.inc +++ php-src/ext/spl/internal/limititerator.inc <?php class LimitIterator implements Iterator { protected $it; protected $offset; protected $count; private $pos; // count === NULL means all function __construct(Iterator $it, $offset = 0, $count = -1) { if ($offset < 0) { throw new exception('Parameter offset must be > 0'); } if ($count < 0 && $count != -1) { throw new exception('Parameter count must either be -1 or a value greater than or equal to 0'); } $this->it = $it; $this->offset = $offset; $this->count = $count; $this->pos = 0; } function seek($position) { if ($position < $this->offset) { throw new exception('Cannot seek to '.$position.' which is below offset '.$this->offset); } if ($position > $this->offset + $this->count && $this->count != -1) { throw new exception('Cannot seek to '.$position.' which is behind offset '.$this->offset.' plus count '.$this->count); } if ($this->it instanceof SeekableIterator) { $this->it->seek($position); $this->pos = $position; } else { while($this->pos < $position && $this->it->valid()) { $this->next(); } } } function rewind() { $this->it->rewind(); $this->pos = 0; $this->seek($this->offset); } function valid() { return ($this->count == -1 || $this->pos < $this->offset + $this->count) && $this->it->valid(); } function key() { return $this->it->key(); } function current() { return $this->it->current(); } function next() { $this->it->next(); $this->pos++; } function getPosition() { return $this->pos; } } ?> http://cvs.php.net/co.php/php-src/ext/spl/internal/parentiterator.inc?r=1.1&p=1 Index: php-src/ext/spl/internal/parentiterator.inc +++ php-src/ext/spl/internal/parentiterator.inc <?php class ParentIterator extends FilterIterator implements RecursiveIterator { function __construct(RecursiveIterator $it) { parent::__construct($it); } function accept() { return $this->it->hasChildren(); } function hasChildren() { return $this->it->hasChildren(); } function getChildren() { return new ParentIterator($this->it->getChildren()); } } ?> http://cvs.php.net/co.php/php-src/ext/spl/internal/recursiveiterator.inc?r=1.1&p=1 Index: php-src/ext/spl/internal/recursiveiterator.inc +++ php-src/ext/spl/internal/recursiveiterator.inc <?php interface RecursiveIterator implements Iterator { function hasChildren(); function getChildren(); } ?> http://cvs.php.net/co.php/php-src/ext/spl/internal/recursiveiteratoriterator.inc?r=1.1&p=1 Index: php-src/ext/spl/internal/recursiveiteratoriterator.inc +++ php-src/ext/spl/internal/recursiveiteratoriterator.inc <?php /** * @brief Iterates through recursive iterators * @author Marcus Boerger * @version 1.0 * */ class RecursiveIteratorIterator implements Iterator { protected $ait = array(); protected $count = 0; function __construct(RecursiveIterator $it) { $this->ait[0] = $it; } function rewind() { while ($this->count) { unset($this->ait[$this->count--]); } $this->ait[0]->rewind(); $this->ait[0]->recursed = false; } function valid() { $count = $this->count; while ($count) { $it = $this->ait[$count]; if ($it->valid()) { return true; } $count--; } return false; } function key() { $it = $this->ait[$this->count]; return $it->key(); } function current() { $it = $this->ait[$this->count]; return $it->current(); } function next() { while ($this->count) { $it = $this->ait[$this->count]; if ($it->valid()) { if (!$it->recursed && $it->hasChildren()) { $it->recursed = true; $sub = $it->getChildren(); $sub->recursed = false; $sub->rewind(); if ($sub->valid()) { $this->ait[++$this->count] = $sub; if (!$sub instanceof RecursiveIterator) { throw new Exception(get_class($sub).'::getChildren() must return an object that implements RecursiveIterator'); } return; } unset($sub); } $it->next(); $it->recursed = false; if ($it->valid()) { return; } $it->recursed = false; } if ($this->count) { unset($this->ait[$this->count--]); $it = $this->ait[$this->count]; } } } function getSubIterator($level = NULL) { if (is_null($level)) { $level = $this->count; } return @$this->ait[$level]; } function getDepth() { return $this->level; } } ?> http://cvs.php.net/co.php/php-src/ext/spl/internal/seekableiterator.inc?r=1.1&p=1 Index: php-src/ext/spl/internal/seekableiterator.inc +++ php-src/ext/spl/internal/seekableiterator.inc <?php /** \brief seekable iterator * * Turns a normal iterator ino a seekable iterator. When there is a way * to seek on an iterator LimitIterator can use this to efficiently rewind * to offset. */ interface SeekableIterator implements Iterator { /** Seek to an absolute position * * \param $index position to seek to * \return void * * \note The method should throw an exception if it is not possible to * seek to the given position. */ function seek($index); /* $this->rewind(); $position = 0; while($position < $index && $this->valid()) { $this->next(); $position++; } }*/ } ?> http://cvs.php.net/co.php/php-src/ext/spl/examples/dbaarray.inc?r=1.1&p=1 Index: php-src/ext/spl/examples/dbaarray.inc +++ php-src/ext/spl/examples/dbaarray.inc <?php if (!class_exists("DbaReader")) 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/co.php/php-src/ext/spl/examples/dbareader.inc?r=1.1&p=1 Index: php-src/ext/spl/examples/dbareader.inc +++ php-src/ext/spl/examples/dbareader.inc <?php /** \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) { $this->db = dba_open($file, 'r', $handler); } /** * Close database. */ function __destruct() { if ($this->db) { dba_close($this->db); } } /** * Rewind to first element. */ function rewind() { if ($this->db) { $this->key = dba_firstkey($this->db); } } /** * @return Current data. */ function current() { return $this->val; } /** * Move to next element. * * @return void */ function next() { if ($this->db) { $this->key = dba_nextkey($this->db); if ($this->key !== false) { $this->val = dba_fetch($this->key, $this->db); } } } /** * @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/co.php/php-src/ext/spl/examples/inigroups.inc?r=1.1&p=1 Index: php-src/ext/spl/examples/inigroups.inc +++ php-src/ext/spl/examples/inigroups.inc <?php if (!class_exists("KeyFilter")) require_once("keyfilter.inc"); if (!class_exists("DbaReader")) 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); } } ?> http://cvs.php.net/co.php/php-src/ext/spl/examples/keyfilter.inc?r=1.1&p=1 Index: php-src/ext/spl/examples/keyfilter.inc +++ php-src/ext/spl/examples/keyfilter.inc <?php /** \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 } } ?>
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php