When trying to use Embperl 1.3b7 offline with DjGpp on Windows 98 I ran into
some problems, mainly because the directory comparison was done case
sensitive, while the Windows filesystem is case tolerant, and because
EmbperlObject doesn't take into account the volume/drive part of a filename.
Also, the ADDPATH code used ':' to separate paths. This should be ';' - as
stated in the EmbperlObject documentation - because ':' is used as the
volume separator in Windows. Furthermore, I encountered some problems,
using EmbperlObject with relative paths.
I applied the following changes in order to make EmbperlObject.pm work for
me:
- within the 'Execute' sub, used the 'norm_path' sub for *every* path/file
argument to EmbperlObject. This ensures each path/file argument to have
the same notation, causing the directory comparisons to make sense on
case tolerant file systems.
- modified 'norm_path' to turn relative paths into absolute paths, using
volumes as well.
- modified 'norm_path' to turn paths to uppercase for case tolerant file
systems.
Can these changes be useful for a future version? I didn't test the
modifications on a UNIX system or in 'online' Embperl mode though. The
modified EmbperlObject.pm can be looked at from:
http://fvu.myweb.nl/Tmp/EmbperlObject.pm
Main changes are a modified norm_path:
############################################################################
#
#
# Normalize path into filesystem
#
# in $path: path to normalize
# $volumeDefault: default current volume to prefix to path
# ret normalized path
#
sub norm_path {
my ($path, $volumeDefault) = @_;
my $result;
# Path is specified?
if ($result = $path) {
# Yes, path is specified;
# Is path relative?
if (!File::Spec->file_name_is_absolute($result)) {
# Yes, path is relative;
# Make path absolute
$result = File::Spec->rel2abs($result);
}
# Split path
my ($volume, $directories, $file) = File::Spec->splitpath(
$result, (-d $result)
);
# Default volume is specified?
if ($volumeDefault) {
# Yes, default volume is specified;
# Does path contain a volume?
if (!$volume) {
# No, path doesn't contain a volume;
# Use default volume
$volume = $volumeDefault;
}
}
# Re-assemble path
$result = File::Spec->catpath($volume, $directories, $file);
# If filesystem case tolerant?
if (File::Spec->case_tolerant) {
# Yes, filesystem is case tolerant;
# Use all uppercase
$result = uc($result);
}
$result = File::Spec->canonpath($result);
$result =~ s/\\/\//g ;
$result = $1 if ($result =~ /^\s*(.*?)\s*$/) ;
}
}
and this modified portion of the 'Execute' statement:
...
my $addpath = $req->{object_addpath} ;
my @addpath = $addpath ? split (/;/, $addpath) : ();
my ($volume, $volumeCurrent, $volumeFile, $nameFile);
my ($directory, $directoryCurrent, $directoryFile);
# Determine volume & directory
# Split inputfile
($volumeFile, $directoryFile, $nameFile) = File::Spec->splitpath(
$filename, (-d $filename)
);
($volumeCurrent, $directoryCurrent) = File::Spec->splitpath(
Cwd->getcwd(), 1
);
# Use current volume if inputfile doesn't have volume specified
$volume = $volumeFile ? $volumeFile : $volumeCurrent;
# Use current directory if inputfile doesn't have directory specified
$directory = $directoryFile ? $directoryFile : $directoryCurrent;
# Re-assemble filename, making sure it's absolute
$filename = File::Spec->catpath($volume, $directory, $nameFile);
# Add volume to directory
$directory = norm_path($directory, $volume);
my $rootDir = norm_path(File::Spec->rootdir, $volume);
my $docRootDir = norm_path($r ? $r->document_root : $rootDir, $volume);
my $stopDir = norm_path ($req -> {object_stopdir}, $volume);
my $debug = $req -> {debug} & HTML::Embperl::dbgObjectSearch ;
...
Gr, Freddy Vulto
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]