home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Acorn User 10
/
AU_CD10.iso
/
Updates
/
Perl
/
Non-RPC
/
!Perl
/
scripts
/
ChunkRead
< prev
next >
Wrap
Text File
|
1998-07-14
|
2KB
|
90 lines
#!perl -w
# Version 0.01
use strict;
use Getopt::Std;
use RISCOS::Throwback;
use RISCOS::Chunkfile qw(load_chunkfile index_chunkfile);
use RISCOS::Filespec;
use RISCOS::Chunk;
# use RISCOS::AOF qw (aof_stringtable aof_symboltable);
use RISCOS::ALF qw (alf_directory);
use RISCOS::Time qw (time2utc time2local);
use vars qw(%opt);
getopts ('d', \%opt);
$opt{'d'} = 0 unless keys %opt;
# Try to make the entry the longest comma free string possible
my ($file, $entry) = (shift);
# Found a comma? If so separate as it's probably a $file,$entry for ALF
($file, $entry) = $file =~ /^(.*?),?([^,]*)$/ if $file =~ tr/,//;
$entry = shift unless $entry;
my $output = shift;
die "$0 <ALF File> <Entry> [<Output>]" unless defined $entry;
if ($output) {
open (STDOUT, ">$output") or die "Couldn't open '$output': $!";
}
do_file ($file, $file, $entry);
exit 0;
sub do_file
{
my $file = shift;
my @chunks = load_chunkfile shift;
# So that name and data source can differ
my $entry = shift;
my $index = index_chunkfile @chunks;
unless (@chunks) {
warn "'$file' is not a chunkfile";
}
elsif (defined $$index{OBJ_SYMT})
{
# izza AOF
warn "Attempting to read entry '$entry' from AOF file '$file'\n";
}
elsif (defined $$index{LIB_DIRY})
{
my $directory = $$index{LIB_DIRY};
if (@$directory > 1)
{
warn "Multiple directories in ALF file '$file' - chunks "
. join ',', @$directory;
next;
}
$directory = alf_directory $chunks[$directory->[0]];
# izza ALF
if ($entry) {
&do_chunk (\@chunks, $file, $directory->{$entry});
} else {
&do_chunk (\@chunks, $file, values %$directory);
}
}
else
{
warn "'$file' is not a recognised ALF file - contains "
. join (', ', keys %$index) . ' chunks';
}
}
sub do_chunk ($$;@) {
my $chunks = shift;
my $file = shift;
die "Can't dump library out yet :-(" if $opt{d};
foreach (@_) {
# Reference to chunk data means "treat this as file to load"
print ($chunks->[$_->Index()]->Data);
}
}