summaryrefslogtreecommitdiff
path: root/utils/vpk/mkpak2.pl
diff options
context:
space:
mode:
Diffstat (limited to 'utils/vpk/mkpak2.pl')
-rw-r--r--utils/vpk/mkpak2.pl113
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;
+ }