;;;;;;;;;;;
package pwd;
sub main'initpwd {
if ($ENV{'PWD'}) {
local($dd,$di) = stat('.');
local($pd,$pi) = stat($ENV{'PWD'});
if (!defined $dd or !defined $pd or $di != $pi or $dd != $pd) {
chop($ENV{'PWD'} = `pwd`);
}
}
else {
chop($ENV{'PWD'} = `pwd`);
}
if ($ENV{'PWD'} =~ m|(/[^/]+(/[^/]+/[^/]+))(.*)|) {
local($pd,$pi) = stat($2);
local($dd,$di) = stat($1);
if (defined $pd and defined $dd and $di == $pi and $dd == $pd) {
$ENV{'PWD'}="$2$3";
}
}
}
sub main'chdir {
local($newdir) = shift;
$newdir =~ s|/{2,}|/|g;
if (chdir $newdir) {
if ($newdir =~ m $ENV{'PWD'} = $newdir;
}
else {
local(@curdir) = split(m @curdir = '' unless @curdir;
foreach $component (split(m next if $component eq '.';
pop(@curdir),next if $component eq '..';
push(@curdir,$component);
}
$ENV{'PWD'} = join('/',@curdir) || '/';
}
}
else {
0;
}
}
1;