mirror of https://github.com/python/cpython.git
Module to handle PYC resources
This commit is contained in:
parent
31dd5c083b
commit
0acb7f7a57
|
@ -0,0 +1,76 @@
|
|||
"""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
|
Loading…
Reference in New Issue