#!/usr/bin/env python
#
# Cross+Channel minimal .PD archive extraction tool
#
#    An exercise in minimizing the number of lines necessary for an
# extraction tool, keeping maximum clarity.
#
# Last modified 2006-06-12, Edward Keyes, ed-at-insani-dot-org

from insani import *

arcfile=open('cg.pd','rb')

assert_string(arcfile,'PackOnly',ERROR_ABORT)
assert_zeroes(arcfile,56,ERROR_WARNING)
numfiles = read_unsigned(arcfile,LONG_LENGTH)
print 'Extracting %d files...' % numfiles

print 'Reading archive index...'
entries = []
for i in xrange(numfiles) :
   filename = read_string(arcfile)
   assert_zeroes(arcfile,128-len(filename)-1)
   position = read_unsigned(arcfile,LONG_LENGTH)
   size = read_unsigned(arcfile,LONG_LENGTH)
   entries.append( (filename, position, size) )

assert_zeroes(arcfile,144*(16384-numfiles),ERROR_WARNING)

for (filename, position, size) in entries :
   print 'Extracting %s (%d bytes) from offset 0x%X' % \
    (filename, size, position)
   outfile=open(filename,'wb')
   assert (arcfile.tell() == position)
   outfile.write( arcfile.read(size) )
   outfile.close()

assert (arcfile.read(1) == '')
arcfile.close()

