diff options
Diffstat (limited to 'Master/tlpkg/tlperl/lib/fastcwd.pl')
-rwxr-xr-x | Master/tlpkg/tlperl/lib/fastcwd.pl | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/Master/tlpkg/tlperl/lib/fastcwd.pl b/Master/tlpkg/tlperl/lib/fastcwd.pl new file mode 100755 index 00000000000..ecd87c8a035 --- /dev/null +++ b/Master/tlpkg/tlperl/lib/fastcwd.pl @@ -0,0 +1,43 @@ +# By John Bazik +# +# This library is no longer being maintained, and is included for backward +# compatibility with Perl 4 programs which may require it. +# +# In particular, this should not be used as an example of modern Perl +# programming techniques. +# +# Suggested alternative: Cwd +# +# Usage: $cwd = &fastcwd; +# +# This is a faster version of getcwd. It's also more dangerous because +# you might chdir out of a directory that you can't chdir back into. + +sub fastcwd { + local($odev, $oino, $cdev, $cino, $tdev, $tino); + local(@path, $path); + local(*DIR); + + ($cdev, $cino) = stat('.'); + for (;;) { + ($odev, $oino) = ($cdev, $cino); + chdir('..'); + ($cdev, $cino) = stat('.'); + last if $odev == $cdev && $oino == $cino; + opendir(DIR, '.'); + for (;;) { + $_ = readdir(DIR); + next if $_ eq '.'; + next if $_ eq '..'; + + last unless $_; + ($tdev, $tino) = lstat($_); + last unless $tdev != $odev || $tino != $oino; + } + closedir(DIR); + unshift(@path, $_); + } + chdir($path = '/' . join('/', @path)); + $path; +} +1; |