|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T g
Length: 2963 (0xb93)
Types: TextFile
Names: »glob.pl«
└─⟦4f9d7c866⟧ Bits:30007245 EUUGD6: Sikkerheds distributionen
└─⟦3da311d67⟧ »./cops/1.04/cops_104.tar.Z«
└─⟦6a2577110⟧
└─⟦4f9d7c866⟧ Bits:30007245 EUUGD6: Sikkerheds distributionen
└─⟦6a2577110⟧ »./cops/1.04/cops_104.tar«
└─⟦this⟧ »cops_104/perl/glob.pl«
#
# This does shell or perl globbing without resorting
# to the shell -- we were having problems with the shell blowing
# up with extra long pathnames and lots of file names. set $glob'debug
# for trace information.
#
# tom christiansen <tchrist@convex.com>
package glob;
sub main'glob {
local($expr) = @_;
local(@files);
$? = 0;
open(SAVERR, ">&STDERR"); close(STDERR); # suppress args too long
@files = <${expr}>;
if ($?) {
print SAVERR "shell glob blew up on $expr\n" if $debug;
@files = &SHglob($expr);
}
open (STDERR, ">&SAVERR");
# if (@files == 1 && $files[0] eq $expr) { @files = ''; } # sh foo
@files;
}
sub main'SHglob {
local($expr) = @_;
local(@retlist) = ();
local($dir);
print "SHglob: globbing $expr\n" if $debug;
$expr =~ s/([.{+\\])/\\$1/g;
$expr =~ s/\*/.*/g;
$expr =~ s/\?/./g;
for $dir (split(' ',$expr)) {
push(@retlist, &main'REglob($dir));
}
return sort @retlist;
}
sub main'REglob {
local($path) = @_;
local($_);
local(@retlist) = ();
local($root,$expr,$pos);
local($relative) = 0;
local(@dirs);
local($user);
$haveglobbed = 0;
@dirs = split(/\/+/, $path);
if ($dirs[$[] =~ m!~(.*)!) {
$dirs[$[] = &homedir($1);
return @retlist unless $dirs[$[];
} elsif ($dirs[$[] eq '') {
$dirs[$[] = '/' unless $dirs[$[] =~ m!^\.{1,2}$!;
} else {
unshift(@dirs, '.');
$relative = 1;
}
printf "REglob: globbing %s\n", join('/',@dirs) if $debug;
@retlist = &expand(@dirs);
for (@retlist) {
if ($relative) {
s!^\./!!o;
}
s!/{2,}!/!g;
}
return sort @retlist;
}
sub expand {
local($dir, $thisdir, @rest) = @_;
local($nextdir);
local($_);
local(@retlist) = ();
local(*DIR);
unless ($haveglobbed || $thisdir =~ /([^\\]?)[?.*{[+\\]/ && $1 ne '\\') {
@retlist = ($thisdir);
} else {
unless (opendir(DIR,$dir)) {
warn "glob: can't opendir $dir: $!\n" if $debug;
} else {
@retlist = grep(/^$thisdir$/,readdir(DIR));
@retlist = grep(!/^\./, @retlist) unless $thisdir =~ /^\\\./;
$haveglobbed++;
}
closedir DIR;
}
for (@retlist) {
$_ = $dir . '/' . $_;
}
if ($nextdir = shift @rest) {
local(@newlist) = ();
for (@retlist) {
push(@newlist,&expand($_,$nextdir,@rest));
}
@retlist = @newlist;
}
return @retlist;
}
sub homedir {
local($user) = @_;
local(@pwent);
# global %homedir
if (!$user) {
return $ENV{'HOME'} if $ENV{'HOME'};
($user = $ENV{'USER'}) ||
($user = getlogin) ||
(($user) = getpwnam($>));
warn "glob'homedir: who are you, user #$>?\n" unless $user;
return '/';
}
unless (defined $homedir{$user}) {
if (@pwent = getpwnam($user)) {
$homedir{$user} = $pwent[$#pwent - 1];
} else {
warn "glob'homedir: who are you, user #$>?\n" unless $user;
$homedir{$user} = '/';
}
}
return $homedir{$user};
}
1;