"""Creation of PYC resources""" import os import Res import __builtin__ READ = 1 WRITE = 2 smAllScripts = -3 def Pstring(str): """Return a pascal-style string from a python-style string""" if len(str) > 255: raise ValueError, 'String too large' return chr(len(str))+str def create(dst, creator='Pyth'): """Create output file. Return handle and first id to use.""" try: os.unlink(dst) except os.error: pass Res.FSpCreateResFile(dst, creator, 'rsrc', smAllScripts) return open(dst) def open(dst): output = Res.FSpOpenResFile(dst, WRITE) Res.UseResFile(output) return output def writemodule(name, id, data, type='PYC '): """Write pyc code to a PYC resource with given name and id.""" # XXXX Check that it doesn't exist res = Res.Resource(data) res.AddResource(type, id, name) res.WriteResource() res.ReleaseResource() def frompycfile(file, name=None): """Copy one pyc file to the open resource file""" if name == None: d, name = os.path.split(file) name = name[:-4] id = findfreeid() writemodule(name, id, __builtin__.open(file, 'rb').read()) return id, name def frompyfile(file, name=None): """Compile python source file to pyc file and add to resource file""" import py_compile py_compile.compile(file) file = file +'c' return frompycfile(file, name) # XXXX Note this is incorrect, it only handles one type and one file.... _firstfreeid = None def findfreeid(type='PYC '): """Find next free id-number for given resource type""" global _firstfreeid if _firstfreeid == None: Res.SetResLoad(0) highest = 511 num = Res.Count1Resources(type) for i in range(1, num+1): r = Res.Get1IndResource(type, i) id, d1, d2 = r.GetResInfo() highest = max(highest, id) Res.SetResLoad(1) _firstfreeid = highest+1 id = _firstfreeid _firstfreeid = _firstfreeid+1 return id