completed aete decoded now that I have the docs

This commit is contained in:
Guido van Rossum 1995-02-14 09:47:42 +00:00
parent 4c14a69ff9
commit 872eeebf6d
1 changed files with 137 additions and 64 deletions

View File

@ -25,14 +25,16 @@ def redirect(filename, func, *args):
if f: f.close()
def realmain():
#list('C:System Folder:Extensions:AppleScript\252')
#list('C:Tao AppleScript:Finder Liaison:Finder Liaison 1.0')
#list('C:Tao AppleScript:Scriptable Text Editor')
#list('C:Internet:Eudora 1.4.2:Eudora1.4.2')
list('E:Excel 4.0:Microsoft Excel')
#list('E:Excel 4.0:Microsoft Excel')
#list('C:Internet:Netscape 1.0N:Netscape 1.0N')
#find('C:')
#find('D:')
#find('E:')
#find('F:')
find('D:')
find('E:')
find('F:')
def find(dir, maxlevel = 5):
hits = []
@ -52,7 +54,7 @@ def find(dir, maxlevel = 5):
hits = hits + find(fullname, maxlevel-1)
else:
ctor, type = MacOS.GetCreatorAndType(fullname)
if type == 'APPL':
if type in ('APPL', 'FNDR', 'zsys', 'INIT', 'scri', 'cdev'):
sys.stderr.write(" %s\n" % `fullname`)
try:
rf = OpenRFPerm(fullname, 0, '\1')
@ -82,13 +84,14 @@ def list(fullname):
for i in range(Count1Resources('aeut')):
res = Get1IndResource('aeut', 1+i)
resources.append(res)
print "\nLISTING aete+aeut RESOURCE IN", `fullname`
print "\nLISTING aete+aeut RESOURCES IN", `fullname`
for res in resources:
print res.GetResInfo()
print "decoding", res.GetResInfo(), "..."
data = res.data
try:
aete = decode(data)
showaete(aete)
print "Checking putaete..."
f = StringIO.StringIO()
putaete(f, aete)
newdata = f.getvalue()
@ -139,6 +142,12 @@ def simplify(item):
# It is presented bottom-up instead of top-down because there are direct
# references to the lower-level part-decoders from the high-level part-decoders.
def getbyte(f, *args):
c = f.read(1)
if not c:
raise EOFError, 'in getbyte' + str(args)
return ord(c)
def getword(f, *args):
getalign(f)
s = f.read(2)
@ -181,8 +190,8 @@ def getlist(f, description, getitem):
count = getword(f)
list = []
for i in range(count):
getalign(f)
list.append(generic(getitem, f))
getalign(f)
return list
def alt_generic(what, f, *args):
@ -202,49 +211,100 @@ def generic(what, f, *args):
return record
return "BAD GENERIC ARGS: %s" % `what`
getdata = [(getostype, "type"), (getpstr, "description"), (getword, "flags")]
getoptarg = [(getpstr, "name"), (getostype, "keyword"), (getdata, "what")]
getcommand = [(getpstr, "name"), (getpstr, "description"),
(getostype, "suite code"), (getostype, "command code"),
getdata = [
(getostype, "type"),
(getpstr, "description"),
(getword, "flags")
]
getargument = [
(getpstr, "name"),
(getostype, "keyword"),
(getdata, "what")
]
getevent = [
(getpstr, "name"),
(getpstr, "description"),
(getostype, "suite code"),
(getostype, "event code"),
(getdata, "returns"),
(getdata, "accepts"),
(getlist, "optional arguments", getoptarg)]
getprop = [(getpstr, "name"), (getostype, "code"), (getdata, "what")]
getelem = [(getostype, "type"), (getlist, "accessibility", getostype)]
getclass = [(getpstr, "name"), (getostype, "class code"), (getpstr, "description"),
(getlist, "properties", getprop), (getlist, "elements", getelem)]
getenumitem = [(getpstr, "name"), (getostype, "value"), (getpstr, "description")]
getenum = [(getostype, "enumtype"), (getlist, "enumitem", getenumitem)]
getsuite = [(getpstr, "name"), (getpstr, "description"), (getostype, "code"),
(getword, "flags1"), (getword, "flags2"),
(getlist, "commands", getcommand),
(getlist, "optional arguments", getargument)
]
getproperty = [
(getpstr, "name"),
(getostype, "code"),
(getdata, "what")
]
getelement = [
(getostype, "type"),
(getlist, "keyform", getostype)
]
getclass = [
(getpstr, "name"),
(getostype, "class code"),
(getpstr, "description"),
(getlist, "properties", getproperty),
(getlist, "elements", getelement)
]
getcomparison = [
(getpstr, "operator name"),
(getostype, "operator ID"),
(getpstr, "operator comment"),
]
getenumerator = [
(getpstr, "enumerator name"),
(getostype, "enumerator ID"),
(getpstr, "enumerator comment")
]
getenumeration = [
(getostype, "enumeration ID"),
(getlist, "enumerator", getenumerator)
]
getsuite = [
(getpstr, "suite name"),
(getpstr, "suite description"),
(getostype, "suite ID"),
(getword, "suite level"),
(getword, "suite version"),
(getlist, "events", getevent),
(getlist, "classes", getclass),
(getword, "count???"), (getlist, "enums", getenum)]
getaete = [(getword, "skip1"), (getword, "skip2"), (getword, "skip3"),
(getlist, "suites", getsuite)]
(getlist, "comparisons", getcomparison),
(getlist, "enumerations", getenumeration)
]
getaete = [
(getword, "major/minor version in BCD"),
(getword, "language code"),
(getword, "script code"),
(getlist, "suites", getsuite)
]
# Display 'aete' resources in a friendly manner.
# This one's done top-down again...
def showaete(aete):
[flags1, flags2, flags3, suites] = aete
print "\nGlobal flags: x%x, x%x, x%x\n" % (flags1, flags2, flags3)
[version, language, script, suites] = aete
major, minor = divmod(version, 256)
print "\nVersion %d/%d, language %d, script %d" % \
(major, minor, language, script)
for suite in suites:
showsuite(suite)
def showsuite(suite):
[name, desc, code, flags1, flags2, commands, classes, skip1, enums] = suite
[name, desc, code, level, version, events, classes, comps, enums] = suite
print "\nSuite %s -- %s (%s)" % (`name`, `desc`, `code`)
for command in commands:
showcommand(command)
for classe in classes:
showclass(classe)
print "Level %d, version %d" % (level, version)
for event in events:
showevent(event)
for cls in classes:
showclass(cls)
for comp in comps:
showcomparison(comp)
for enum in enums:
showenum(enum)
showenumeration(enum)
def showcommand(command):
[name, desc, code, subcode, returns, accepts, arguments] = command
def showevent(event):
[name, desc, code, subcode, returns, accepts, arguments] = event
print "\n Command %s -- %s (%s, %s)" % (`name`, `desc`, `code`, `subcode`)
print " returns", showdata(returns)
print " accepts", showdata(accepts)
@ -255,8 +315,8 @@ def showargument(arg):
[name, keyword, what] = arg
print " %s (%s)" % (name, `keyword`), showdata(what)
def showclass(classe):
[name, code, desc, properties, elements] = classe
def showclass(cls):
[name, code, desc, properties, elements] = cls
print "\n Class %s (%s) -- %s" % (`name`, `code`, `desc`)
for prop in properties:
showproperty(prop)
@ -265,19 +325,23 @@ def showclass(classe):
def showproperty(prop):
[name, code, what] = prop
print " property %s (%s)" % (name, code), showdata(what)
print " property %s (%s)" % (`name`, `code`), showdata(what)
def showelement(elem):
[code, accessibility] = elem
print " element %s" % `code`, "as", accessibility
[code, keyform] = elem
print " element %s" % `code`, "as", keyform
def showenum(enum):
def showcomparison(comp):
[name, code, comment] = comp
print " comparison %s (%s) -- %s" % (`name`, `code`, comment)
def showenumeration(enum):
[code, items] = enum
print "\n Enum %s" % `code`
for item in items:
showitem(item)
showenumerator(item)
def showitem(item):
def showenumerator(item):
[name, code, desc] = item
print " %s (%s) -- %s" % (`name`, `code`, `desc`)
@ -285,7 +349,7 @@ def showdata(data):
[type, description, flags] = data
return "%s -- %s %s" % (`type`, `description`, showdataflags(flags))
dataflagdict = {15: "optional", 14: "list", 13: "enum", 12: "writable"}
dataflagdict = {15: "optional", 14: "list", 13: "enum", 12: "mutable"}
def showdataflags(flags):
bits = []
for i in range(16):
@ -301,30 +365,30 @@ def showdataflags(flags):
# Closedly modelled after showaete()...
def putaete(f, aete):
[flags1, flags2, flags3, suites] = aete
putword(f, flags1)
putword(f, flags2)
putword(f, flags3)
[version, language, script, suites] = aete
putword(f, version)
putword(f, language)
putword(f, script)
putlist(f, suites, putsuite)
def putsuite(f, suite):
[name, desc, code, flags1, flags2, commands, classes, skip1, enums] = suite
[name, desc, code, level, version, events, classes, comps, enums] = suite
putpstr(f, name)
putpstr(f, desc)
putostype(f, code)
putword(f, flags1)
putword(f, flags2)
putlist(f, commands, putcommand)
putword(f, level)
putword(f, version)
putlist(f, events, putevent)
putlist(f, classes, putclass)
putword(f, skip1)
putlist(f, enums, putenum)
putlist(f, comps, putcomparison)
putlist(f, enums, putenumeration)
def putcommand(f, command):
[name, desc, code, subcode, returns, accepts, arguments] = command
def putevent(f, event):
[name, desc, eventclass, eventid, returns, accepts, arguments] = event
putpstr(f, name)
putpstr(f, desc)
putostype(f, code)
putostype(f, subcode)
putostype(f, eventclass)
putostype(f, eventid)
putdata(f, returns)
putdata(f, accepts)
putlist(f, arguments, putargument)
@ -335,8 +399,8 @@ def putargument(f, arg):
putostype(f, keyword)
putdata(f, what)
def putclass(f, classe):
[name, code, desc, properties, elements] = classe
def putclass(f, cls):
[name, code, desc, properties, elements] = cls
putpstr(f, name)
putostype(f, code)
putpstr(f, desc)
@ -350,12 +414,18 @@ def putelement(f, elem):
putostype(f, code)
putlist(f, parts, putostype)
def putenum(f, enum):
def putcomparison(f, comp):
[name, id, comment] = comp
putpstr(f, name)
putostype(f, id)
putpstr(f, comment)
def putenumeration(f, enum):
[code, items] = enum
putostype(f, code)
putlist(f, items, putitem)
putlist(f, items, putenumerator)
def putitem(f, item):
def putenumerator(f, item):
[name, code, desc] = item
putpstr(f, name)
putostype(f, code)
@ -370,13 +440,16 @@ def putdata(f, data):
def putlist(f, list, putitem):
putword(f, len(list))
for item in list:
putalign(f)
putitem(f, item)
putalign(f)
def putalign(f):
if f.tell() & 1:
f.write('\0')
def putbyte(f, value):
f.write(chr(value))
def putword(f, value):
putalign(f)
f.write(chr((value>>8)&0xff))