develooper Front page | perl.perl5.porters | Postings from September 2005

How to add methods to Filespec.pm on VMS?

Thread Next
From:
John E. Malmberg
Date:
September 26, 2005 20:02
Subject:
How to add methods to Filespec.pm on VMS?
Message ID:
4338B616.9060702@qsl.net
Well, I thought that it would be simpler than it has turned out to be, 
and obviously I am missing a concept or two somewhere.

On VMS, the methods in Filespec.pm are actually implemented in vms.c not 
in the .pm module.

I thought that I could add some stub methods it and put them in the 
EXPORT list in Filespec.pm, and they would get used until I could put in 
overrides in vms.c to actually return the active information.

The idea is so that I can make the changes to the other dual life 
modules to fully support the current openVMS features when run with a 
newer Perl and still have those modules be able to be used with older 
Perls that do not have the internal support with out a lot of 
conditional code.

My tests are showing that the routines are not being exported though,
so I do not know what I am doing wrong.

It looks like there must be a way to cause the additional functions to 
be exported, but I have not been able to figure it out from reading 
about use or export.

Or should I just add these to blead, and use some sort of check in the 
dual life modules to see if the methods are available before testing the 
setting?

-John
wb8tyw@qsl.net
Personal Opinion Only

The following is what I am trying to do:

@EXPORT = qw( &vmsify &unixify &pathify &fileify
               &vmspath &unixpath &candelete &rmsexpand
               &unix_report &unix_only &posix_mode
               &case_preserve &efs_charset &is_vms_spec
               &is_unix_spec &decc_feature_support
               &decc_feature_get_value &decc_features_set_value
               &decc_feature_deed);

I have more detailed documentation in my local copy of Filespec.pm.

# for now for most of these new methods just return undefined,
# as that is the state of older versions of Perl that do not
# provide these functions.

# lets routines know that filenames will be returned in UNIX syntax.
# and are expected to be maintained in UNIX syntax, except for
# methods like vmsify that explicitly convert the syntax.
sub unix_report ($) {
    return undef;
}

# lets routines know that all filenames will be treated as UNIX
# except for selected cases, and should be returned in UNIX syntax.
# Implies unix_report.  Most routines will only be checking unix_report,
# and unix_only will only be used for very special cases, mostly test
# modules.
sub unix_only ($) {
    return undef;
}

# Future posix mode active.
# In almost all cases except for testing, the unix_report mode will
# cover these.
sub posix_mode ($) {
    return undef;
}

# case is preserved, do not assume VMS means lower case file names.
sub case_preserve ($) {
    return undef;
}

# Almost anything goes for characters in file specifications.
# Even 16 bit Unicode characters can be represented in VMS style.
sub efs_charset ($) {
    return undef;
}

# The rules used to be simple for this, but are currently being
# inconsistently applied, which is introducing hard to diagnose
# bugs.  Now they are more complex, so time to make them common.
sub is_vms_spec ($) {
   my($fspec) = @_;
   return 0 if ($fspec eq '.') || ($fspec eq. '..');
   # if []:;<> present then true.
   return 1 if $fspec =~ m#[:>\]]#;
   # if / present than false.
   return 1 if $fspec !~ m#[/]#;
   return 0
}

# The rules used to be simple for this, but are currently being
# inconsistently applied, which is introducing hard to diagnose
# bugs.  Now they are more complex, so time to make them common.
sub is_unix_spec($) {
   my($fspec) = @_;
   return 1 if ($fspec eq '.') || ($fspec eq. '..');
   # if / present than true
   return 1 if $fspec =~ m#[/]#;
   # if []:<> present then false.
   return 1 if $fspec !~ m#[:>\]]#;
   return 0;
}

# the DECC stuff is just to expose the 'raw' information used
# used for set/clear options when they are available to be
# changed, and may be needed for some of the tests so that I
# can remove some of the "skips" or "todo" for VMS by changing
# the DECC mode for the test. This may be deferred to a new
# xs module.
sub decc_feature_support {
    return undef;
}

sub decc_feature_get_value ($;$) {
     my ($feature, $mode) = @_;
    # look for DECC$ prefix on feature name.
     return $ENV{$feature} if (defined $feature);
     return undef;
}

sub decc_feature_set_value ($;$;$) {
     return undef;
}

sub decc_feature_deed($) {
     return 1;
}

Thread Next


nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About