# 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'[, 'default:[file.spec]']);
$vmsspec = vmsify('/my/Unix/file/specification');
$unixspec = unixify('my:[VMS]file.specification');
$path = pathify('my:[VMS.or.Unix.directory]specification.dir');
The routines provided are:
+=head2 rmsexpand
+
+Uses the RMS $PARSE and $SEARCH services to expand the input
+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
Converts a file specification to VMS syntax.
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.
require Exporter;
@ISA = qw( Exporter );
-@EXPORT = qw( &vmsify &unixify &pathify &fileify
- &vmspath &unixpath &candelete);
+@EXPORT = qw( &vmsify &unixify &pathify &fileify
+ &vmspath &unixpath &candelete &rmsexpand );
-@EXPORT_OK = qw( &rmsexpand );
1;
# should be adequate for most purposes.
# A sort-of sys$parse() replacement
-sub rmsexpand {
+sub rmsexpand ($;$) {
my($fspec,$defaults) = @_;
if (!$fspec) { return undef }
my($node,$dev,$dir,$name,$type,$ver,$dnode,$ddev,$ddir,$dname,$dtype,$dver);
($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