helly           Wed Jul 16 16:18:33 2003 EDT

  Added files:                 
    /spl/examples       filter.inc filter_tree.php sub_dir.inc 
  Log:
  More examples
  

Index: spl/examples/filter.inc
+++ spl/examples/filter.inc
<?php

/**
 * @brief Regular expression filter for string iterators
 * @author Marcus Boerger
 * @version 1.0
 *
 * Instances of this class act as a filter around iterators 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 
        }
}

?>
Index: spl/examples/filter_tree.php
+++ spl/examples/filter_tree.php
<?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";
}

?>
Index: spl/examples/sub_dir.inc
+++ spl/examples/sub_dir.inc
<?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 
        }
}

?>


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

Reply via email to