summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarcus Boerger <helly@php.net>2003-07-16 20:18:33 +0000
committerMarcus Boerger <helly@php.net>2003-07-16 20:18:33 +0000
commit49277b2ac6ab8175a64174174daddbc3413bbee3 (patch)
tree4578fe1e94e9a0bd210a131d9afad01e84fa3be1
parent1131d43b0bbf52548e5298bf8b444cef0556954c (diff)
downloadphp-git-49277b2ac6ab8175a64174174daddbc3413bbee3.tar.gz
More examples
-rwxr-xr-xext/spl/examples/filter.inc92
-rwxr-xr-xext/spl/examples/filter_tree.php20
-rwxr-xr-xext/spl/examples/sub_dir.inc116
3 files changed, 228 insertions, 0 deletions
diff --git a/ext/spl/examples/filter.inc b/ext/spl/examples/filter.inc
new file mode 100755
index 0000000000..23fe38cbae
--- /dev/null
+++ b/ext/spl/examples/filter.inc
@@ -0,0 +1,92 @@
+<?php
+
+/**
+ * @brief Regular expression filter for string iterators
+ * @author Marcus Boerger
+ * @version 1.0
+ *
+ * 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 filter implements spl_forward
+{
+ protected $it;
+ protected $regex;
+ protected $curr;
+
+ /**
+ * 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
+ * @patam regex Regular expression used as a filter.
+ */
+ function __construct(spl_forward $it, $regex) {
+ if ($it instanceof spl_sequence) {
+ $it->rewind();
+ }
+ $this->it = $it;
+ $this->regex = $regex;
+ $this->fetch();
+ }
+
+ /**
+ * Destruct the iterator.
+ */
+ function __destruct() {
+ unset($this->it);
+ }
+
+ /**
+ * Fetch next element and store it.
+ *
+ * @return void
+ */
+ protected function fetch() {
+ $this->curr = false;
+ while ($this->it->has_more()) {
+ $curr = $this->it->current();
+ if (ereg($this->regex, $curr)) {
+ $this->curr = $curr;
+ return;
+ }
+ $this->it->next();
+ };
+ }
+
+ /**
+ * Move to next element
+ *
+ * @return void
+ */
+ function next() {
+ $this->it->next();
+ $this->fetch();
+ }
+
+ /**
+ * @return Whether more elements are available
+ */
+ function has_more() {
+ return $this->curr !== false;
+ }
+
+ /**
+ * @return The current value
+ */
+ function current() {
+ return $this->curr;
+ }
+
+ /**
+ * hidden __clone
+ */
+ protected function __clone() {
+ // disallow clone
+ }
+}
+
+?> \ No newline at end of file
diff --git a/ext/spl/examples/filter_tree.php b/ext/spl/examples/filter_tree.php
new file mode 100755
index 0000000000..8ee4cef556
--- /dev/null
+++ b/ext/spl/examples/filter_tree.php
@@ -0,0 +1,20 @@
+<?php
+
+/* tree view example
+ *
+ * Usage: php filter_tree.php <path> <regex>
+ *
+ * Simply specify the path to tree with parameter <path>.
+ * The regular expression <regex> is used to filter the tree.
+ *
+ * (c) Marcus Boerger
+ */
+
+require_once("sub_dir.inc");
+require_once("filter.inc");
+
+foreach(new filter(new sub_dir($argv[1]), $argv[2]) as $f) {
+ echo "$f\n";
+}
+
+?> \ No newline at end of file
diff --git a/ext/spl/examples/sub_dir.inc b/ext/spl/examples/sub_dir.inc
new file mode 100755
index 0000000000..74477c82eb
--- /dev/null
+++ b/ext/spl/examples/sub_dir.inc
@@ -0,0 +1,116 @@
+<?php
+
+/**
+ * @brief Subdirectory aware directory iterator.
+ * @author Marcus Boerger
+ * @version 1.0
+ *
+ * This directory iterator recursively returns all files and directories
+ * within a given path.
+ */
+class sub_dir implements spl_sequence
+{
+ protected $adir = array();
+ protected $cnt = 0;
+ protected $path = "";
+ protected $curr = "";
+ protected $nodots = true;
+
+ /**
+ * Construct a directory from a path.
+ *
+ * @param path The path to iterate.
+ * @param nodots Whether or not to display the entries '.' and '..'.
+ */
+ function __construct($path, $nodots = true) {
+ $this->cnt = 0;
+ $this->path = $path;
+ }
+
+ /**
+ * Rewind the directory.
+ *
+ * @return void
+ */
+ function rewind() {
+ while($this->cnt) {
+ unset($this->adir[$this->cnt--]);
+ }
+ $dir = new spl_dir($this->path);
+ $dir->path = "";
+ $this->adir[1] = $dir;
+ $this->cnt = 1;
+ if ($this->nodots) {
+ while ($this->has_more()) {
+ $ent = $this->current();
+ if ($ent != '.' && $ent != '..') {
+ break;
+ }
+ $this->next();
+ }
+ }
+ }
+
+ /**
+ * Move to net dir or file entry.
+ *
+ * @return void
+ */
+ function next() {
+ if ($this->cnt) {
+ $dir = $this->adir[$this->cnt];
+ $ent = $dir->current();
+ $path = $dir->get_path().'/'.$ent;
+ if ($ent != '.' && $ent != '..' && is_dir($path)) {
+ $new = new spl_dir($path);
+ $new->path = $dir->path.$ent.'/';
+ $new->cnt = $this->cnt++;
+ $this->adir[$this->cnt] = $new;
+ if ($this->nodots) {
+ while ($new->has_more()) {
+ $ent = $new->current();
+ if ($ent != '.' && $ent != '..') {
+ break;
+ }
+ $new->next();
+ }
+ }
+ }
+ $dir->next();
+ }
+ }
+
+ /**
+ * @return Whether more dirs or files entries are available.
+ */
+ function has_more() {
+ while ($this->cnt) {
+ $dir = $this->adir[$this->cnt];
+ if ($dir->has_more()) {
+ return true;
+ }
+ unset($this->adir[$this->cnt--]);
+ }
+ return false;
+ }
+
+ /**
+ * @return The current dir or file entry.
+ */
+ function current() {
+ if ($this->cnt) {
+ $dir = $this->adir[$this->cnt];
+ return $dir->path . $dir->current();
+ }
+ throw new exception("No more elements available");
+ }
+
+ /**
+ * Hidden __clone
+ */
+ protected function __clone() {
+ // disallow clone
+ }
+}
+
+?> \ No newline at end of file