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