I removed my self-written code to resolve "..", "...", "...." and so on and
replaced it by a single call to abs_path(). That is more reliable!
- file_name() and upper_path() now take care of a
"multiple-slash-root-directory" and Windows drive letters
# Some shared sub routines
#
# Author: Patrick Canterino <patrick@patshaping.de>
# Some shared sub routines
#
# Author: Patrick Canterino <patrick@patshaping.de>
-# Last modified: 2005-01-07
+# Last modified: 2005-01-08
my $last = file_name($path);
$last = '' if($last eq '.');
my $last = file_name($path);
$last = '' if($last eq '.');
+ if($last eq '..' || ($^O eq 'MSWin32' && $last =~ m!^\.\.\.+$!))
- $first = upper_path($first);
+ $first = abs_path($first.'/'.$last);
- elsif($^O eq 'MSWin32' && $last =~ m!^\.\.\.+$!)
- {
- # Windows allows to go upwards in a path using things like
- # "..." and "...." and so on
-
- my $count = length($last)-1;
-
- for(my $x=0;$x<$count;$x++)
- {
- unless($first =~ m!^[a-z]{1}:(/|\\)$!i)
- {
- $first = upper_path($first);
- }
- }
-
- $last = '';
- }
$path = File::Spec->canonpath($first.'/'.$last);
$path = File::Spec->canonpath($first.'/'.$last);
my $path = shift;
$path =~ tr!\\!/!;
my $path = shift;
$path =~ tr!\\!/!;
+ unless($path =~ m!^/+$! || ($^O eq 'MSWin32' && $path =~ m!^[a-z]:/+$!))
{
$path =~ s!/+$!!;
$path = substr($path,rindex($path,'/')+1);
{
$path =~ s!/+$!!;
$path = substr($path,rindex($path,'/')+1);
my $path = shift;
$path =~ tr!\\!/!;
my $path = shift;
$path =~ tr!\\!/!;
+ unless($path =~ m!^/+$! || ($^O eq 'MSWin32' && $path =~ m!^[a-z]:/+$!))
{
$path =~ s!/+$!!;
$path = substr($path,0,rindex($path,'/')+1);
{
$path =~ s!/+$!!;
$path = substr($path,0,rindex($path,'/')+1);