diff options
Diffstat (limited to 'utils/vpk/mkpak2.pl')
| -rw-r--r-- | utils/vpk/mkpak2.pl | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/utils/vpk/mkpak2.pl b/utils/vpk/mkpak2.pl new file mode 100644 index 0000000..fa92710 --- /dev/null +++ b/utils/vpk/mkpak2.pl @@ -0,0 +1,113 @@ +#! perl + +# make a simple fixed pak file for testing code. This utility is only for testing the code +# before writing the "real" utility. + +use File::Find; +use String::CRC32; +use File::Basename; + + + + +$ndatfileindex=0; +$ndatoffset=0; + +$nullbyte = pack("C",0); + + +# now, search for files +find( {wanted => \&gotfile, no_chdir=>1 }, "." ); + +undef $curext; + +$datlimit=50 * 1000 * 1000; + +foreach $_ ( sort ByExtensionAndDirectory @FilesToPack ) + { + local($basename, $dir, $ext ) = fileparse( $_, qr/\.[^.]*/); + $dir=~s@\\@/@g; + $dir=~s@^\./@@; + $dir=~s@/$@@; + $dir=" " unless ( length($dir) ); + $ext=~s@^\.@@; + $ext=" " unless ( length($ext) ); + print "Add $_ ($dir)\n"; + + if ( $curext ne $ext ) + { + $dirout.=$nullbyte.$nullbyte if length($curext); # mark no more files and end of extension + $dirout.=$ext.$nullbyte; + $dirout.=$dir.$nullbyte; + $curext=$ext; + $curdir=$dir; + } + elsif ( $curdir ne $dir ) + { + $dirout.=$nullbyte if length($curdir); # mark no more files + $dirout.=$dir.$nullbyte; + $curdir = $dir; + } + $dirout.=$basename.$nullbyte; + open(DATAIN, $_) || die "can't open $_"; + binmode DATAIN; + { local($/); $fdata=<DATAIN>; } + close DATAIN; + $dirout.=pack("V", CRC32( $fdata) ); + $dirout.=pack("v",0); #meta data size + $dirout.=pack("C",$ndatfileindex); + $dirout.=pack("V",length($dataout)); + $dirout.=pack("V",length($fdata)); + $dataout.=$fdata; + $dirout.=pack("C",-1); + if (length($dataout) > $datlimit ) + { + &writedata; + undef $dataout; + $ndatfileindex++; + } + + } +$dirout.=$nullbyte.$nullbyte; + +open(DIROUT,">test_dir.vpk") || die; +binmode DIROUT; +print DIROUT $dirout; +close DIROUT; +&writedata; + + +sub writedata + { + my $fname=sprintf("test_%03d.vpk", $ndatfileindex ); + print STDERR "\nWriting $fname, length ", length($dataout),"\n"; + open(DATAOUT,">$fname") || die; + binmode DATAOUT; + print DATAOUT $dataout; + close DATAOUT; + } + +sub gotfile + { + return if ( -d $_ ); + s@\\@/@g; + s@^\./@@; # kill leading "./" + $_=lc($_); + local($basename, $dir, $ext ) = fileparse( $_, qr/\.[^.]*/); + return if ($basename=~/\.360$/); + return if ( $ext eq ".dll" ); + return if ( $ext eq ".vpk" ); + return unless length($ext); + # return unless ( $ext eq ".vtf" ); + push @FilesToPack, $_; + } + + +sub ByExtensionAndDirectory + { + local($basenamea, $dira, $exta ) = fileparse( $a, qr/\.[^.]*/); + local($basenameb, $dirb, $extb ) = fileparse( $b, qr/\.[^.]*/); + return $exta cmp $extb if ( $extb ne $exta ); + return $dira cmp $dirb if ( $dira ne $dirb ); + return $basenamea cmp $basenameb; + } |