import sys
import array
import re
import os
import getopt
import struct

only_list = 0

def usage():
	print "pywad.py pakfile \"extraction regexp\""
	print "-l for listing"
	sys.exit(2)


try:
	opts, args = getopt.getopt(sys.argv[1:], 'hl')
except getopt.GetoptError, err:
	print str(err)
	usage()


for o, a in opts:
	if o == "-h":
		usage()
	elif o == "-l":
		only_list = 1
		print "listing files only"
	else :
		print "unknown option %s" % o

if len(args) < 2:
	usage()

print args
ifile = args[0]

extract = args[1]

regexp = re.compile(extract)


print "opening %s" % ifile
wad_file = open(ifile, 'rb')
buffer= wad_file.read()
print "filesize %i" % len(buffer)
wad_file.seek(0, 0)

id = str(wad_file.read(4))
dirofs = str(wad_file.read(4))
dirofsi = array.array('I', dirofs)[0]
dirlen = str(wad_file.read(4))
dirleni = array.array('I', dirlen)[0]

packfile_numfiles = dirleni / (56 + 4 * 2)

wad_file.seek(dirofsi)

files = {}

for i in range (0, packfile_numfiles):
	files[i] = {}
	cpos = wad_file.tell()
	files[i]["name"] = ""
	
	while True:
		s = wad_file.read(1)
		if s == '\0':
			break
		else:
			files[i]["name"] += s

	wad_file.seek(cpos + 56, 0)

	files[i]["pos"]=struct.unpack('I', wad_file.read(4))[0]
	files[i]["len"]=struct.unpack('I', wad_file.read(4))[0]

location = wad_file.tell();


wad_file.seek(dirleni, 0)
for i in range (0, packfile_numfiles):
	if regexp.match(files[i]["name"]):
		print "%i - %s: pos: %s len:%s" % (i+1, files[i]["name"]  ,files[i]["pos"]  ,files[i]["len"])
		pfile = files[i]["name"]
		wad_file.seek(files[i]["pos"]  , 0)
		paths = pfile.split('/')
		ip = ""
		for x in range (0, len(paths) -1 ):
			if x > 0:
				ip +="/"
			ip += paths[x]
			if only_list == 0:
				try:
					os.mkdir(ip)
				except OSError:
					print "directory already existed"

		print ip
		if only_list == 0 :
			f = open(pfile, 'wb')
			f.write(wad_file.read(files[i]["len"]))
			f.close()



wad_file.close()
