+++ /dev/null
-<?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
- * @param 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);
- }
-
- /**
- * Check whether a value can be accepted.
- *
- * @param value used to test
- * @return whether input is acceptable
- */
- protected function accept($value) {
- return ereg($this->regex, $value);
- }
-
- /**
- * Fetch next element and store it.
- */
- protected function fetch() {
- $this->curr = false;
- while ($this->it->hasMore()) {
- $curr = $this->it->current();
- if ($this->accept($curr)) {
- $this->curr = $curr;
- return;
- }
- $this->it->next();
- };
- }
-
- /**
- * Move to next element
- */
- function next() {
- $this->it->next();
- $this->fetch();
- }
-
- /**
- * @return Whether more elements are available
- */
- function hasMore() {
- 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
+++ /dev/null
-<?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, $graph = false) {
- $this->cnt = 0;
- $this->path = $path;
- $this->nodots = $nodots;
- $this->graph = $graph;
- }
-
- /**
- * 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 ($dir->hasMore()) {
- $ent = $dir->current();
- if ($ent != '.' && $ent != '..') {
- break;
- }
- $dir->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->getPath().'/'.$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) {
- $dir->has_more = false;
- while ($new->hasMore()) {
- $ent = $new->current();
- if ($ent != '.' && $ent != '..') {
- $dir->has_more = true;
- break;
- }
- $new->next();
- }
- } else {
- $dir->has_more = $dir->hasMore();
- }
- }
- $dir->next();
- }
- }
-
- /**
- * @return Whether more dirs or files entries are available.
- */
- function hasMore() {
- while ($this->cnt) {
- $dir = $this->adir[$this->cnt];
- if ($dir->hasMore()) {
- return true;
- }
- unset($this->adir[$this->cnt--]);
- }
- return false;
- }
-
- /**
- * @return The current dir or file entry.
- */
- function current() {
- if ($this->cnt) {
- if ($this->graph) {
- $prefix = '';
- for ($i = 1; $i < $this->cnt; $i++) {
- $dir = $this->adir[$i];
- $prefix .= $dir->hasMore() ? '| ' : ' ';
- }
- $dir = $this->adir[$this->cnt];
- $ent = $dir->current();
- $prefix .= $dir->hasMore() ? '+-' : '\-';
- return $prefix . $ent;
- } else {
- $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