MakeMaker 3.8
[p5sagit/p5-mst-13.2.git] / lib / pwd.pl
1 ;# pwd.pl - keeps track of current working directory in PWD environment var
2 ;#
3 ;# $RCSfile: pwd.pl,v $$Revision: 4.1 $$Date: 92/08/07 18:24:11 $
4 ;#
5 ;# $Log:        pwd.pl,v $
6 ;#
7 ;# Usage:
8 ;#      require "pwd.pl";
9 ;#      &initpwd;
10 ;#      ...
11 ;#      &chdir($newdir);
12
13 package pwd;
14
15 sub main'initpwd {
16     if ($ENV{'PWD'}) {
17         local($dd,$di) = stat('.');
18         local($pd,$pi) = stat($ENV{'PWD'});
19         if ($di != $pi || $dd != $pd) {
20             chop($ENV{'PWD'} = `pwd`);
21         }
22     }
23     else {
24         chop($ENV{'PWD'} = `pwd`);
25     }
26     if ($ENV{'PWD'} =~ m|(/[^/]+(/[^/]+/[^/]+))(.*)|) {
27         local($pd,$pi) = stat($2);
28         local($dd,$di) = stat($1);
29         if ($di == $pi && $dd == $pd) {
30             $ENV{'PWD'}="$2$3";
31         }
32     }
33 }
34
35 sub main'chdir {
36     local($newdir) = shift;
37     if (chdir $newdir) {
38         if ($newdir =~ m#^/#) {
39             $ENV{'PWD'} = $newdir;
40         }
41         else {
42             local(@curdir) = split(m#/#,$ENV{'PWD'});
43             @curdir = '' unless @curdir;
44             foreach $component (split(m#/#, $newdir)) {
45                 next if $component eq '.';
46                 pop(@curdir),next if $component eq '..';
47                 push(@curdir,$component);
48             }
49             $ENV{'PWD'} = join('/',@curdir) || '/';
50         }
51     }
52     else {
53         0;
54     }
55 }
56
57 1;