diff options
author | Lorry Tar Creator <lorry-tar-importer@baserock.org> | 2013-03-14 05:42:27 +0000 |
---|---|---|
committer | <> | 2013-04-03 16:25:08 +0000 |
commit | c4dd7a1a684490673e25aaf4fabec5df138854c4 (patch) | |
tree | 4d57c44caae4480efff02b90b9be86f44bf25409 /ext/spl/examples | |
download | php2-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')
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"; +} + +?> |