home *** CD-ROM | disk | FTP | other *** search
- import java.io.DataInputStream;
- import java.io.DataOutputStream;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.FileOutputStream;
- import java.io.FilterInputStream;
- import java.io.FilterOutputStream;
- import java.io.IOException;
- import java.io.RandomAccessFile;
-
- class Unpack {
- static final int IDPAKHEADER = 1262698832;
-
- static void usage() {
- System.out.println("Usage: unpack <packfile> <match> <basedir>");
- System.out.println(" or: unpack -list <packfile>");
- System.out.println("<match> may contain a single * wildcard");
- System.exit(1);
- }
-
- static int intSwap(int i) {
- int a = i & 255;
- int b = i >> 8 & 255;
- int c = i >> 16 & 255;
- int d = i >> 24 & 255;
- return (a << 24) + (b << 16) + (c << 8) + d;
- }
-
- static boolean patternMatch(String pattern, String s) {
- if (pattern.equals(s)) {
- return true;
- } else {
- int index = pattern.indexOf(42);
- if (index == -1) {
- return false;
- } else if (!pattern.regionMatches(0, s, 0, index)) {
- return false;
- } else {
- ++index;
- int remaining = pattern.length() - index;
- if (s.length() < remaining) {
- return false;
- } else {
- return pattern.regionMatches(index, s, s.length() - remaining, remaining);
- }
- }
- }
- }
-
- public static void main(String[] args) {
- byte[] name = new byte[56];
- String pakName;
- String pattern;
- if (args.length == 2) {
- if (!args[0].equals("-list")) {
- usage();
- }
-
- pakName = args[1];
- pattern = null;
- } else if (args.length == 3) {
- pakName = args[0];
- pattern = args[1];
- } else {
- pakName = null;
- pattern = null;
- usage();
- }
-
- try {
- DataInputStream directory = new DataInputStream(new FileInputStream(pakName));
- RandomAccessFile readLump = new RandomAccessFile(pakName, "r");
- int ident = intSwap(directory.readInt());
- int dirofs = intSwap(directory.readInt());
- int dirlen = intSwap(directory.readInt());
- if (ident != 1262698832) {
- System.out.println(pakName + " is not a pakfile.");
- System.exit(1);
- }
-
- directory.skipBytes(dirofs - 12);
- int numLumps = dirlen / 64;
- System.out.println(numLumps + " lumps in " + pakName);
-
- for(int i = 0; i < numLumps; ++i) {
- directory.readFully(name);
- int filepos = intSwap(directory.readInt());
- int filelen = intSwap(directory.readInt());
- String nameString = new String(name, 0);
- nameString = nameString.substring(0, nameString.indexOf(0));
- if (pattern == null) {
- System.out.println(nameString + " : " + filelen + "bytes");
- } else if (patternMatch(pattern, nameString)) {
- byte[] buffer = new byte[filelen];
- System.out.println("Unpaking " + nameString + " " + filelen + " bytes");
- readLump.seek((long)filepos);
- readLump.readFully(buffer);
- StringBuffer fixedString = new StringBuffer(args[2] + File.separator + nameString);
-
- for(int index = 0; index < fixedString.length(); ++index) {
- if (fixedString.charAt(index) == '/') {
- fixedString.setCharAt(index, File.separatorChar);
- }
- }
-
- String finalName = fixedString.toString();
- int var25 = finalName.lastIndexOf(File.separatorChar);
- if (var25 != -1) {
- String finalPath = finalName.substring(0, var25);
- File writePath = new File(finalPath);
- writePath.mkdirs();
- }
-
- File writeFile = new File(finalName);
- DataOutputStream writeLump = new DataOutputStream(new FileOutputStream(writeFile));
- ((FilterOutputStream)writeLump).write(buffer);
- ((FilterOutputStream)writeLump).close();
- }
- }
-
- readLump.close();
- ((FilterInputStream)directory).close();
- } catch (IOException var23) {
- System.out.println(((Throwable)var23).toString());
- }
-
- }
- }
-