[MacPerl-Porters] [PATCHES] A new catdir()

[email protected] (Thomas Wegner)
Newsgroups perl.macperl.porters
Message-ID <p04320400b7ef6a85c6b1@[149.225.19.52]>
Hi Chris,

here are the patches for File::Spec, File::Spec::Unix and File::Spec::Mac. There's a new catdir() as discussed earlier, some related fixes and a documentation update. Please note: When applying the documentation patches against bleadperl, it may be that the general File::Spec documentation has moved from File::Spec::Unix to File::Spec. So you might need to adjust the patches (sorry).

As expected, the two File::Find tests don't work properly with the new catdir(). Hence, there are also patches for both test files. Fortunately, when running the MacPerl test-suite, no other test fails due to the changed catdir(). Future will show if we need to fix something else.

And here are the 5 patches:


(1) File::Spec

diff -ru :perl:lib:File:Spec.pm.orig5.6.1b1 :perl:lib:File:Spec.pm
--- :perl:lib:File:Spec.pm.orig5.6.1b1	Thu Oct  4 11:36:22 2001
+++ :perl:lib:File:Spec.pm	Sat Oct 13 19:34:54 2001
@@ -58,7 +58,7 @@
 only under that OS, it may not be possible to load all modules under all
 operating systems.
 
-Since File::Spec is object oriented, subroutines should not called directly,
+Since File::Spec is object oriented, subroutines should not be called directly,
 as in:
 
 	File::Spec::catfile('a','b');
@@ -87,7 +87,7 @@
 <F<[email protected]>>, Tim Bunce <F<[email protected]>>. VMS
 support by Charles Bailey <F<[email protected]>>.  OS/2 support by
 Ilya Zakharevich <F<[email protected]>>. Mac support by Paul Schinder
-<F<[email protected]>>.  abs2rel() and rel2abs() written by
-Shigio Yamaguchi <F<[email protected]>>, modified by Barrie Slaymaker
-<F<[email protected]>>.  splitpath(), splitdir(), catpath() and catdir()
-by Barrie Slaymaker.
+<F<[email protected]>> and Thomas Wegner <F<[email protected]>>.  
+abs2rel() and rel2abs() written by Shigio Yamaguchi <F<[email protected]>>, 
+modified by Barrie Slaymaker <F<[email protected]>>.  splitpath(), splitdir(), 
+catpath() and catdir() by Barrie Slaymaker.


(2) File::Spec::Unix

diff -ru :perl:lib:File:Spec:Unix.pm.orig5.6.1b1 :perl:lib:File:Spec:Unix.pm
--- :perl:lib:File:Spec:Unix.pm.orig5.6.1b1	Thu Oct  4 11:36:29 2001
+++ :perl:lib:File:Spec:Unix.pm	Sat Oct 13 19:47:27 2001
@@ -167,9 +167,8 @@
 
 Takes as argument a path and returns true if it is an absolute path.
 
-This does not consult the local filesystem on Unix, Win32, or OS/2.  It
-does sometimes on MacOS (see L<File::Spec::MacOS/file_name_is_absolute>).
-It does consult the working environment for VMS (see
+This does not consult the local filesystem on Unix, Win32, OS/2 or Mac 
+OS (Classic).  It does consult the working environment for VMS (see
 L<File::Spec::VMS/file_name_is_absolute>).
 
 =cut
@@ -252,7 +251,7 @@
 
 Unlike just splitting the directories on the separator, empty
 directory names (C<''>) can be returned, because these are significant
-on some OSs (e.g. MacOS).
+on some OSs.
 
 On Unix,
 
@@ -333,9 +332,7 @@
 If $path is relative, it is converted to absolute form using L</rel2abs()>.
 This means that it is taken to be relative to L<cwd()>.
 
-No checks against the filesystem are made on most systems.  On MacOS,
-the filesystem may be consulted (see
-L<File::Spec::MacOS/file_name_is_absolute>).  On VMS, there is
+No checks against the filesystem are made.  On VMS, there is
 interaction with the working environment, as logicals and
 macros are expanded.
 
@@ -413,9 +410,7 @@
 
 If $path is absolute, it is cleaned up and returned using L</canonpath()>.
 
-No checks against the filesystem are made on most systems.  On MacOS,
-the filesystem may be consulted (see
-L<File::Spec::MacOS/file_name_is_absolute>).  On VMS, there is
+No checks against the filesystem are made.  On VMS, there is
 interaction with the working environment, as logicals and
 macros are expanded.
 


(3) File::Spec::Mac


diff -ru :perl:lib:File:Spec:Mac.pm.orig5.6.1b1 :perl:lib:File:Spec:Mac.pm
--- :perl:lib:File:Spec:Mac.pm.orig5.6.1b1	Thu Oct  4 11:36:29 2001
+++ :perl:lib:File:Spec:Mac.pm	Sat Oct 13 19:34:10 2001
@@ -4,7 +4,7 @@
 use vars qw(@ISA $VERSION);
 require File::Spec::Unix;
 
-$VERSION = '1.2';
+$VERSION = '1.3';
 
 @ISA = qw(File::Spec::Unix);
 
@@ -12,7 +12,7 @@
 
 =head1 NAME
 
-File::Spec::Mac - File::Spec for MacOS
+File::Spec::Mac - File::Spec for Mac OS (Classic)
 
 =head1 SYNOPSIS
 
@@ -28,7 +28,7 @@
 
 =item canonpath
 
-On MacOS, there's nothing to be done.  Returns what it's given.
+On Mac OS, there's nothing to be done. Returns what it's given.
 
 =cut
 
@@ -40,9 +40,17 @@
 =item catdir
 
 Concatenate two or more directory names to form a path separated by colons
-(":") ending with a directory.  Automatically puts a trailing ":" on the
-end of the complete path, because that's what's done in MacPerl's
-environment and helps to distinguish a file path from a directory path.
+(":") ending with a directory. Resulting paths are B<relative> by default,
+but can be forced to be absolute (but avoid this, see below). Automatically 
+puts a trailing ":" on the end of the complete path, because that's what's 
+done in MacPerl's environment and helps to distinguish a file path from a 
+directory path.
+
+B<IMPORTANT NOTE:> Beginning with version 1.3 of this module, the resulting 
+path is relative by default and I<not> absolute. This descision was made due 
+to portability reasons. Since C<File::Spec-E<gt>catdir()> returns relative paths 
+on all other operating systems, it will now also follow this convention on Mac 
+OS. Note that this may break some existing scripts.
 
 The intended purpose of this routine is to concatenate I<directory names>.
 But because of the nature of Macintosh paths, some additional possibilities
@@ -51,100 +59,237 @@
 I<paths> instead of directory names (strictly speaking, a string like ":a"
 is a path, but not a name, since it contains a punctuation character ":").
 
-Here are the rules that are used: Each argument has its trailing ":" removed.
-Each argument, except the first, has its leading ":" removed.  They are then
-joined together by a ":" and a trailing ":" is added to the path.
-
 So, beside calls like
 
-    File::Spec->catdir("a") = "a:"
-    File::Spec->catdir("a","b") = "a:b:"
-    File::Spec->catdir("","a","b") = ":a:b:"
-    File::Spec->catdir("a","","b") = "a::b:"
-    File::Spec->catdir("") = ":"
-    File::Spec->catdir("a","b","") = "a:b::"     (!)
-    File::Spec->catdir() = ""                    (special case)
+    catdir("a") = ":a:"
+    catdir("a","b") = ":a:b:"
+    catdir() = ""                    (special case)
 
 calls like the following
 
-    File::Spec->catdir("a:",":b") = "a:b:"
-    File::Spec->catdir("a:b:",":c") = "a:b:c:"
-    File::Spec->catdir("a:","b") = "a:b:"
-    File::Spec->catdir("a",":b") = "a:b:"
-    File::Spec->catdir(":a","b") = ":a:b:"
-    File::Spec->catdir("","",":a",":b") = "::a:b:"
-    File::Spec->catdir("",":a",":b") = ":a:b:" (!)
-    File::Spec->catdir(":") = ":"
+    catdir(":a:") = ":a:"
+    catdir(":a","b") = ":a:b:"
+    catdir(":a:","b") = ":a:b:"
+    catdir(":a:",":b:") = ":a:b:"
+    catdir(":") = ":"
 
 are allowed.
 
-To get a path beginning with a ":" (a relative path), put a "" as the first
-argument. Beginning the first argument with a ":" (e.g. ":a") will also work
-(see the examples).
-
-Since Mac OS (Classic) uses the concept of volumes, there is an ambiguity:
-Does the first argument in
-
-    File::Spec->catdir("LWP","Protocol");
-
-denote a volume or a directory, i.e. should the path be relative or absolute?
-There is no way of telling except by checking for the existence of "LWP:" (a
-volume) or ":LWP" (a directory), but those checks aren't made here. Thus, according
-to the above rules, the path "LWP:Protocol:" will be returned, which, considered
-alone, is an absolute path, although the volume "LWP:" may not exist. Hence, don't
-forget to put a ":" in the appropriate place in the path if you want to
-distinguish unambiguously. (Remember that a valid relative path should always begin
-with a ":", unless you are specifying a file or a directory that resides in the
-I<current> directory. In that case, the leading ":" is not mandatory.)
-
-With version 1.2 of File::Spec, there's a new method called C<catpath>, that
-takes volume, directory and file portions and returns an entire path (see below).
-While C<catdir> is still suitable for the concatenation of I<directory names>,
-you should consider using C<catpath> to concatenate I<volume names> and
-I<directory paths>, because it avoids any ambiguities. E.g.
+Here are the rules that are used in C<catdir()>; note that we try to be as 
+compatible as possible to Unix: 
+
+=over 2
+
+
+=item 1.
+The resulting path is relative by default, i.e. the resulting path will have a 
+leading colon.
+
+
+=item 2.
+A trailing colon is added automatically to the resulting path, to denote a 
+directory.
+
+
+=item 3.
+Generally, each argument has one leading ":" and one trailing ":" removed (if 
+any). They are then joined together by a ":". Special treatment applies for 
+arguments denoting updir paths like "::lib:", see (4), or arguments consisting 
+solely of colons ("colon paths"), see (5).
+
+
+=item 4.
+When an updir path like ":::lib::" is passed as argument, the number of  
+directories to climb up is handled correctly, not removing leading or trailing
+colons when necessary. E.g.
+
+    catdir(":::a","::b","c")    = ":::a::b:c:"
+    catdir(":::a::","::b","c")  = ":::a:::b:c:"
+
+
+=item 5.
+Adding a colon ":" or empty string "" to a path at I<any> position doesn't 
+alter the path, i.e. these arguments are ignored. (When a "" is passed as 
+the first argument, it has a special meaning, see (6) ). This way, a colon 
+":" is handled like a "." (curdir) on Unix, while an empty string "" is
+generally ignored (see C<Unix-E<gt>canonpath()> ). Likewise, a "::" is handled 
+like a ".." (updir), and a ":::" is handled like a "../.." etc.  E.g.
+
+    catdir("a",":",":","b")   = ":a:b:"
+    catdir("a",":","::",":b") = ":a::b:"
+
+
+=item 6.
+If the first argument is an empty string "" or is a volume name, i.e. matches 
+the pattern /^[^:]+:/, the resulting path is B<absolute>. 
+
+=item 7.
+Passing an empty string "" as the first argument to C<catdir()> is like passing 
+C<File::Spec-E<gt>rootdir()> as the first argument, i.e.
+
+    catdir("","a","b")          is the same as
+
+    catdir(rootdir(),"a","b"). 
+
+This is true on Unix, where C<catdir("","a","b")> yields "/a/b" and C<rootdir()> is  
+"/". Note that C<rootdir()> on Mac OS is the startup volume, which is the closest  
+in concept to Unix' "/". This should help to run existing scripts originally written 
+for Unix.
 
-    $dir      = File::Spec->catdir("LWP","Protocol");
-    $abs_path = File::Spec->catpath("MacintoshHD:", $dir, "");
+=item 8.
+For absolute paths, some cleanup is done, to ensure that the volume name isn't
+immediately followed by updirs. This is invalid, because this would go beyond 
+"root". Generally, these cases are handled like their Unix counterparts:
+
+ Unix:
+    Unix->catdir("","")                 =  "/"
+    Unix->catdir("",".")                =  "/"
+    Unix->catdir("","..")               =  "/"              # can't go beyond root
+    Unix->catdir("",".","..","..","a")  =  "/a"
+ Mac:
+    Mac->catdir("","")                  =  rootdir()         # (e.g. "HD:")
+    Mac->catdir("",":")                 =  rootdir()
+    Mac->catdir("","::")                =  rootdir()         # can't go beyond root
+    Mac->catdir("",":","::","::","a")   =  rootdir() . "a:"  # (e.g. "HD:a:")
+
+However, this approach is limited to the first arguments following "root" (again, see
+C<Unix-E<gt>canonpath()> ). If there are more arguments that move up the directory  
+tree, an invalid path going beyond root can be created. 
+
+=back
+
+As you've seen, you can force C<catdir()> to create an absolute path by passing either
+an empty string or a path that begins with a volume name as the first argument. However,
+you are strongly encouraged not to do so, since this is done only for backward 
+compatibility. Newer versions of File::Spec come with a method called C<catpath()> (see 
+below), that is designed to offer a portable solution for the creation of absolute paths.
+It takes volume, directory and file portions and returns an entire path. While 
+C<catdir()> is still suitable for the concatenation of I<directory names>, you are 
+encouraged to use C<catpath()> to concatenate I<volume names> and I<directory paths>. E.g.
+
+    $dir      = File::Spec->catdir("tmp","sources");
+    $abs_path = File::Spec->catpath("MacintoshHD:", $dir,"");
 
 yields
 
-    "MacintoshHD:LWP:Protocol:" .
+    "MacintoshHD:tmp:sources:" .
 
 
 =cut
 
 sub catdir {
-    my $self = shift;
-    return '' unless @_;
+    my $self = shift;	
+	return '' unless @_;	
     my @args = @_;
-    my $result = shift @args;
-    #  To match the actual end of the string,
-    #  not ignoring newline, you can use \Z(?!\n).
-    $result =~ s/:\Z(?!\n)//;
-    foreach (@args) {
-	s/:\Z(?!\n)//;
-	s/^://s;
-	$result .= ":$_";
-    }
-    return "$result:";
+    my $first_arg;	
+	my $relative;	
+	
+	# take care of the first argument
+	
+	if ($args[0] eq '')  { # absolute path, rootdir
+		shift @args;
+		$relative = 0;
+		$first_arg = $self->rootdir;
+	
+	} elsif ($args[0] =~ /^[^:]+:/) { # absolute path, volume name
+		$relative = 0;
+		$first_arg = shift @args;
+		# add a trailing ':' if need be (may be it's a path like HD:dir)
+		$first_arg = "$first_arg:" unless ($first_arg =~ /:\Z(?!\n)/);
+		
+	} else { # relative path
+		$relative = 1;
+		if ( $args[0] =~ /^::+\Z(?!\n)/ ) { 
+			# updir colon path ('::', ':::' etc.), don't shift
+			$first_arg = ':';
+		} elsif ($args[0] eq ':') {
+			$first_arg = shift @args;
+		} else {
+			# add a trailing ':' if need be
+			$first_arg = shift @args;
+			$first_arg = "$first_arg:" unless ($first_arg =~ /:\Z(?!\n)/);
+		} 
+	}	
+		
+	# For all other arguments,    
+	# (a) ignore arguments that equal ':' or '',
+	# (b) handle updir paths specially:
+	#     '::' 			-> concatenate '::'
+	#     '::' . '::' 	-> concatenate ':::' etc.
+	# (c) add a trailing ':' if need be
+	
+	my $result = $first_arg;
+	while (@args) {
+		my $arg = shift @args;
+		unless (($arg eq '') || ($arg eq ':')) {
+			if ($arg =~ /^::+\Z(?!\n)/ ) { # updir colon path like ':::'
+				my $updir_count = length($arg) - 1;
+				while ((@args) && ($args[0] =~ /^::+\Z(?!\n)/) ) { # while updir colon path
+					$arg = shift @args; 
+					$updir_count += (length($arg) - 1);
+				}
+				$arg = (':' x $updir_count); 
+			} else {
+				$arg =~ s/^://s; # remove a leading ':' if any
+				$arg = "$arg:" unless ($arg =~ /:\Z(?!\n)/); # ensure trailing ':'
+			}
+			$result .= $arg;
+		}#unless
+    }
+	
+	if ( ($relative) && ($result !~ /^:/) ) {   
+		# add a leading colon if need be
+		$result = ":$result";
+	}
+	
+	unless ($relative) { 
+		# remove updirs immediately following the volume name
+		$result =~ s/([^:]+:)(:*)(.*)\Z(?!\n)/$1$3/;
+	}
+	
+    return $result;
 }
 
 =item catfile
 
 Concatenate one or more directory names and a filename to form a
-complete path ending with a filename.  Since this uses catdir, the
-same caveats apply.  Note that the leading ":" is removed from the
-filename, so that
+complete path ending with a filename. Resulting paths are B<relative> 
+by default, but can be forced to be absolute (but avoid this). 
+
+B<IMPORTANT NOTE:> Beginning with version 1.3 of this module, the 
+resulting path is relative by default and I<not> absolute. This 
+descision was made due to portability reasons. Since 
+C<File::Spec-E<gt>catfile()> returns relative paths on all other 
+operating systems, it will now also follow this convention on Mac OS. 
+Note that this may break some existing scripts.
+
+The last argument is always considered to be the file portion. Since 
+C<catfile()> uses C<catdir()> (see above) for the concatenation of the 
+directory portions (if any), the following with regard to relative and  
+absolute paths is true:
 
-    File::Spec->catfile("a", "b", "file"); # = "a:b:file"
+    catfile("")     = ""
+    catfile("file") = "file"    
 
-and
+but
 
-    File::Spec->catfile("a", "b", ":file"); # = "a:b:file"
+    catfile("","")        = rootdir()         # (e.g. "HD:")
+    catfile("","file")    = rootdir() . file  # (e.g. "HD:file")
+    catfile("HD:","file") = "HD:file"
 
-give the same answer, as one might expect. To concatenate I<volume names>,
-I<directory paths> and I<filenames>, you should consider using C<catpath>
-(see below).
+This means that C<catdir()> is called only when there are two or more 
+arguments, as one might expect.
+
+Note that the leading ":" is removed from the filename, so that
+
+    catfile("a","b","file")  = ":a:b:file"    and
+
+    catfile("a","b",":file") = ":a:b:file"
+
+give the same answer. 
+
+To concatenate I<volume names>, I<directory paths> and I<filenames>, 
+you are encouraged to use C<catpath()> (see below).
 
 =cut
 
@@ -190,7 +335,7 @@
 
 sub rootdir {
 #
-#  There's no real root directory on MacOS.  The name of the startup
+#  There's no real root directory on Mac OS. The name of the startup
 #  volume is returned, since that's the closest in concept.
 #
     require Mac::Files;
@@ -231,13 +376,13 @@
 =item file_name_is_absolute
 
 Takes as argument a path and returns true, if it is an absolute path.
-This does not consult the local filesystem. If
-the path has a leading ":", it's a relative path. Otherwise, it's an
+If the path has a leading ":", it's a relative path. Otherwise, it's an
 absolute path, unless the path doesn't contain any colons, i.e. it's a name
 like "a". In this particular case, the path is considered to be relative
 (i.e. it is considered to be a filename). Use ":" in the appropriate place
 in the path if you want to distinguish unambiguously. As a special case,
-the filename '' is always considered to be absolute.
+the filename '' is always considered to be absolute. Note that with version 
+1.2 of File::Spec::Mac, this does no longer consult the local filesystem. 
 
 E.g.
 
@@ -263,7 +408,7 @@
 =item path
 
 Returns the null list for the MacPerl application, since the concept is
-usually meaningless under MacOS. But if you're using the MacPerl tool under
+usually meaningless under Mac OS. But if you're using the MacPerl tool under
 MPW, it gives back $ENV{Commands} suitably split, as is done in
 :lib:ExtUtils:MM_Mac.pm.
 
@@ -291,9 +436,9 @@
 The volume portion is always returned with a trailing ":". The directory portion
 is always returned with a leading (to denote a relative path) and a trailing ":"
 (to denote a directory). The file portion is always returned I<without> a leading ":".
-Empty portions are returned as "".
+Empty portions are returned as empty string ''.
 
-The results can be passed to L</catpath()> to get back a path equivalent to
+The results can be passed to C<catpath()> to get back a path equivalent to
 (usually identical to) the original path.
 
 
@@ -334,13 +479,13 @@
 
 =item splitdir
 
-The opposite of L</catdir()>.
+The opposite of C<catdir()>.
 
     @dirs = File::Spec->splitdir( $directories );
 
-$directories must be only the directory portion of the path on systems
+$directories should be only the directory portion of the path on systems
 that have the concept of a volume or that have path syntax that differentiates
-files from directories.
+files from directories. Consider using C<splitpath()> otherwise.
 
 Unlike just splitting the directories on the separator, empty directory names
 (C<"">) can be returned. Since C<catdir()> on Mac OS always appends a trailing
@@ -354,7 +499,7 @@
 
 yield:
 
-    ( "", "a", "b", "", "c")
+    ( "a", "b", "::", "c")
 
 while
 
@@ -362,42 +507,44 @@
 
 yields:
 
-    ( "", "a", "b", "", "c", "")
+    ( "a", "b", "::", "c", "::")
 
 
 =cut
 
 sub splitdir {
-    my ($self,$directories) = @_ ;
-
-    if ($directories =~ /^:*\Z(?!\n)/) {
-	# dir is an empty string or a colon path like ':', i.e. the
-	# current dir, or '::', the parent dir, etc. We return that
-	# dir (as is done on Unix).
-	return $directories;
-    }
-
-    # remove a trailing colon, if any (this way, splitdir is the
-    # opposite of catdir, which automatically appends a ':')
-    $directories =~ s/:\Z(?!\n)//;
-
-    #
-    # split() likes to forget about trailing null fields, so here we
-    # check to be sure that there will not be any before handling the
-    # simple case.
-    #
-    if ( $directories !~ m@:\Z(?!\n)@ ) {
-        return split( m@:@, $directories );
-    }
-    else {
-        #
-        # since there was a trailing separator, add a file name to the end,
-        # then do the split, then replace it with ''.
-        #
-        my( @directories )= split( m@:@, "${directories}dummy" ) ;
-        $directories[ $#directories ]= '' ;
-        return @directories ;
-    }
+    my ($self, $path) = @_;
+	my @result = ();
+	my ($head, $sep, $tail, $volume, $directories);
+    
+	return ('') if ( (!defined($path)) || ($path eq '') );
+	return (':') if ($path eq ':');
+
+	( $volume, $sep, $directories ) = $path =~ m|^((?:[^:]+:)?)(:*)(.*)|s;
+
+	# deprecated, but handle it correctly
+	if ($volume) {
+		push (@result, $volume);
+		$sep .= ':';
+	}
+	
+	while ($sep || $directories) {
+		if (length($sep) > 1) {
+			my $updir_count = length($sep) - 1;
+			for (my $i=0; $i<$updir_count; $i++) {
+				# push '::' updir_count times;
+				# simulate Unix '..' updirs
+				push (@result, '::'); 
+			}
+		}
+		$sep = '';
+		if ($directories) {
+			( $head, $sep, $tail ) = $directories =~ m|^((?:[^:]+)?)(:*)(.*)|s;
+			push (@result, $head);
+			$directories = $tail;
+		}
+	}	
+	return @result;
 }
 
 
@@ -521,14 +668,18 @@
         shift @pathchunks ;
         shift @basechunks ;
     }
-
+	
     # @pathchunks now has the directories to descend in to.
-    $path_dirs = $self->catdir( @pathchunks );
+	if ( (@pathchunks) && ($pathchunks[0] ne '') ) {
+    	$path_dirs = $self->catdir( @pathchunks );
+	} else {
+		$path_dirs = '';
+	}
 
     # @basechunks now contains the number of directories to climb out of.
     $base_dirs = (':' x @basechunks) . ':' ;
 
-    return $self->catpath( '', $base_dirs . $path_dirs, $path_file ) ;
+    return $self->catpath( '', $self->catdir( $base_dirs, $path_dirs ), $path_file ) ;
 }
 
 =item rel2abs
@@ -591,7 +742,7 @@
 
 =head1 AUTHORS
 
-See the authors list in L<File::Spec>. Mac OS support by Paul Schinder
+See the authors list in I<File::Spec>. Mac OS support by Paul Schinder
 <[email protected]> and Thomas Wegner <[email protected]>.
 
 

(4) filefind.t

diff -ru :perl:t:lib:filefind.t.orig.5.6.1b1 :perl:t:lib:filefind.t
--- :perl:t:lib:filefind.t.orig.5.6.1b1	Thu Oct  4 11:55:44 2001
+++ :perl:t:lib:filefind.t	Sun Oct 14 18:03:53 2001
@@ -168,28 +168,26 @@
 # $File::Find::dir (%Expect_Dir). Also use it in file operations like
 # chdir, rmdir etc.
 #
-# dir_path() concatenates directory names to form a _relative_
+# dir_path() concatenates directory names to form a *relative*
 # directory path, independent from the platform it's run on, although
-# there are limitations.  Don't try to create an absolute path,
+# there are limitations. Don't try to create an absolute path,
 # because that may fail on operating systems that have the concept of
-# volume names (e.g. Mac OS). Be careful when you want to create an
-# updir path like ../fa (Unix) or ::fa: (Mac OS). Plain directory
-# names will work best. As a special case, you can pass it a "." as
-# first argument, to create a directory path like "./fa/dir" on
+# volume names (e.g. Mac OS). As a special case, you can pass it a "." 
+# as first argument, to create a directory path like "./fa/dir" on
 # operating systems other than Mac OS (actually, Mac OS will ignore
 # the ".", if it's the first argument). If there's no second argument,
 # this function will return the empty string on Mac OS and the string
 # "./" otherwise.
 
 sub dir_path {
-    my $first_item = shift @_;
+    my $first_arg = shift @_;
 
-    if ($first_item eq '.') {
+    if ($first_arg eq '.') {
         if ($^O eq 'MacOS') {
             return '' unless @_;
             # ignore first argument; return a relative path
             # with leading ":" and with trailing ":"
-            return File::Spec->catdir("", @_); 
+            return File::Spec->catdir(@_); 
         } else { # other OS
             return './' unless @_;
             my $path = File::Spec->catdir(@_);
@@ -198,21 +196,16 @@
             return $path;
         }
 
-    } else { # $first_item ne '.'
-        return $first_item unless @_; # return plain filename
-        if ($^O eq 'MacOS') {
-            # relative path with leading ":" and with trailing ":"
-            return File::Spec->catdir("", $first_item, @_);
-        } else { # other OS
-            return File::Spec->catdir($first_item, @_);
-        }
+    } else { # $first_arg ne '.'
+        return $first_arg unless @_; # return plain filename
+        return File::Spec->catdir($first_arg, @_); # relative path
     }
 }
 
 
 # Use topdir() to specify a directory path that you want to pass to
-#find/finddepth Basically, topdir() does the same as dir_path() (see
-#above), except that there's no trailing ":" on Mac OS.
+# find/finddepth. Basically, topdir() does the same as dir_path() (see
+# above), except that there's no trailing ":" on Mac OS.
 
 sub topdir {
     my $path = dir_path(@_);
@@ -222,27 +215,27 @@
 
 
 # Use file_path() to specify a file path that's expected for $_
-# (%Expect_File).  Also suitable for file operations like unlink etc.
+# (%Expect_File). Also suitable for file operations like unlink etc.
 #
 # file_path() concatenates directory names (if any) and a filename to
-# form a _relative_ file path (the last argument is assumed to be a
+# form a *relative* file path (the last argument is assumed to be a
 # file). It's independent from the platform it's run on, although
-# there are limitations (see the warnings for dir_path() above). As a
-# special case, you can pass it a "." as first argument, to create a
-# file path like "./fa/file" on operating systems other than Mac OS
-# (actually, Mac OS will ignore the ".", if it's the first
-# argument). If there's no second argument, this function will return
-# the empty string on Mac OS and the string "./" otherwise.
+# there are limitations. As a special case, you can pass it a "." as 
+# first argument, to create a file path like "./fa/file" on operating 
+# systems other than Mac OS (actually, Mac OS will ignore the ".", if 
+# it's the first argument). If there's no second argument, this 
+# function will return the empty string on Mac OS and the string "./" 
+# otherwise.
 
 sub file_path {
-    my $first_item = shift @_;
+    my $first_arg = shift @_;
 
-    if ($first_item eq '.') {
+    if ($first_arg eq '.') {
         if ($^O eq 'MacOS') {
             return '' unless @_;
             # ignore first argument; return a relative path  
             # with leading ":", but without trailing ":"
-            return File::Spec->catfile("", @_); 
+            return File::Spec->catfile(@_); 
         } else { # other OS
             return './' unless @_;
             my $path = File::Spec->catfile(@_);
@@ -251,14 +244,9 @@
             return $path;
         }
 
-    } else { # $first_item ne '.'
-        return $first_item unless @_; # return plain filename
-        if ($^O eq 'MacOS') {
-            # relative path with leading ":", but without trailing ":"
-            return File::Spec->catfile("", $first_item, @_);
-        } else { # other OS
-            return File::Spec->catfile($first_item, @_);
-        }
+    } else { # $first_arg ne '.'
+        return $first_arg unless @_; # return plain filename
+        return File::Spec->catfile($first_arg, @_); # relative path
     }
 }


(5) filefind-taint.t

diff -ru :perl:t:lib:filefind-taint.t.orig.5.6.1b1 :perl:t:lib:filefind-taint.t
--- :perl:t:lib:filefind-taint.t.orig.5.6.1b1	Thu Oct  4 11:55:43 2001
+++ :perl:t:lib:filefind-taint.t	Sun Oct 14 18:07:26 2001
@@ -135,28 +135,26 @@
 # $File::Find::dir (%Expect_Dir). Also use it in file operations like
 # chdir, rmdir etc.
 #
-# dir_path() concatenates directory names to form a _relative_
-# directory path, independant from the platform it's run on, although
-# there are limitations.  Don't try to create an absolute path,
+# dir_path() concatenates directory names to form a *relative*
+# directory path, independent from the platform it's run on, although
+# there are limitations. Don't try to create an absolute path,
 # because that may fail on operating systems that have the concept of
-# volume names (e.g. Mac OS). Be careful when you want to create an
-# updir path like ../fa (Unix) or ::fa: (Mac OS). Plain directory
-# names will work best. As a special case, you can pass it a "." as
-# first argument, to create a directory path like "./fa/dir" on
+# volume names (e.g. Mac OS). As a special case, you can pass it a "." 
+# as first argument, to create a directory path like "./fa/dir" on
 # operating systems other than Mac OS (actually, Mac OS will ignore
 # the ".", if it's the first argument). If there's no second argument,
 # this function will return the empty string on Mac OS and the string
 # "./" otherwise.
 
 sub dir_path {
-    my $first_item = shift @_;
+    my $first_arg = shift @_;
 
-    if ($first_item eq '.') {
+    if ($first_arg eq '.') {
         if ($^O eq 'MacOS') {
             return '' unless @_;
             # ignore first argument; return a relative path
             # with leading ":" and with trailing ":"
-            return File::Spec->catdir("", @_); 
+            return File::Spec->catdir(@_); 
         } else { # other OS
             return './' unless @_;
             my $path = File::Spec->catdir(@_);
@@ -165,21 +163,16 @@
             return $path;
         }
 
-    } else { # $first_item ne '.'
-        return $first_item unless @_; # return plain filename
-        if ($^O eq 'MacOS') {
-            # relative path with leading ":" and with trailing ":"
-            return File::Spec->catdir("", $first_item, @_);
-        } else { # other OS
-            return File::Spec->catdir($first_item, @_);
-        }
+    } else { # $first_arg ne '.'
+        return $first_arg unless @_; # return plain filename
+        return File::Spec->catdir($first_arg, @_); # relative path
     }
 }
 
 
 # Use topdir() to specify a directory path that you want to pass to
-#find/finddepth Basically, topdir() does the same as dir_path() (see
-#above), except that there's no trailing ":" on Mac OS.
+# find/finddepth. Basically, topdir() does the same as dir_path() (see
+# above), except that there's no trailing ":" on Mac OS.
 
 sub topdir {
     my $path = dir_path(@_);
@@ -188,28 +181,28 @@
 }
 
 
-# Use file_path() to specify a file path that's expected for $_ (%Expect_File).
-# Also suitable for file operations like unlink etc.
-
+# Use file_path() to specify a file path that's expected for $_
+# (%Expect_File). Also suitable for file operations like unlink etc.
+#
 # file_path() concatenates directory names (if any) and a filename to
-# form a _relative_ file path (the last argument is assumed to be a
-# file). It's independant from the platform it's run on, although
-# there are limitations (see the warnings for dir_path() above). As a
-# special case, you can pass it a "." as first argument, to create a
-# file path like "./fa/file" on operating systems other than Mac OS
-# (actually, Mac OS will ignore the ".", if it's the first
-# argument). If there's no second argument, this function will return
-# the empty string on Mac OS and the string "./" otherwise.
+# form a *relative* file path (the last argument is assumed to be a
+# file). It's independent from the platform it's run on, although
+# there are limitations. As a special case, you can pass it a "." as 
+# first argument, to create a file path like "./fa/file" on operating 
+# systems other than Mac OS (actually, Mac OS will ignore the ".", if 
+# it's the first argument). If there's no second argument, this 
+# function will return the empty string on Mac OS and the string "./" 
+# otherwise.
 
 sub file_path {
-    my $first_item = shift @_;
+    my $first_arg = shift @_;
 
-    if ($first_item eq '.') {
+    if ($first_arg eq '.') {
         if ($^O eq 'MacOS') {
             return '' unless @_;
             # ignore first argument; return a relative path  
             # with leading ":", but without trailing ":"
-            return File::Spec->catfile("", @_); 
+            return File::Spec->catfile(@_); 
         } else { # other OS
             return './' unless @_;
             my $path = File::Spec->catfile(@_);
@@ -218,14 +211,9 @@
             return $path;
         }
 
-    } else { # $first_item ne '.'
-        return $first_item unless @_; # return plain filename
-        if ($^O eq 'MacOS') {
-            # relative path with leading ":", but without trailing ":"
-            return File::Spec->catfile("", $first_item, @_);
-        } else { # other OS
-            return File::Spec->catfile($first_item, @_);
-        }
+    } else { # $first_arg ne '.'
+        return $first_arg unless @_; # return plain filename
+        return File::Spec->catfile($first_arg, @_); # relative path
     }
 }
 


Best regards,

--Thomas




_________________________________________________________
Do You Yahoo!?
Get your free @yahoo.com address at http://mail.yahoo.com
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.