#!/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()