home *** CD-ROM | disk | FTP | other *** search
/ MacHack 2000 / MacHack 2000.toast / pc / The Hacks / MacHacksBug / Python 1.5.2c1 / Mac / Lib / cfmfile.pyc (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2000-06-23  |  7.4 KB  |  174 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 1.5)
  3.  
  4. '''codefragments.py -- wrapper to modify code fragments.'''
  5. __version__ = '0.8b3'
  6. __author__ = 'jvr'
  7. import macfs
  8. import struct
  9. import Res
  10. import os
  11. import sys
  12. DEBUG = 0
  13. error = 'cfm.error'
  14. BUFSIZE = 524288
  15.  
  16. def mergecfmfiles(srclist, dst, architecture = 'fat'):
  17.     '''Merge all files in srclist into a new file dst. 
  18. \t
  19. \tIf architecture is given, only code fragments of that type will be used:
  20. \t"pwpc" for PPC, "m68k" for cfm68k. This does not work for "classic"
  21. \t68k code, since it does not use code fragments to begin with.
  22. \tIf architecture is None, all fragments will be used, enabling FAT binaries.
  23. \t'''
  24.     srclist = list(srclist)
  25.     for i in range(len(srclist)):
  26.         pass
  27.     
  28.     if type(dst) == macfs.FSSpecType:
  29.         dst = dst.as_pathname()
  30.     
  31.     dstfile = open(dst, 'wb')
  32.     rf = Res.OpenResFile(dst)
  33.     
  34.     try:
  35.         dstcfrg = CfrgResource()
  36.         for src in srclist:
  37.             srccfrg = CfrgResource(src)
  38.             for frag in srccfrg.fragments:
  39.                 dstcfrg.append(frag)
  40.                 frag.copydata(dstfile)
  41.             
  42.         
  43.         cfrgres = Res.Resource(dstcfrg.build())
  44.         Res.UseResFile(rf)
  45.         cfrgres.AddResource('cfrg', 0, '')
  46.     finally:
  47.         dstfile.close()
  48.         rf = Res.CloseResFile(rf)
  49.  
  50.  
  51.  
  52. class CfrgResource:
  53.     
  54.     def __init__(self, path = None):
  55.         self.version = 1
  56.         self.fragments = []
  57.         self.path = path
  58.         if path is not None and os.path.exists(path):
  59.             currentresref = Res.CurResFile()
  60.             resref = Res.OpenResFile(path)
  61.             Res.UseResFile(resref)
  62.             
  63.             try:
  64.                 
  65.                 try:
  66.                     data = Res.Get1Resource('cfrg', 0).data
  67.                 except Res.Error:
  68.                     raise Res.Error, 'no \xd4cfrg\xd5 resource found', sys.exc_traceback
  69.  
  70.             finally:
  71.                 Res.CloseResFile(resref)
  72.                 Res.UseResFile(currentresref)
  73.  
  74.             self.parse(data)
  75.             if self.version != 1:
  76.                 raise error, "unknown 'cfrg' resource format"
  77.             
  78.         
  79.  
  80.     
  81.     def parse(self, data):
  82.         (res1, res2, self.version, res3, res4, res5, res6, self.memberCount) = struct.unpack('8l', data[:32])
  83.         data = data[32:]
  84.         while data:
  85.             frag = FragmentDescriptor(self.path, data)
  86.             data = data[frag.memberSize:]
  87.             self.fragments.append(frag)
  88.  
  89.     
  90.     def build(self):
  91.         self.memberCount = len(self.fragments)
  92.         data = struct.pack('8l', 0, 0, self.version, 0, 0, 0, 0, self.memberCount)
  93.         for frag in self.fragments:
  94.             data = data + frag.build()
  95.         
  96.         return data
  97.  
  98.     
  99.     def append(self, frag):
  100.         self.fragments.append(frag)
  101.  
  102.  
  103.  
  104. class FragmentDescriptor:
  105.     
  106.     def __init__(self, path, data = None):
  107.         self.path = path
  108.         if data is not None:
  109.             self.parse(data)
  110.         
  111.  
  112.     
  113.     def parse(self, data):
  114.         self.architecture = data[:4]
  115.         (self.updatelevel, self.currentVersion, self.oldDefVersion, self.stacksize, self.applibdir, self.fragtype, self.where, self.offset, self.length, self.res1, self.res2, self.memberSize) = struct.unpack('4lhBB4lh', data[4:42])
  116.         pname = data[42:self.memberSize]
  117.         self.name = pname[1:1 + ord(pname[0])]
  118.  
  119.     
  120.     def build(self):
  121.         data = self.architecture
  122.         data = data + struct.pack('4lhBB4l', self.updatelevel, self.currentVersion, self.oldDefVersion, self.stacksize, self.applibdir, self.fragtype, self.where, self.offset, self.length, self.res1, self.res2)
  123.         self.memberSize = len(data) + 2 + 1 + len(self.name)
  124.         if self.memberSize % 4:
  125.             self.memberSize = self.memberSize + 4 - self.memberSize % 4
  126.         
  127.         data = data + struct.pack('hb', self.memberSize, len(self.name))
  128.         data = data + self.name
  129.         data = data + '\x00' * (self.memberSize - len(data))
  130.         return data
  131.  
  132.     
  133.     def getfragment(self):
  134.         if self.where != 1:
  135.             raise error, 'can\xd5t read fragment, unsupported location'
  136.         
  137.         f = open(self.path, 'rb')
  138.         f.seek(self.offset)
  139.         if self.length:
  140.             frag = f.read(self.length)
  141.         else:
  142.             frag = f.read()
  143.         f.close()
  144.         return frag
  145.  
  146.     
  147.     def copydata(self, outfile):
  148.         if self.where != 1:
  149.             raise error, 'can\xd5t read fragment, unsupported location'
  150.         
  151.         infile = open(self.path, 'rb')
  152.         if self.length == 0:
  153.             infile.seek(0, 2)
  154.             self.length = infile.tell()
  155.         
  156.         infile.seek(self.offset)
  157.         offset = outfile.tell()
  158.         if offset % 16:
  159.             offset = offset + 16 - offset % 16
  160.         
  161.         outfile.seek(offset)
  162.         self.offset = offset
  163.         l = self.length
  164.         while l:
  165.             if l > BUFSIZE:
  166.                 outfile.write(infile.read(BUFSIZE))
  167.                 l = l - BUFSIZE
  168.             else:
  169.                 outfile.write(infile.read(l))
  170.                 l = 0
  171.         infile.close()
  172.  
  173.  
  174.