#!/usr/bin/perl
# -*- Mode: Perl -*-
# $Basename: Find.pm $
# $Revision: 1.4 $
# Author : Ulrich Pfeifer
# Created On : Mon Sep 16 19:04:37 1996
# Last Modified By: Ulrich Pfeifer
# Last Modified On: Wed Nov 5 16:50:40 1997
# Language : CPerl
# Update Count : 48
# Status : Unknown, Use with caution!
#
# (C) Copyright 1997, Ulrich Pfeifer, all rights reserved.
#
#
package WAIT::Document::Find;
@ISA = qw(WAIT::Document::Base);
require WAIT::Document::Base;
use FileHandle;
use strict;
use Carp;
sub TIEHASH {
my $type = shift;
my $pred = shift;
my @files = @_;
unless (ref($pred) =~ /CODE/) {
croak "USAGE: tie %HASH, WAIT::Document::Find, coderef, file, ...";
}
my $self = {
Pred => $pred,
Files => \@files
};
bless $self, ref($type) || $type;
}
sub FETCH {
my $self = shift;
my $path = shift;
return undef unless defined $path;
return undef unless -f $path;
my $fh = new FileHandle "< $path";
local($/) = undef;
<$fh>;
}
sub FIRSTKEY {
my $self = shift;
$self->{Pending} = [@{$self->{Files}}];
$self->NEXTKEY;
}
sub NEXTKEY {
my $self = shift;
return undef unless @{$self->{Pending}};
my $next = pop @{$self->{Pending}};
while ($next and -f $next) {
if (&{$self->{Pred}}($next)) {
return $next;
}
$next = pop @{$self->{Pending}};
}
if ($next and -d $next) {
push @{$self->{Pending}}, _expand($next);
}
return $self->NEXTKEY;
}
sub _expand {
my $dir = shift;
my @result;
return () unless -d $dir;
opendir(DIR, $dir) or return ();
@result = map "$dir/$_", grep $_ !~ /^\.\.?$/, readdir(DIR);
closedir DIR;
return @result;
}
sub close {
my $self = shift;
delete $self->{Pred};
delete $self->{Pending};
delete $self->{Files}; # no need at query time
}
1;