home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Late Night VRML 2.0 with Java CD-ROM
/
code.zip
/
Ch13
/
qar.java
< prev
next >
Wrap
Text File
|
1997-01-14
|
3KB
|
69 lines
// Quake archive file class
// Written by Bernie Roehl, October 1996
// Based on the Quake Specs 3.2 document
import java.io.*;
import quake.*;
public class qar {
public static void main(String[] args) throws IOException {
if (args.length < 1) {
System.err.println("Usage: qar cmd [filename [names [...]]]");
System.exit(1);
}
String cmd = args[0];
String filename = (args.length > 1) ? args[1] : "pak0.pak";
RandomAccessFile quakefile = new RandomAccessFile(filename, "r");
if (quakefile.readInt() != 0x5041434B) {
System.err.println("missing signature");
System.exit(2);
}
int diroffset = swap32(quakefile.readInt());
int dirsize = swap32(quakefile.readInt());
int n_direntries = dirsize / 64; // 64 byte per directory entry
quakefile.seek(diroffset);
String prefix = "";
if (args.length > 2)
prefix = args[2];
for (int i = 0; i < n_direntries; ++i) {
byte[] fname = new byte[0x38];
quakefile.read(fname);
String subfilename = new String(fname, 0);
int zerobyte = subfilename.indexOf(0);
if (zerobyte >= 0)
subfilename = subfilename.substring(0, zerobyte);
int offset = swap32(quakefile.readInt());
int size = swap32(quakefile.readInt());
if (cmd.charAt(0) == 't') {
if (subfilename.startsWith(prefix))
System.out.println(size + " " + subfilename);
}
else if (subfilename.startsWith(prefix)) {
System.out.println("Extracting " + subfilename);
FileOutputStream out = new FileOutputStream(subfilename);
long savedpos = quakefile.getFilePointer();
quakefile.seek(offset);
byte[] buffer = new byte[1024];
do {
int n = quakefile.read(buffer);
out.write(buffer, 0, n);
size -= n;
} while (size > 0);
quakefile.seek(savedpos);
}
}
}
static int swap32(int value) {
return
((value >> 24) & 0x000000FF) +
((value >> 8) & 0x0000FF00) +
((value << 8) & 0x00FF0000) +
((value << 24) & 0xFF000000);
}
}