summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Mac/scripts/cfmfile.py236
1 files changed, 0 insertions, 236 deletions
diff --git a/Mac/scripts/cfmfile.py b/Mac/scripts/cfmfile.py
deleted file mode 100644
index 5b416f6..0000000
--- a/Mac/scripts/cfmfile.py
+++ /dev/null
@@ -1,236 +0,0 @@
-"""cfmfile - Interface to code fragments on file"""
-import struct
-import Res
-import macfs
-import string
-
-Error = 'cfmfile.Error'
-
-READ = 1
-WRITE = 2
-smAllScripts = -3
-BUFSIZE = 0x100000
-
-class FragmentInfo:
- """Information on a single fragment"""
- def __init__(self):
- self.arch = 'pwpc'
- self.current_version = 0
- self.oldest_version = 0
- self.stacksize = 0
- self.libdir = 0
- self.fragtype = 1
- self.location = 1
- self.offset = 0
- self.length = 0
- self.res_0 = 0
- self.res_1 = 0
- self.name = ''
- self.ifp = None
-
- def load(self, data):
- if len(data) < 43:
- raise Error, 'Not enough data in cfrg resource'
- self.arch = data[:4]
- self.update, self.current_version, self.oldest_version, \
- self.stacksize, self.libdir, self.fragtype, self.location, \
- self.offset, self.length, self.res_0, self.res_1, length = \
- struct.unpack("llllhbbllllh", data[4:42])
- namelen = ord(data[42])
- self.name = data[43:43+namelen]
- if len(self.name) != namelen:
- raise Error, 'Not enough data in cfrg resource'
- return length
-
- def save(self):
- length = (43+len(self.name)+3) & ~3
- data = self.arch + struct.pack("llllhbbllllh", self.update, \
- self.current_version, self.oldest_version, self.stacksize, \
- self.libdir, self.fragtype, self.location, self.offset, \
- self.length, self.res_0, self.res_1, length)
- data = data + chr(len(self.name)) + self.name
- data = data + ('\0'*(length-len(data)))
- return data
-
- def copydata(self, ofp):
- """Copy fragment data to a new file, updating self.offset"""
- if self.location != 1:
- raise Error, 'Can only copy kOnDiskFlat (data fork) fragments'
- if not self.ifp:
- raise Error, 'No source file for fragment'
- # Find out real length (if zero)
- if self.length == 0:
- self.ifp.seek(0, 2)
- self.length = self.ifp.tell()
- # Position input file and record new offset from output file
- self.ifp.seek(self.offset)
- self.offset = ofp.tell()
- l = self.length
- while l:
- if l > BUFSIZE:
- ofp.write(self.ifp.read(BUFSIZE))
- l = l - BUFSIZE
- else:
- ofp.write(self.ifp.read(l))
- l = 0
- self.ifp = ofp
-
- def setfile(self, ifp):
- self.ifp = ifp
-
-class FragmentResource:
-
- def __init__(self, data):
- self.load(data)
-
- def load(self, data):
- r0, r1, version, r3, r4, r5, r6, nfrag = struct.unpack("llllllll", data[:32])
- if version != 1:
- raise Error, 'Unsupported cfrg version number %d'%version
- data = data[32:]
- self.fragments = []
- for i in range(nfrag):
- f = FragmentInfo()
- len = f.load(data)
- data = data[len:]
- self.fragments.append(f)
- if data:
- raise Error, 'Spurious data after fragment descriptions'
-
- def save(self):
- data = struct.pack("llllllll", 0, 0, 1, 0, 0, 0, 0, len(self.fragments))
- for f in self.fragments:
- data = data+f.save()
- return data
-
- def setfile(self, ifp):
- for f in self.fragments:
- f.setfile(ifp)
-
- def copydata(self, ofp):
- for f in self.fragments:
- f.copydata(ofp)
-
- def getfragments(self):
- return self.fragments
-
- def addfragments(self, fragments):
- self.fragments = self.fragments + fragments
-
-class ResourceCollection:
- def __init__(self, fhandle):
- self.reslist = []
- self.fhandle = fhandle
- oldresfile = Res.CurResFile()
- Res.UseResFile(fhandle)
- Res.SetResLoad(0)
- ntypes = Res.Count1Types()
- for itype in range(1, 1+ntypes):
- type = Res.Get1IndType(itype)
- nresources = Res.Count1Resources(type)
- for ires in range(1, 1+nresources):
- res = Res.Get1IndResource(type, ires)
- id, type, name = res.GetResInfo()
- self.reslist.append((type, id))
- Res.SetResLoad(1)
- Res.UseResFile(oldresfile)
-
- def contains(self, type, id):
- return (type, id) in self.reslist
-
- def getresource(self, type, id):
- oldresfile = Res.CurResFile()
- Res.UseResFile(self.fhandle)
- Res.SetResLoad(1)
- resource = Res.Get1Resource(type, id)
- Res.UseResFile(oldresfile)
- return resource
-
- def saveresto(self, type, id, fhandle):
- oldresfile = Res.CurResFile()
- resource = self.getresource(type, id)
- id, type, name = resource.GetResInfo()
- resource.DetachResource()
- Res.UseResFile(fhandle)
- resource.AddResource(type, id, name)
- Res.UseResFile(oldresfile)
-
- def getreslist(self):
- return self.reslist
-
-class CfmFile(ResourceCollection, FragmentResource):
-
- def __init__(self, fsspec):
- rfork = Res.FSpOpenResFile(fsspec, READ)
- dfork = open(fsspec.as_pathname(), 'rb')
- ResourceCollection.__init__(self, rfork)
- cfrg_resource = self.getresource('cfrg', 0)
- FragmentResource.__init__(self, cfrg_resource.data)
- self.setfile(dfork)
-
-def mergecfmfiles(inputs, output):
- # Convert inputs/outputs to fsspecs
- inputs = map(None, inputs)
- for i in range(len(inputs)):
- if type(inputs[i]) == type(''):
- inputs[i] = macfs.FSSpec(inputs[i])
- if type(output) == type(''):
- output = macfs.FSSpec(output)
-
- input_list = []
- for i in inputs:
- input_list.append(CfmFile(i))
-
- # Create output file, if needed
- creator, tp = inputs[0].GetCreatorType()
- try:
- Res.FSpCreateResFile(output, creator, tp, smAllScripts)
- except Res.Error:
- pass
-
- # Copy fragments
- dfork = open(output.as_pathname(), 'wb')
- for i in input_list:
- i.copydata(dfork)
- dfork.close()
-
- # Merge cfrg's
- for i in input_list[1:]:
- input_list[0].addfragments(i.getfragments())
-
- old_res_file = Res.CurResFile()
- rfork = Res.FSpOpenResFile(output, WRITE)
- Res.UseResFile(rfork)
-
- # Write cfrg
- data = input_list[0].save()
- cfrg_resource = Res.Resource(data)
- cfrg_resource.AddResource('cfrg', 0, '')
- resources_done = [('cfrg', 0)]
-
- # Write other resources
- for i in input_list:
- todo = i.getreslist()
- for tp, id in todo:
- if (tp, id) in resources_done:
- continue
- i.saveresto(tp, id, rfork)
- resources_done.append((tp, id))
-
-def main():
- list = []
- while 1:
- fss, ok = macfs.PromptGetFile("Next input file:", "shlb", "APPL")
- if not ok: break
- list.append(fss)
- if not list:
- sys.exit(0)
- output, ok = macfs.StandardPutFile("Output file:")
- if not ok:
- sys.exit(0)
- mergecfmfiles(list, output)
-
-if __name__ == '__main__':
- main()
-
-