1 """codefragments.py -- wrapper to modify code fragments."""
3 # (c) 1998, Just van Rossum, Letterror
9 warnings
.warnpy3k("the cfmfile module is deprecated and is removed in 3,0",
14 from Carbon
import Res
24 def mergecfmfiles(srclist
, dst
, architecture
= 'fat'):
25 """Merge all files in srclist into a new file dst.
27 If architecture is given, only code fragments of that type will be used:
28 "pwpc" for PPC, "m68k" for cfm68k. This does not work for "classic"
29 68k code, since it does not use code fragments to begin with.
30 If architecture is None, all fragments will be used, enabling FAT binaries.
33 srclist
= list(srclist
)
34 for i
in range(len(srclist
)):
35 srclist
[i
] = Carbon
.File
.pathname(srclist
[i
])
36 dst
= Carbon
.File
.pathname(dst
)
38 dstfile
= open(dst
, "wb")
39 rf
= Res
.FSpOpenResFile(dst
, 3)
41 dstcfrg
= CfrgResource()
43 srccfrg
= CfrgResource(src
)
44 for frag
in srccfrg
.fragments
:
45 if frag
.architecture
== 'pwpc' and architecture
== 'm68k':
47 if frag
.architecture
== 'm68k' and architecture
== 'pwpc':
51 frag
.copydata(dstfile
)
53 cfrgres
= Res
.Resource(dstcfrg
.build())
55 cfrgres
.AddResource('cfrg', 0, "")
58 rf
= Res
.CloseResFile(rf
)
63 def __init__(self
, path
= None):
67 if path
is not None and os
.path
.exists(path
):
68 currentresref
= Res
.CurResFile()
69 resref
= Res
.FSpOpenResFile(path
, 1)
70 Res
.UseResFile(resref
)
73 data
= Res
.Get1Resource('cfrg', 0).data
75 raise Res
.Error
, "no 'cfrg' resource found", sys
.exc_traceback
77 Res
.CloseResFile(resref
)
78 Res
.UseResFile(currentresref
)
81 raise error
, "unknown 'cfrg' resource format"
83 def parse(self
, data
):
84 (res1
, res2
, self
.version
,
85 res3
, res4
, res5
, res6
,
86 self
.memberCount
) = struct
.unpack("8l", data
[:32])
89 frag
= FragmentDescriptor(self
.path
, data
)
90 data
= data
[frag
.memberSize
:]
91 self
.fragments
.append(frag
)
94 self
.memberCount
= len(self
.fragments
)
95 data
= struct
.pack("8l", 0, 0, self
.version
, 0, 0, 0, 0, self
.memberCount
)
96 for frag
in self
.fragments
:
97 data
= data
+ frag
.build()
100 def append(self
, frag
):
101 self
.fragments
.append(frag
)
104 class FragmentDescriptor
:
106 def __init__(self
, path
, data
= None):
111 def parse(self
, data
):
112 self
.architecture
= data
[:4]
122 self
.res1
, self
.res2
,
123 self
.memberSize
,) = struct
.unpack("4lhBB4lh", data
[4:42])
124 pname
= data
[42:self
.memberSize
]
125 self
.name
= pname
[1:1+ord(pname
[0])]
128 data
= self
.architecture
129 data
= data
+ struct
.pack("4lhBB4l",
139 self
.res1
, self
.res2
)
140 self
.memberSize
= len(data
) + 2 + 1 + len(self
.name
)
141 # pad to 4 byte boundaries
142 if self
.memberSize
% 4:
143 self
.memberSize
= self
.memberSize
+ 4 - (self
.memberSize
% 4)
144 data
= data
+ struct
.pack("hb", self
.memberSize
, len(self
.name
))
145 data
= data
+ self
.name
146 data
= data
+ '\000' * (self
.memberSize
- len(data
))
149 def getfragment(self
):
151 raise error
, "can't read fragment, unsupported location"
152 f
= open(self
.path
, "rb")
155 frag
= f
.read(self
.length
)
161 def copydata(self
, outfile
):
163 raise error
, "can't read fragment, unsupported location"
164 infile
= open(self
.path
, "rb")
167 self
.length
= infile
.tell()
169 # Position input file and record new offset from output file
170 infile
.seek(self
.offset
)
172 # pad to 16 byte boundaries
173 offset
= outfile
.tell()
175 offset
= offset
+ 16 - (offset
% 16)
182 outfile
.write(infile
.read(BUFSIZE
))
185 outfile
.write(infile
.read(l
))