summaryrefslogtreecommitdiff
path: root/ext/spl/examples
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@baserock.org>2013-03-14 05:42:27 +0000
committer <>2013-04-03 16:25:08 +0000
commitc4dd7a1a684490673e25aaf4fabec5df138854c4 (patch)
tree4d57c44caae4480efff02b90b9be86f44bf25409 /ext/spl/examples
downloadphp2-master.tar.gz
Imported from /home/lorry/working-area/delta_php2/php-5.4.13.tar.bz2.HEADphp-5.4.13master
Diffstat (limited to 'ext/spl/examples')
-rw-r--r--ext/spl/examples/autoload.inc50
-rw-r--r--ext/spl/examples/cachingrecursiveiterator.inc28
-rw-r--r--ext/spl/examples/callbackfilteriterator.inc122
-rwxr-xr-xext/spl/examples/class_tree.php113
-rwxr-xr-xext/spl/examples/dba_array.php52
-rwxr-xr-xext/spl/examples/dba_dump.php42
-rw-r--r--ext/spl/examples/dbaarray.inc95
-rw-r--r--ext/spl/examples/dbareader.inc96
-rw-r--r--ext/spl/examples/directoryfilterdots.inc45
-rw-r--r--ext/spl/examples/directorygraphiterator.inc34
-rw-r--r--ext/spl/examples/directorytree.inc27
-rwxr-xr-xext/spl/examples/directorytree.php37
-rw-r--r--ext/spl/examples/directorytreeiterator.inc54
-rw-r--r--ext/spl/examples/dualiterator.inc210
-rw-r--r--ext/spl/examples/findfile.inc65
-rwxr-xr-xext/spl/examples/findfile.php33
-rwxr-xr-xext/spl/examples/findregex.php36
-rwxr-xr-xext/spl/examples/ini_groups.php41
-rw-r--r--ext/spl/examples/inigroups.inc54
-rw-r--r--ext/spl/examples/keyfilter.inc64
-rwxr-xr-xext/spl/examples/nocvsdir.php55
-rwxr-xr-xext/spl/examples/phar_from_dir.php50
-rw-r--r--ext/spl/examples/recursivecomparedualiterator.inc69
-rw-r--r--ext/spl/examples/recursivedualiterator.inc72
-rw-r--r--ext/spl/examples/regexfindfile.inc40
-rw-r--r--ext/spl/examples/searchiterator.inc58
-rw-r--r--ext/spl/examples/tests/dualiterator_001.phpt48
-rw-r--r--ext/spl/examples/tests/examples.inc23
-rwxr-xr-xext/spl/examples/tree.php40
29 files changed, 1753 insertions, 0 deletions
diff --git a/ext/spl/examples/autoload.inc b/ext/spl/examples/autoload.inc
new file mode 100644
index 0000000..5871e7d
--- /dev/null
+++ b/ext/spl/examples/autoload.inc
@@ -0,0 +1,50 @@
+<?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");
+}
+
+?> \ No newline at end of file
diff --git a/ext/spl/examples/cachingrecursiveiterator.inc b/ext/spl/examples/cachingrecursiveiterator.inc
new file mode 100644
index 0000000..4fa6b23
--- /dev/null
+++ b/ext/spl/examples/cachingrecursiveiterator.inc
@@ -0,0 +1,28 @@
+<?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
+{
+}
+
+?> \ No newline at end of file
diff --git a/ext/spl/examples/callbackfilteriterator.inc b/ext/spl/examples/callbackfilteriterator.inc
new file mode 100644
index 0000000..5175701
--- /dev/null
+++ b/ext/spl/examples/callbackfilteriterator.inc
@@ -0,0 +1,122 @@
+<?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;
+ }
+}
+
+?> \ No newline at end of file
diff --git a/ext/spl/examples/class_tree.php b/ext/spl/examples/class_tree.php
new file mode 100755
index 0000000..fc021d5
--- /dev/null
+++ b/ext/spl/examples/class_tree.php
@@ -0,0 +1,113 @@
+<?php
+
+/** @file class_tree.php
+ * @brief Class Tree example
+ * @ingroup Examples
+ * @author Marcus Boerger
+ * @date 2003 - 2008
+ * @version 1.1
+ *
+ * Usage: php class_tree.php \<class\>
+ *
+ * Simply specify the root class or interface to tree with parameter \<class\>.
+ */
+
+if ($argc < 2) {
+ echo <<<EOF
+Usage: php ${_SERVER['PHP_SELF']} <class>
+
+Displays a graphical tree for the given <class>.
+
+<class> The class or interface for which to generate the tree graph.
+
+
+EOF;
+ exit(1);
+}
+
+if (!class_exists("RecursiveTreeIterator", false)) require_once("recursivetreeiterator.inc");
+
+/** \brief Collects sub classes for given class or interface
+ */
+class SubClasses extends RecursiveArrayIterator
+{
+ /** @param base base class to collect sub classes for
+ * @param check_interfaces whether we deal with interfaces
+ */
+ function __construct($base, $check_interfaces = false)
+ {
+ foreach(get_declared_classes() as $cname)
+ {
+ $parent = get_parent_class($cname);
+ if (strcasecmp($parent, $base) == 0)
+ {
+ $this->offsetSet($cname, new SubClasses($cname));
+ }
+ if ($check_interfaces)
+ {
+ if ($parent)
+ {
+ $parent_imp = class_implements($parent);
+ }
+ foreach(class_implements($cname) as $iname)
+ {
+ if (strcasecmp($iname, $base) == 0)
+ {
+ if (!$parent || !in_array($iname, $parent_imp))
+ {
+ $this->offsetSet($cname, new SubClasses($cname));
+ }
+ }
+ }
+ }
+ }
+ if ($check_interfaces)
+ {
+ foreach(get_declared_interfaces() as $cname)
+ {
+ foreach(class_implements($cname) as $iname)
+ {
+ if (strcasecmp($iname, $base) == 0)
+ {
+ $this->offsetSet($cname, new SubClasses($cname, true));
+ }
+ }
+ }
+ }
+ $this->uksort('strnatcasecmp');
+ }
+
+ /** @return key() since that is the name we need
+ */
+ function current()
+ {
+ $result = parent::key();
+ $parent = get_parent_class($result);
+ if ($parent)
+ {
+ $interfaces = array_diff(class_implements($result), class_implements($parent));
+ if ($interfaces)
+ {
+ $implements = array();
+ foreach($interfaces as $interface)
+ {
+ $implements = array_merge($implements, class_implements($interface));
+ }
+ $interfaces = array_diff($interfaces, $implements);
+ natcasesort($interfaces);
+ $result .= ' (' . join(', ', $interfaces) . ')';
+ }
+ }
+ return $result;
+ }
+}
+
+$it = new RecursiveTreeIterator(new SubClasses($argv[1], true));
+
+echo $argv[1]."\n";
+foreach($it as $c=>$v)
+{
+ echo "$v\n";
+}
+
+?> \ No newline at end of file
diff --git a/ext/spl/examples/dba_array.php b/ext/spl/examples/dba_array.php
new file mode 100755
index 0000000..346ac1f
--- /dev/null
+++ b/ext/spl/examples/dba_array.php
@@ -0,0 +1,52 @@
+<?php
+
+/** @file dba_array.php
+ * @brief Program DBA array utility
+ * @ingroup Examples
+ * @author Marcus Boerger
+ * @date 2003 - 2005
+ *
+ * Usage php dba_array.php \<file\> \<handler\> \<key\> [\<value\>]
+ *
+ * If \<value\> is specified then \<key\> is set to \<value\> in \<file\>.
+ * Else the value of \<key\> is printed only.
+ *
+ * Note: configure with --enable-dba
+ */
+
+if ($argc < 4) {
+ echo <<<EOF
+Usage: php ${_SERVER['PHP_SELF']} <file> <handler> <key> [<value>]
+
+If <value> is specified then <key> is set to <value> in <file>.
+Else the value of <key> is printed only.
+
+
+EOF;
+ exit(1);
+}
+
+if (!class_exists("DbaReader", false)) require_once("dbareader.inc");
+
+try {
+ if ($argc > 2) {
+ $dba = new DbaArray($argv[1], $argv[2]);
+ if ($dba && $argc > 3) {
+ if ($argc > 4) {
+ $dba[$argv[3]] = $argv[4];
+ }
+ var_dump(array('Index' => $argv[3], 'Value' => $dba[$argv[3]]));
+ }
+ unset($dba);
+ }
+ else
+ {
+ echo "Not enough parameters\n";
+ exit(1);
+ }
+}
+catch (exception $err) {
+ var_dump($err);
+ exit(1);
+}
+?> \ No newline at end of file
diff --git a/ext/spl/examples/dba_dump.php b/ext/spl/examples/dba_dump.php
new file mode 100755
index 0000000..2c698d4
--- /dev/null
+++ b/ext/spl/examples/dba_dump.php
@@ -0,0 +1,42 @@
+<?php
+
+/** @file dba_dump.php
+ * @brief Program DBA dump utility
+ * @ingroup Examples
+ * @author Marcus Boerger
+ * @date 2003 - 2005
+ *
+ * Usage: php dba_dump.php \<file\> \<handler\> [\<regex\>]
+ *
+ * Show all groups in the ini file specified by \<file\>.
+ * The regular expression \<regex\> is used to filter the by setting name.
+ *
+ * Note: configure with --enable-dba
+ */
+
+if ($argc < 3) {
+ echo <<<EOF
+Usage: php ${_SERVER['PHP_SELF']} <file> <handler> [<regex>]
+
+Show all groups in the ini file specified by <file>.
+The regular expression <regex> is used to filter the by setting name.
+
+
+EOF;
+ exit(1);
+}
+
+if (!class_exists("DbaReader", false)) require_once("dbareader.inc");
+if (!class_exists("KeyFilter", false)) require_once("keyfilter.inc");
+
+$db = new DbaReader($argv[1], $argv[2]);
+
+if ($argc>3) {
+ $db = new KeyFilter($db, $argv[3]);
+}
+
+foreach($db as $key => $val) {
+ echo "'$key' => '$val'\n";
+}
+
+?> \ No newline at end of file
diff --git a/ext/spl/examples/dbaarray.inc b/ext/spl/examples/dbaarray.inc
new file mode 100644
index 0000000..d448ad7
--- /dev/null
+++ b/ext/spl/examples/dbaarray.inc
@@ -0,0 +1,95 @@
+<?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) {
+ //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);
+ }
+}
+
+?>
diff --git a/ext/spl/examples/dbareader.inc b/ext/spl/examples/dbareader.inc
new file mode 100644
index 0000000..b097912
--- /dev/null
+++ b/ext/spl/examples/dbareader.inc
@@ -0,0 +1,96 @@
+<?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;
+ }
+}
+
+?> \ No newline at end of file
diff --git a/ext/spl/examples/directoryfilterdots.inc b/ext/spl/examples/directoryfilterdots.inc
new file mode 100644
index 0000000..37f14b7
--- /dev/null
+++ b/ext/spl/examples/directoryfilterdots.inc
@@ -0,0 +1,45 @@
+<?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();
+ }
+}
+
+?>
diff --git a/ext/spl/examples/directorygraphiterator.inc b/ext/spl/examples/directorygraphiterator.inc
new file mode 100644
index 0000000..5808e3b
--- /dev/null
+++ b/ext/spl/examples/directorygraphiterator.inc
@@ -0,0 +1,34 @@
+<?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
+ );
+ }
+}
+
+?> \ No newline at end of file
diff --git a/ext/spl/examples/directorytree.inc b/ext/spl/examples/directorytree.inc
new file mode 100644
index 0000000..7bd9c2c
--- /dev/null
+++ b/ext/spl/examples/directorytree.inc
@@ -0,0 +1,27 @@
+<?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));
+ }
+}
+
+?> \ No newline at end of file
diff --git a/ext/spl/examples/directorytree.php b/ext/spl/examples/directorytree.php
new file mode 100755
index 0000000..dc26d6c
--- /dev/null
+++ b/ext/spl/examples/directorytree.php
@@ -0,0 +1,37 @@
+<?php
+
+/** @file directorytree.php
+ * @brief Program Directory tree example
+ * @ingroup Examples
+ * @author Marcus Boerger
+ * @date 2003 - 2005
+ *
+ * Usage: php directorytree.php \<path\> [\<start\> [\<count\>]]
+ *
+ * Simply specify the path to tree with parameter \<path\>.
+ */
+
+if ($argc < 2) {
+ echo <<<EOF
+Usage: php ${_SERVER['PHP_SELF']} <path>
+
+Displays a graphical directory tree for the given <path>.
+
+<path> The directory for which to generate the directory tree graph.
+
+
+EOF;
+ exit(1);
+}
+
+if (!class_exists("DirectoryTreeIterator", false)) require_once("directorytreeiterator.inc");
+
+$length = $argc > 3 ? $argv[3] : -1;
+
+echo $argv[1]."\n";
+foreach(new LimitIterator(new DirectoryTreeIterator($argv[1]), @$argv[2], $length) as $key=>$file) {
+//foreach(new DirectoryTreeIterator($argv[1]) as $file) {
+ echo $file . "\n";
+}
+
+?> \ No newline at end of file
diff --git a/ext/spl/examples/directorytreeiterator.inc b/ext/spl/examples/directorytreeiterator.inc
new file mode 100644
index 0000000..8e65d0d
--- /dev/null
+++ b/ext/spl/examples/directorytreeiterator.inc
@@ -0,0 +1,54 @@
+<?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);
+ }
+}
+
+?> \ No newline at end of file
diff --git a/ext/spl/examples/dualiterator.inc b/ext/spl/examples/dualiterator.inc
new file mode 100644
index 0000000..4cee203
--- /dev/null
+++ b/ext/spl/examples/dualiterator.inc
@@ -0,0 +1,210 @@
+<?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();
+ }
+}
+
+?>
diff --git a/ext/spl/examples/findfile.inc b/ext/spl/examples/findfile.inc
new file mode 100644
index 0000000..02ab792
--- /dev/null
+++ b/ext/spl/examples/findfile.inc
@@ -0,0 +1,65 @@
+<?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;
+ }
+}
+
+?> \ No newline at end of file
diff --git a/ext/spl/examples/findfile.php b/ext/spl/examples/findfile.php
new file mode 100755
index 0000000..60146cb
--- /dev/null
+++ b/ext/spl/examples/findfile.php
@@ -0,0 +1,33 @@
+<?php
+
+/** @file findfile.php
+ * @brief Program Find a specific file by name.
+ * @ingroup Examples
+ * @author Marcus Boerger
+ * @date 2003 - 2005
+ *
+ * Usage: php findfile.php \<path\> \<name\>
+ *
+ * \<path\> Path to search in. You can specify multiple paths by separating
+ * them with ';'.
+ * \<name\> Filename to look for.
+ */
+
+if ($argc < 3) {
+ echo <<<EOF
+Usage: php findfile.php <path> <name>
+
+Find a specific file by name.
+
+<path> Path to search in.
+<name> Filename to look for.
+
+
+EOF;
+ exit(1);
+}
+
+if (!class_exists("FindFile", false)) require_once("findfile.inc");
+
+foreach(new FindFile($argv[1], $argv[2]) as $file) echo $file->getPathname()."\n";
+?> \ No newline at end of file
diff --git a/ext/spl/examples/findregex.php b/ext/spl/examples/findregex.php
new file mode 100755
index 0000000..b43ee0c
--- /dev/null
+++ b/ext/spl/examples/findregex.php
@@ -0,0 +1,36 @@
+<?php
+
+/** @file findregex.php
+ * @brief Program Find a specific file by name.
+ * @ingroup Examples
+ * @author Marcus Boerger, Adam Trachtenberg
+ * @date 2004
+ *
+ * Usage: php findregex.php \<path\> \<name\>
+ *
+ * \<path\> Path to search in.
+ * \<name\> Filename to look for.
+ */
+
+if ($argc < 3) {
+ echo <<<EOF
+Usage: php findregex.php <file> <name>
+
+Find a specific file by name.
+
+<path> Path to search in.
+<name> Regex for filenames to look for.
+
+
+EOF;
+ exit(1);
+}
+
+if (!class_exists("RegexFindFile", false)) require_once("regexfindfile.inc");
+
+foreach(new RegexFindFile($argv[1], $argv[2]) as $file)
+{
+ echo $file->getPathname()."\n";
+}
+
+?> \ No newline at end of file
diff --git a/ext/spl/examples/ini_groups.php b/ext/spl/examples/ini_groups.php
new file mode 100755
index 0000000..5136911
--- /dev/null
+++ b/ext/spl/examples/ini_groups.php
@@ -0,0 +1,41 @@
+<?php
+
+/** @file ini_groups.php
+ * @brief Program List groups within an ini file
+ * @ingroup Examples
+ * @author Marcus Boerger
+ * @date 2003 - 2005
+ *
+ * Usage: php dba_dump.php \<file\> [\<regex\>]
+ *
+ * Show all groups in the ini file specified by \<file\>.
+ * The regular expression \<regex\> is used to filter the result.
+ *
+ * Note: configure with --enable-dba
+ */
+
+if ($argc < 2) {
+ echo <<<EOF
+Usage: php dba_dump.php <file> [<regex>]
+
+Show all groups in the ini file specified by <file>.
+The regular expression <regex> is used to filter the result.
+
+
+EOF;
+ exit(1);
+}
+
+if (!class_exists("KeyFilter", false)) require_once("keyfilter.inc");
+if (!class_exists("IniGroups", false)) require_once("inigroups.inc");
+
+$it = new IniGroups($argv[1]);
+if ($argc>2) {
+ $it = new KeyFilter($it, $argv[2]);
+}
+
+foreach($it as $group) {
+ echo "$group\n";
+}
+
+?> \ No newline at end of file
diff --git a/ext/spl/examples/inigroups.inc b/ext/spl/examples/inigroups.inc
new file mode 100644
index 0000000..62cfa3e
--- /dev/null
+++ b/ext/spl/examples/inigroups.inc
@@ -0,0 +1,54 @@
+<?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);
+ }
+}
+
+?> \ No newline at end of file
diff --git a/ext/spl/examples/keyfilter.inc b/ext/spl/examples/keyfilter.inc
new file mode 100644
index 0000000..eaf6b77
--- /dev/null
+++ b/ext/spl/examples/keyfilter.inc
@@ -0,0 +1,64 @@
+<?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
+ }
+}
+
+?> \ No newline at end of file
diff --git a/ext/spl/examples/nocvsdir.php b/ext/spl/examples/nocvsdir.php
new file mode 100755
index 0000000..6993268
--- /dev/null
+++ b/ext/spl/examples/nocvsdir.php
@@ -0,0 +1,55 @@
+<?php
+
+/** @file nocvsdir.php
+ * @brief Program Dir without CVS subdirs
+ * @ingroup Examples
+ * @author Marcus Boerger
+ * @date 2003 - 2006
+ * @version 1.1
+ *
+ * Usage: php nocvsdir.php \<path\>
+ *
+ * Simply specify the path to tree with parameter \<path\>.
+ */
+
+if ($argc < 2) {
+ echo <<<EOF
+Usage: php ${_SERVER['PHP_SELF']} <path>
+
+Show the directory and all it's contents without any CVS directory in <path>.
+
+<path> The directory for which to generate the directory.
+
+
+EOF;
+ exit(1);
+}
+
+if (!class_exists("RecursiveFilterIterator")) require_once("recursivefilteriterator.inc");
+
+class NoCvsDirectory extends RecursiveFilterIterator
+{
+ function __construct($path)
+ {
+ parent::__construct(new RecursiveDirectoryIterator($path));
+ }
+
+ function accept()
+ {
+ return $this->getInnerIterator()->getFilename() != 'CVS';
+ }
+
+ function getChildren()
+ {
+ return new NoCvsDirectory($this->key());
+ }
+}
+
+$it = new RecursiveIteratorIterator(new NoCvsDirectory($argv[1]));
+
+foreach($it as $pathname => $file)
+{
+ echo $pathname."\n";
+}
+
+?> \ No newline at end of file
diff --git a/ext/spl/examples/phar_from_dir.php b/ext/spl/examples/phar_from_dir.php
new file mode 100755
index 0000000..2ee15ca
--- /dev/null
+++ b/ext/spl/examples/phar_from_dir.php
@@ -0,0 +1,50 @@
+<?php
+
+/** @file phar_from_dir.php
+ * @brief Create phar archive from directory
+ * @ingroup examples
+ * @author Marcus Boerger
+ * @date 2003 - 2007
+ * @version 1.0
+ *
+ * Usage: php phar_create_from_dir.php \<archive\> \<directory\> [\<regex\>]
+ *
+ * Create phar archive \<archive\> using entries from \<directory\> that
+ * optionally match \<regex\>.
+ */
+
+if ($argc < 3)
+{
+ echo <<<EOF
+php phar_from_dir.php archive directory [regex]
+
+Packs files in a given directory into a phar archive.
+
+archive name of the archive to create
+directory input directory to pack
+regex optional expression to match files in directory
+
+EOF;
+ exit(1);
+}
+
+$phar = new Phar($argv[1], 0, 'newphar');
+
+$dir = new RecursiveDirectoryIterator($argv[2]);
+$dir = new RecursiveIteratorIterator($dir);
+if ($argc > 3)
+{
+ $dir = new RegexIterator($dir, '/'.$argv[3].'/');
+}
+
+$phar->begin();
+
+foreach($dir as $file)
+{
+ echo "$file\n";
+ copy($file, "phar://newphar/$file");
+}
+
+$phar->commit();
+
+?> \ No newline at end of file
diff --git a/ext/spl/examples/recursivecomparedualiterator.inc b/ext/spl/examples/recursivecomparedualiterator.inc
new file mode 100644
index 0000000..75265c1
--- /dev/null
+++ b/ext/spl/examples/recursivecomparedualiterator.inc
@@ -0,0 +1,69 @@
+<?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();
+ }
+}
+
+?>
diff --git a/ext/spl/examples/recursivedualiterator.inc b/ext/spl/examples/recursivedualiterator.inc
new file mode 100644
index 0000000..cfa3bcc
--- /dev/null
+++ b/ext/spl/examples/recursivedualiterator.inc
@@ -0,0 +1,72 @@
+<?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();
+ }
+}
+
+?>
diff --git a/ext/spl/examples/regexfindfile.inc b/ext/spl/examples/regexfindfile.inc
new file mode 100644
index 0000000..d5dd722
--- /dev/null
+++ b/ext/spl/examples/regexfindfile.inc
@@ -0,0 +1,40 @@
+<?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());
+ }
+}
+
+?> \ No newline at end of file
diff --git a/ext/spl/examples/searchiterator.inc b/ext/spl/examples/searchiterator.inc
new file mode 100644
index 0000000..944a4ac
--- /dev/null
+++ b/ext/spl/examples/searchiterator.inc
@@ -0,0 +1,58 @@
+<?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);
+ }
+}
+
+?> \ No newline at end of file
diff --git a/ext/spl/examples/tests/dualiterator_001.phpt b/ext/spl/examples/tests/dualiterator_001.phpt
new file mode 100644
index 0000000..53c1153
--- /dev/null
+++ b/ext/spl/examples/tests/dualiterator_001.phpt
@@ -0,0 +1,48 @@
+--TEST--
+SPL: DualIterator
+--SKIPIF--
+<?php if (!extension_loaded("spl") || !extension_loaded("reflection")) print "skip"; ?>
+--FILE--
+<?php
+
+function spl_examples_autoload($classname)
+{
+ include(dirname(__FILE__) . '/../' . strtolower($classname) . '.inc');
+}
+
+spl_autoload_register('spl_examples_autoload');
+
+function test($a, $b, $identical = false)
+{
+ var_dump(DualIterator::compareIterators(
+ new RecursiveArrayIterator($a),
+ new RecursiveArrayIterator($b),
+ $identical));
+}
+
+test(array(1,2,3), array(1,2,3));
+test(array(1,2,3), array(1,2));
+test(array(1,array(21,22),3), array(1,array(21,22),3));
+test(array(1,array(21,22),3), array(1,array(21,22,23),3));
+test(array(1,array(21,22),3), array(1,array(21,22,3)));
+test(array(1,array(21,22),3), array(1,array(21),array(22),3));
+test(array(1,2,3), array(1,"2",3), false);
+test(array(1,2,3), array(1,"2",3), true);
+test(array(1,array(21,22),3), array(1,array(21,"22"),3), false);
+test(array(1,array(21,22),3), array(1,array(21,"22"),3), true);
+
+?>
+===DONE===
+<?php exit(0); ?>
+--EXPECT--
+bool(true)
+bool(false)
+bool(true)
+bool(false)
+bool(false)
+bool(false)
+bool(true)
+bool(false)
+bool(true)
+bool(false)
+===DONE===
diff --git a/ext/spl/examples/tests/examples.inc b/ext/spl/examples/tests/examples.inc
new file mode 100644
index 0000000..feeba7d
--- /dev/null
+++ b/ext/spl/examples/tests/examples.inc
@@ -0,0 +1,23 @@
+<?php
+
+class IncludeFiles extends ArrayIterator
+{
+ function __construct($path, $classes)
+ {
+ parent::__construct();
+ foreach($classes as $c)
+ {
+ $this->append($path . '/' . strtolower($c) . '.inc');
+ }
+ }
+}
+
+$classes = array(
+);
+
+foreach (new IncludeFiles(dirname(__FILE__). '/..', $classes) as $file)
+{
+ require_once($file);
+}
+
+?> \ No newline at end of file
diff --git a/ext/spl/examples/tree.php b/ext/spl/examples/tree.php
new file mode 100755
index 0000000..9c2cc55
--- /dev/null
+++ b/ext/spl/examples/tree.php
@@ -0,0 +1,40 @@
+<?php
+
+/** @file tree.php
+ * @brief Program Tree view example
+ * @ingroup Examples
+ * @author Marcus Boerger
+ * @date 2003 - 2005
+ *
+ * Usage: php tree.php \<path\>
+ *
+ * Simply specify the path to tree with parameter \<path\>.
+ */
+
+// The following line only operates on classes which are converted to c already.
+// But does not generate a graphical output.
+//foreach(new RecursiveIteratorIterator(new ParentIterator(new RecursiveDirectoryIterator($argv[1])), 1) as $file) {
+
+if ($argc < 2) {
+ echo <<<EOF
+Usage: php ${_SERVER['PHP_SELF']} <path>
+
+Displays a graphical tree for the given <path>.
+
+<path> The directory for which to generate the tree graph.
+
+
+EOF;
+ exit(1);
+}
+
+if (!class_exists("DirectoryTreeIterator", false)) require_once("directorytreeiterator.inc");
+if (!class_exists("DirectoryGraphIterator", false)) require_once("directorygraphiterator.inc");
+
+echo $argv[1]."\n";
+foreach(new DirectoryGraphIterator($argv[1]) as $file)
+{
+ echo $file . "\n";
+}
+
+?>