ยปCore Development>Code coverage>Lib/plat-mac/cfmfile.py

Python code coverage for Lib/plat-mac/cfmfile.py

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