osasupport.py revision fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625
1fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansen# This script generates a Python interface for an Apple Macintosh Manager.
2fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansen# It uses the "bgen" package to generate C code.
3fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansen# The function specifications are generated by scanning the mamager's header file,
4fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansen# using the "scantools" package (customized for this particular manager).
5fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansen
6fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansenimport string
7fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansen
8fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansen# Declarations that change for each manager
9fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack JansenMACHEADERFILE = 'OSA.h'		# The Apple header file
10fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack JansenMODNAME = '_OSA'				# The name of the module
11fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansen
12fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansen# The following is *usually* unchanged but may still require tuning
13fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack JansenMODPREFIX = 'OSA'			# The prefix for module-wide routines
14fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack JansenOBJECTPREFIX = 'OSAObj'	# The prefix for object methods
15fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack JansenINPUTFILE = string.lower(MODPREFIX) + 'gen.py' # The file generated by the scanner
16fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack JansenOUTPUTFILE = MODNAME + "module.c"	# The file generated by this program
17fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansen
18fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansenfrom macsupport import *
19fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansen
20fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansen# Create the type objects
21fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansen
22fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansenincludestuff = includestuff + """
23fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansen#include <Carbon/Carbon.h>
24fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansen
25fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansen#ifdef USE_TOOLBOX_OBJECT_GLUE
26fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansenextern PyObject *_OSAObj_New(ComponentInstance);
27fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansenextern int _OSAObj_Convert(PyObject *, ComponentInstance *);
28fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansen
29fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansen#define OSAObj_New _OSAObj_New
30fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansen#define OSAObj_Convert _OSAObj_Convert
31fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansen#endif
32fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansen"""
33fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansen
34fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Janseninitstuff = initstuff + """
35fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansen/*
36fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansen	PyMac_INIT_TOOLBOX_OBJECT_NEW(ComponentInstance, OSAObj_New);
37fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansen	PyMac_INIT_TOOLBOX_OBJECT_CONVERT(ComponentInstance, OSAObj_Convert);
38fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansen*/
39fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansen"""
40fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansen
41fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack JansenComponentInstance = OpaqueByValueType('ComponentInstance', OBJECTPREFIX)
42fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack JansenOSAError = OSErrType("OSAError", "l")
43fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack JansenOSAID = Type("OSAID", "l")
44fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack JansenOSADebugCallFrameRef = Type("OSADebugCallFrameRef", "l")
45fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack JansenOSADebugSessionRef = Type("OSADebugSessionRef", "l")
46fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack JansenOSADebugStepKind = Type("OSADebugStepKind", "l")
47fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack JansenDescType = OSTypeType("DescType")
48fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack JansenAEDesc = OpaqueType('AEDesc')
49fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack JansenAEDesc_ptr = OpaqueType('AEDesc')
50fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack JansenAEAddressDesc = OpaqueType('AEAddressDesc', 'AEDesc')
51fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack JansenAEAddressDesc_ptr = OpaqueType('AEAddressDesc', 'AEDesc')
52fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack JansenAEDescList = OpaqueType('AEDescList', 'AEDesc')
53fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack JansenAEDescList_ptr = OpaqueType('AEDescList', 'AEDesc')
54fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack JansenAERecord = OpaqueType('AERecord', 'AEDesc')
55fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack JansenAERecord_ptr = OpaqueType('AERecord', 'AEDesc')
56fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack JansenAppleEvent = OpaqueType('AppleEvent', 'AEDesc')
57fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack JansenAppleEvent_ptr = OpaqueType('AppleEvent', 'AEDesc')
58fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansen
59fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansen# NOTE: at the moment OSA.ComponentInstance is not a subclass
60fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansen# of Cm.ComponentInstance. If this is a problem it can be fixed.
61fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansenclass MyObjectDefinition(PEP253Mixin, GlobalObjectDefinition):
62fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansen	def outputCheckNewArg(self):
63fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansen		Output("""if (itself == NULL) {
64fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansen					PyErr_SetString(OSA_Error,"NULL ComponentInstance");
65fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansen					return NULL;
66fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansen				}""")
67fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansen
68fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansen# Create the generator groups and link them
69fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansenmodule = MacModule(MODNAME, MODPREFIX, includestuff, finalstuff, initstuff)
70fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansenobject = MyObjectDefinition('ComponentInstance', OBJECTPREFIX,
71fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansen		'ComponentInstance')
72fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansenmodule.addobject(object)
73fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansen
74fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansen# Create the generator classes used to populate the lists
75fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack JansenFunction = OSErrWeakLinkFunctionGenerator
76fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack JansenMethod = OSErrWeakLinkMethodGenerator
77fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansen
78fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansen# Test which types we are still missing.
79fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansenexecfile(string.lower(MODPREFIX) + 'typetest.py')
80fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansen
81fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansen# Create and populate the lists
82fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansenfunctions = []
83fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansenmethods = []
84fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansenexecfile(INPUTFILE)
85fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansen
86fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansen# add the populated lists to the generator groups
87fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansen# (in a different wordl the scan program would generate this)
88fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansenfor f in functions: module.add(f)
89fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansenfor f in methods: object.add(f)
90fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansen
91fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansen# generate output (open the output file as late as possible)
92fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack JansenSetOutputFileName(OUTPUTFILE)
93fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansenmodule.generate()
94fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansen
95