# Perl hooks into the routines in vms.c for interconversion
# of VMS and Unix file specification syntax.
#
-# Version: 1.1
-# Author: Charles Bailey bailey@genetics.upenn.edu
+# Version: see $VERSION below
+# Author: Charles Bailey bailey@newman.upenn.edu
# Revised: 08-Mar-1995
=head1 NAME
=head1 SYNOPSIS
use VMS::Filespec;
-$fullspec = rmsexpand('[.VMS]file.specification');
+$fullspec = rmsexpand('[.VMS]file.specification'[, 'default:[file.spec]']);
$vmsspec = vmsify('/my/Unix/file/specification');
$unixspec = unixify('my:[VMS]file.specification');
$path = pathify('my:[VMS.or.Unix.directory]specification.dir');
=head2 rmsexpand
Uses the RMS $PARSE and $SEARCH services to expand the input
-specification to its fully qualified form. (If the file does
-not exist, the input specification is expanded as much as
-possible.) If an error occurs, returns C<undef> and sets C<$!>
+specification to its fully qualified form, except that a null type
+or version is not added unless it was present in either the original
+file specification or the default specification passed to C<rmsexpand>.
+(If the file does not exist, the input specification is expanded as much
+as possible.) If an error occurs, returns C<undef> and sets C<$!>
and C<$^E>.
=head2 vmsify
package VMS::Filespec;
require 5.002;
+our $VERSION = '1.11';
# If you want to use this package on a non-VMS system,
# uncomment the following line.
($node,$dev,$dir,$name,$type,$ver) = $fspec =~
/([^:]*::)?([^:]*:)?([^>\]]*[>\]])?([^.;]*)(\.?[^.;]*)([.;]?\d*)/;
foreach ((@$defaults,$ENV{'DEFAULT'})) {
+ next unless defined;
last if $node && $ver && $type && $dev && $dir && $name;
($dnode,$ddev,$ddir,$dname,$dtype,$dver) =
/([^:]*::)?([^:]*:)?([^>\]]*[>\]])?([^.;]*)(\.?[^.;]*)([.;]?\d*)/;
my($path) = @_;
if (!$path) { return undef }
+ if ($path eq '/') { return 'sys$disk:[000000]'; }
if ($path =~ /(.+)\.([^:>\]]*)$/) {
$path = $1;
if ($2 !~ /^dir(?:;1)?$/i) { return undef }
return '' unless -w $fspec;
$fspec =~ s#/$##;
if ($fspec =~ m#/#) {
- ($parent = $fspec) =~ s#/[^/]+$#;
+ ($parent = $fspec) =~ s#/[^/]+$##;
return (-w $parent);
}
elsif ($parent = fileify($fspec)) { # fileify() here to expand lnms