#!/usr/bin/env python

# Cross+Channel .PD archive repacking tool
#
#    Takes a directory of files and creates an archive from them.
#
# Last modified 2006-06-12, Edward Keyes, ed-at-insani-dot-org

import sys, os
from insani import *

if len(sys.argv) != 3 :
   print 'Please give an input directory name and Cross+Channel archive'+ \
    ' filename\non the command line.'
   sys.exit(0)

dirname = sys.argv[1]
if not os.path.isdir(dirname) :
   print 'Error opening directory %s, aborting' % dirname
   sys.exit(0)
rawnames = os.listdir(dirname)

numfiles = 0
position = 144*16384+72
entries = []
for filename in rawnames :
   fullpath = os.path.join(dirname,filename)
   if os.path.isfile(fullpath) :  # Skip any subdirectories
      numfiles += 1
      size = os.stat(fullpath).st_size
      entries.append( (filename, fullpath, position, size) )
      position += size;

print 'Packing %d files...' % numfiles
arcfile = open(sys.argv[2],'wb')
arcfile.write('PackOnly')
write_zeroes(arcfile,56)
write_unsigned(arcfile,numfiles,LONG_LENGTH)

print 'Writing archive index...'
for (filename, fullpath, position, size) in entries :
   write_string(arcfile,filename)
   write_zeroes(arcfile,128-len(filename)-1)
   write_unsigned(arcfile,position,LONG_LENGTH)
   write_unsigned(arcfile,size,LONG_LENGTH)

write_zeroes(arcfile,144*(16384-numfiles))

for (filename, fullpath, position, size) in entries :
   print 'Packing %s (%d bytes) at offset 0x%X' % \
    (filename, size, position)
   assert (arcfile.tell() == position)
   infile = open(fullpath,'rb')
   arcfile.write(infile.read(size))
   infile.close()

arcfile.close()

