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