[Date Prev][Date Next][Thread Prev][Thread Next] [Search] [Date Index] [Thread Index]

Re: [MacPerl] _57's pod failures: workaround

Chris Nandor wrote Fri, 4 Jun 1999:

> At 19.52 -0400 1999.06.02, Peter Prymmer wrote:
> >Chris Nandor wrote in response to me:
> >


> >catdir().  (er, BTW how would you propose that $PATHSEPCLASS be used?).
> The idea is that if there were more than one path separator possible, as in
> Win32.  $PATHSEP = '/'; $PATHSEPCLASS = '/\\';  m/[$PATHSEPCLASS]/;  or
> something.  Just a thought.  I think I agree it is not a Good Idea, because
> it assumes that path separators work similarly everywhere, which they don't.

Yes AFAI can tell only the dosish platforms would benefit, like I said
about VMS: you can have it unixy or vmsy but you cannot mix them.  Hence 
$PATHSEPCLASS would only be of use on dos, os/2, windows, et al.

> >I suspect that the following patches may need to be modified further to
> >accomodate Acorn RiscOS - but how do they look for VMS && Macs?
> >(assume the IO::File that comes with perl 5.005_57).
> Right, and that's the problem with not using File::Spec.  You might miss
> some other platform.

OK, so barring Mac problems with file_name_is_absolute(), how does this
patch strike you?

--- perl5.005_03/ext/IO/lib/IO/File.pm.orig	Wed Jul 29 17:59:40 1998
+++ perl5.005_03/ext/IO/lib/IO/File.pm	Wed Jun  9 20:26:35 1999
@@ -109,6 +109,7 @@
 use Symbol;
 use SelectSaver;
 use IO::Seekable;
+use File::Spec;
 require Exporter;
 require DynaLoader;
@@ -158,7 +159,9 @@
 	    defined $perms or $perms = 0666;
 	    return sysopen($fh, $file, $mode, $perms);
-	$file = './' . $file if $file =~ m{\A[^\\/\w]};
+	if (! File::Spec->file_name_is_absolute($file)) {
+            $file = File::Spec->catfile(File::Spec->curdir(),$file);
+        }
 	$file = IO::Handle::_open_mode_string($mode) . " $file\0";
     open($fh, $file);
End of Patch.

I just tested that on Tru64 Unix (formerly Digital Unix, formerly OSF/1)
and all 5.005_03 tests passed.

> This is a tough one.  The filename should begin with ':' if it is a
> relative file spec on Mac OS.  But I cannot think of a reliable way using
> File::Spec to do this.  I wonder if File::Spec::Mac::file_name_is_absolute
> should be changed?
> sub file_name_is_absolute {
>     my($self,$file) = @_;
>         if ($file =~ /:/) {
>                 return ($file !~ m/^:/);
>         } else {
>                 return (! -e ":$file");
>     }
> }
> It checks for the existence of a file in the relative path, and returns
> absolute if it isn't there.  Maybe instead it could check do:
>   return -e ($file =~ /^([^:]+:)/)[0];
> Then it just says "yes, there is a volume with that name".  I dunno.  I
> guess we could just say, "hey dummy, pass your filenames to IO::File with
> leading semicolons to disambiguate, we can't do all the thinking for you!"
> That's basically what Paul's docs for File::Spec::Mac say.

I just re-read the problem you mentioned here.  I'd advocate avoiding
an -e stat test.  What if you wanted to check a file spec before you'd ever 
opened it for the first time, it would not necessarily exist yet (e.g. you 
wanted a tempname() function that did not load all of POSIX).
Instead do things purely lexically, e.g.:

 sub file_name_is_absolute {
     my($self,$file) = @_;
         if ($file =~ /:/) {
                 return ($file !~ m/^:/);
         } else {
                 return (0);

I think that is correct even for ::up_by_one specs - no?

I can think of one tiny problem: what happens to file path names when 
you delete the volume name, i.e. in the limit

    lim      chars:foo:bar -> :foo:bar ?

or does it become <weird_char_such_as_null>:foo:bar ?

OK I just ran `directory` in MPW and tried to delete all chars in the volume 
name, but Finder would not let me do it.  The last name would always pop 
back so I guess this is not a problem :-)

Peter Prymmer

===== Want to unsubscribe from this list?
===== Send mail with body "unsubscribe" to macperl-request@macperl.org