11 $AUTOLOAD =~ /^OS2::DLL::.+::(.+)$/
12 or confess("Undefined subroutine &$AUTOLOAD called");
13 return undef if $1 eq "DESTROY";
15 or confess("Can't find entry '$1' to DLL '$_[0]->{File}': $^E");
19 @libs = split(/;/, $ENV{'PERL5REXX'} || $ENV{'PERLREXX'} || $ENV{'LIBPATH'} || $ENV{'PATH'});
22 # Preloaded methods go here. Autoload methods go after __END__, and are
23 # processed by the autosplit program.
25 # Cannot autoload, the autoloader is used for the REXX functions.
28 confess 'Usage: OS2::DLL->new( <file> [<dirs>] )' unless @_ >= 2;
29 my ($class, $file) = (shift, shift);
31 $handle = $class->load($file, @_) and return $handle;
32 my $path = @_ ? " from '@_'" : '';
33 my $err = DynaLoader::dl_error();
34 $err =~ s/\s+at\s+\S+\s+line\s+\S+\s*\z//;
35 croak "Can't load '$file'$path: $err";
40 confess 'Usage: load OS2::DLL <file> [<dirs>]' unless $#_ >= 1;
41 my ($class, $file, @where) = (@_, @libs);
42 return $dlls{$file} if $dlls{$file};
45 $handle = DynaLoader::dl_load_file("$_/$file.dll");
48 $handle = DynaLoader::dl_load_file($file) unless $handle;
49 return undef unless $handle;
50 my $packs = $INC{'OS2/REXX.pm'} ? 'OS2::DLL OS2::REXX' : 'OS2::DLL';
51 eval <<EOE or die "eval package $@";
52 package OS2::DLL::$file; \@ISA = qw($packs);
54 \$OS2::DLL::AUTOLOAD = \$AUTOLOAD;
55 goto &OS2::DLL::AUTOLOAD;
60 bless {Handle => $handle, File => $file, Queue => 'SESSION' },
67 my $file = $self->{File};
68 my $handle = $self->{Handle};
69 my $prefix = exists($self->{Prefix}) ? $self->{Prefix} : "";
70 my $queue = $self->{Queue};
72 my $name = "OS2::DLL::${file}::$_";
73 next if defined(&$name);
74 my $addr = DynaLoader::dl_find_symbol($handle, uc $prefix.$_)
75 || DynaLoader::dl_find_symbol($handle, $prefix.$_)
77 eval <<EOE or die "eval sub";
78 package OS2::DLL::$file;
81 OS2::DLL::_call('$_', $addr, '$queue', \@_);
96 OS2::DLL - access to DLLs with REXX calling convention.
100 When you use this module, the REXX variable pool is not available.
102 See documentation of L<OS2::REXX> module if you need the variable pool.
107 $emx_dll = OS2::DLL->load('emx');
108 $emx_version = $emx_dll->emx_revision();
114 $dll = load OS2::DLL NAME [, WHERE];
116 NAME is DLL name, without path and extension.
118 Directories are searched WHERE first (list of dirs), then environment
119 paths PERL5REXX, PERLREXX, PATH or, as last resort, OS/2-ish search
120 is performed in default DLL path (without adding paths and extensions).
122 The DLL is not unloaded when the variable dies.
124 Returns DLL object reference, or undef on failure (in this case one can
125 get the reason via C<DynaLoader::dl_error()>).
127 =head2 Create a REXX DLL handle
129 $dll = OS2::DLL->new( NAME [, WHERE] );
131 Same as L<C<load>|Load REXX DLL>, but croaks with a meaningful message on
134 =head2 Check for functions (optional):
136 BOOL = $dll->find(NAME [, NAME [, ...]]);
138 Returns true if all functions are available.
140 =head2 Call external REXX function:
142 $dll->function(arguments);
144 Returns the return string if the return code is 0, else undef.
145 Dies with error message if the function is not available.
149 If C<PERL_REXX_DEBUG> is set, emits debugging output. Looks for DLLs
150 in C<PERL5REXX>, C<PERLREXX>, C<PATH>.
154 Extracted by Ilya Zakharevich ilya@math.ohio-state.edu from L<OS2::REXX>
155 written by Andreas Kaiser ak@ananke.s.bawue.de.