#! /usr/bin/perl -w use strict; use Config::IniFiles; my %stack; foreach my $file (@ARGV) { $file =~ s/\.[a-z\d]*//i; $stack{$file}=1; } foreach my $filebase (keys %stack) { my $cfg=Config::IniFiles->new(-file => "$filebase.ini"); my %files; open LIST,'-|','cabextract','-l',"$filebase.CAB"; while () { chomp; my @i=split ' ',$_; if ($i[0] && $i[0] =~ /^\d+$/) { (my $ext=$i[5]) =~ s/.*\.//; $files{$ext}=$i[5] } } close LIST; system('cabextract',"$filebase.CAB"); my @files; my $id=rand()*(2**32); my @pkg; foreach my $f (sort $cfg->Parameters('FileNames')) { $f =~ /File(\d+)/; my $t=$cfg->val('FileNames',$f); system('mv',$files{$1},$t); push @files,$t; if ($t =~ /\.pcm$/i) { open F,"<$t"; while () { s/[\x00-\x1f]//g; if (/^(\d+)$/) { $id=$1; } } close F; } elsif ($t =~ /\.dat$/i) { push @pkg,$t; } } $id |= 0x10000000; my $idh=sprintf('%08x',$id); (my $name=$filebase) =~ s/_/ /g; push @files,"$filebase.pkg"; open PKG,">$filebase.pkg"; print PKG <