cpython/Mac/Lib/py_resource.py

77 lines
1.8 KiB
Python

"""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