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
9182b5aca27d376b08a2904bed42b751496f932f3Tim PetersMACHEADERFILE = 'OSA.h'         # The Apple header file
10182b5aca27d376b08a2904bed42b751496f932f3Tim PetersMODNAME = '_OSA'                                # The name of the module
11fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansen
12fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansen# The following is *usually* unchanged but may still require tuning
13182b5aca27d376b08a2904bed42b751496f932f3Tim PetersMODPREFIX = 'OSA'                       # The prefix for module-wide routines
14182b5aca27d376b08a2904bed42b751496f932f3Tim PetersOBJECTPREFIX = 'OSAObj' # The prefix for object methods
15fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack JansenINPUTFILE = string.lower(MODPREFIX) + 'gen.py' # The file generated by the scanner
16182b5aca27d376b08a2904bed42b751496f932f3Tim PetersOUTPUTFILE = 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 + """
232e20a63bc98da51e1e8206f55a1a519a488e2659Jack Jansen#if PY_VERSION_HEX < 0x02040000
242e20a63bc98da51e1e8206f55a1a519a488e2659Jack JansenPyObject *PyMac_GetOSErrException(void);
252e20a63bc98da51e1e8206f55a1a519a488e2659Jack Jansen#endif
26fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansen#include <Carbon/Carbon.h>
27fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansen
28fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansen#ifdef USE_TOOLBOX_OBJECT_GLUE
29fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansenextern PyObject *_OSAObj_New(ComponentInstance);
30fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansenextern int _OSAObj_Convert(PyObject *, ComponentInstance *);
31fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansen
32fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansen#define OSAObj_New _OSAObj_New
33fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansen#define OSAObj_Convert _OSAObj_Convert
34fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansen#endif
35fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansen"""
36fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansen
37fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Janseninitstuff = initstuff + """
38fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansen/*
39182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        PyMac_INIT_TOOLBOX_OBJECT_NEW(ComponentInstance, OSAObj_New);
40182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        PyMac_INIT_TOOLBOX_OBJECT_CONVERT(ComponentInstance, OSAObj_Convert);
41fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansen*/
42fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansen"""
43fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansen
44fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack JansenComponentInstance = OpaqueByValueType('ComponentInstance', OBJECTPREFIX)
45fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack JansenOSAError = OSErrType("OSAError", "l")
46da6081fccb71541004e3f36f57a9c0971a969e3bJack Jansen# OSALocalOrGlobal = Type("OSALocalOrGlobal", "l")
47fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack JansenOSAID = Type("OSAID", "l")
48fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack JansenOSADebugCallFrameRef = Type("OSADebugCallFrameRef", "l")
49fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack JansenOSADebugSessionRef = Type("OSADebugSessionRef", "l")
50fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack JansenOSADebugStepKind = Type("OSADebugStepKind", "l")
51fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack JansenDescType = OSTypeType("DescType")
52fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack JansenAEDesc = OpaqueType('AEDesc')
53fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack JansenAEDesc_ptr = OpaqueType('AEDesc')
54fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack JansenAEAddressDesc = OpaqueType('AEAddressDesc', 'AEDesc')
55fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack JansenAEAddressDesc_ptr = OpaqueType('AEAddressDesc', 'AEDesc')
56fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack JansenAEDescList = OpaqueType('AEDescList', 'AEDesc')
57fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack JansenAEDescList_ptr = OpaqueType('AEDescList', 'AEDesc')
58fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack JansenAERecord = OpaqueType('AERecord', 'AEDesc')
59fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack JansenAERecord_ptr = OpaqueType('AERecord', 'AEDesc')
60fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack JansenAppleEvent = OpaqueType('AppleEvent', 'AEDesc')
61fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack JansenAppleEvent_ptr = OpaqueType('AppleEvent', 'AEDesc')
62fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansen
63fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansen# NOTE: at the moment OSA.ComponentInstance is not a subclass
64fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansen# of Cm.ComponentInstance. If this is a problem it can be fixed.
65fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansenclass MyObjectDefinition(PEP253Mixin, GlobalObjectDefinition):
66182b5aca27d376b08a2904bed42b751496f932f3Tim Peters    def outputCheckNewArg(self):
67182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        Output("""if (itself == NULL) {
68182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                                PyErr_SetString(OSA_Error,"NULL ComponentInstance");
69182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                                return NULL;
70182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                        }""")
71182b5aca27d376b08a2904bed42b751496f932f3Tim Peters
72182b5aca27d376b08a2904bed42b751496f932f3Tim Peters    def outputCheckConvertArg(self):
73182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        Output("""
74182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                if (CmpInstObj_Convert(v, p_itself))
75182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                        return 1;
76182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                PyErr_Clear();
77182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                """)
78182b5aca27d376b08a2904bed42b751496f932f3Tim Peters
79fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansen
80fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansen# Create the generator groups and link them
81fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansenmodule = MacModule(MODNAME, MODPREFIX, includestuff, finalstuff, initstuff)
820b565a6e42ad1c6dd492cde4d117d13c0e9244caJack Jansenobject = MyObjectDefinition('OSAComponentInstance', OBJECTPREFIX,
83182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                'ComponentInstance')
84fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansenmodule.addobject(object)
85fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansen
86fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansen# Create the generator classes used to populate the lists
87fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack JansenFunction = OSErrWeakLinkFunctionGenerator
88fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack JansenMethod = OSErrWeakLinkMethodGenerator
89fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansen
90fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansen# Test which types we are still missing.
91fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansenexecfile(string.lower(MODPREFIX) + 'typetest.py')
92fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansen
93fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansen# Create and populate the lists
94fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansenfunctions = []
95fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansenmethods = []
96fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansenexecfile(INPUTFILE)
97fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansen
98fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansen# add the populated lists to the generator groups
99fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansen# (in a different wordl the scan program would generate this)
100fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansenfor f in functions: module.add(f)
101fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansenfor f in methods: object.add(f)
102fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansen
103fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansen# generate output (open the output file as late as possible)
104fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack JansenSetOutputFileName(OUTPUTFILE)
105fe3fe4adb5c7a72bfec3c5b7b8ec5e42d8ccc625Jack Jansenmodule.generate()
106