117448e24081eb713ac00d7bcb681f4f0d8abfcbfGuido van Rossum# This script generates a Python interface for an Apple Macintosh Manager. 217448e24081eb713ac00d7bcb681f4f0d8abfcbfGuido van Rossum# It uses the "bgen" package to generate C code. 317448e24081eb713ac00d7bcb681f4f0d8abfcbfGuido van Rossum# The function specifications are generated by scanning the mamager's header file, 417448e24081eb713ac00d7bcb681f4f0d8abfcbfGuido van Rossum# using the "scantools" package (customized for this particular manager). 517448e24081eb713ac00d7bcb681f4f0d8abfcbfGuido van Rossum 617448e24081eb713ac00d7bcb681f4f0d8abfcbfGuido van Rossumimport string 717448e24081eb713ac00d7bcb681f4f0d8abfcbfGuido van Rossum 817448e24081eb713ac00d7bcb681f4f0d8abfcbfGuido van Rossum# Declarations that change for each manager 9182b5aca27d376b08a2904bed42b751496f932f3Tim PetersMACHEADERFILE = 'Events.h' # The Apple header file 10182b5aca27d376b08a2904bed42b751496f932f3Tim PetersMODNAME = '_Evt' # The name of the module 11182b5aca27d376b08a2904bed42b751496f932f3Tim PetersOBJECTNAME = 'Event' # The basic name of the objects used here 12182b5aca27d376b08a2904bed42b751496f932f3Tim PetersKIND = 'Record' # Usually 'Ptr' or 'Handle' 1317448e24081eb713ac00d7bcb681f4f0d8abfcbfGuido van Rossum 1417448e24081eb713ac00d7bcb681f4f0d8abfcbfGuido van Rossum# The following is *usually* unchanged but may still require tuning 15182b5aca27d376b08a2904bed42b751496f932f3Tim PetersMODPREFIX = 'Evt' # The prefix for module-wide routines 16182b5aca27d376b08a2904bed42b751496f932f3Tim PetersOBJECTTYPE = OBJECTNAME + KIND # The C type used to represent them 17182b5aca27d376b08a2904bed42b751496f932f3Tim PetersOBJECTPREFIX = MODPREFIX + 'Obj' # The prefix for object methods 1817448e24081eb713ac00d7bcb681f4f0d8abfcbfGuido van RossumINPUTFILE = string.lower(MODPREFIX) + 'gen.py' # The file generated by the scanner 19182b5aca27d376b08a2904bed42b751496f932f3Tim PetersOUTPUTFILE = MODNAME + "module.c" # The file generated by this program 2017448e24081eb713ac00d7bcb681f4f0d8abfcbfGuido van Rossum 2117448e24081eb713ac00d7bcb681f4f0d8abfcbfGuido van Rossumfrom macsupport import * 2217448e24081eb713ac00d7bcb681f4f0d8abfcbfGuido van Rossum 2317448e24081eb713ac00d7bcb681f4f0d8abfcbfGuido van Rossum# Create the type objects 2417448e24081eb713ac00d7bcb681f4f0d8abfcbfGuido van Rossum 25e26c263e71f9f46d3a6fc7b5c69b6a8e81c1997cGuido van Rossum#WindowPeek = OpaqueByValueType("WindowPeek", OBJECTPREFIX) 2617448e24081eb713ac00d7bcb681f4f0d8abfcbfGuido van Rossum 272b72417da0af053f6efc1b3574361744eb22d2a7Jack JansenRgnHandle = FakeType("(RgnHandle)0") 282b72417da0af053f6efc1b3574361744eb22d2a7Jack Jansen# XXXX Should be next, but this will break a lot of code... 292b72417da0af053f6efc1b3574361744eb22d2a7Jack Jansen# RgnHandle = OpaqueByValueType("RgnHandle", "OptResObj") 3017448e24081eb713ac00d7bcb681f4f0d8abfcbfGuido van Rossum 3117448e24081eb713ac00d7bcb681f4f0d8abfcbfGuido van RossumKeyMap = ArrayOutputBufferType("KeyMap") 320b13e7c1531351452703d6b9770194e53a3d3f69Jack Jansen##MacOSEventKind = Type("MacOSEventKind", "h") # Old-style 330b13e7c1531351452703d6b9770194e53a3d3f69Jack Jansen##MacOSEventMask = Type("MacOSEventMask", "h") # Old-style 340b13e7c1531351452703d6b9770194e53a3d3f69Jack JansenEventMask = Type("EventMask", "H") 350b13e7c1531351452703d6b9770194e53a3d3f69Jack JansenEventKind = Type("EventKind", "H") 3617448e24081eb713ac00d7bcb681f4f0d8abfcbfGuido van Rossum 3717448e24081eb713ac00d7bcb681f4f0d8abfcbfGuido van Rossumincludestuff = includestuff + """ 38fa77e1a1b1ec479600a0f3a1dbc3faf28140d31fJack Jansen#include <Carbon/Carbon.h> 39fa77e1a1b1ec479600a0f3a1dbc3faf28140d31fJack Jansen 4017448e24081eb713ac00d7bcb681f4f0d8abfcbfGuido van Rossum""" 4117448e24081eb713ac00d7bcb681f4f0d8abfcbfGuido van Rossum 4217448e24081eb713ac00d7bcb681f4f0d8abfcbfGuido van Rossum# From here on it's basically all boiler plate... 4317448e24081eb713ac00d7bcb681f4f0d8abfcbfGuido van Rossum 4417448e24081eb713ac00d7bcb681f4f0d8abfcbfGuido van Rossum# Create the generator groups and link them 4517448e24081eb713ac00d7bcb681f4f0d8abfcbfGuido van Rossummodule = MacModule(MODNAME, MODPREFIX, includestuff, finalstuff, initstuff) 4617448e24081eb713ac00d7bcb681f4f0d8abfcbfGuido van Rossum 4717448e24081eb713ac00d7bcb681f4f0d8abfcbfGuido van Rossum# Create the generator classes used to populate the lists 48714d7268d5dcd9233bb8b3580cd9bce5a5a9fc50Jack JansenFunction = OSErrWeakLinkFunctionGenerator 49714d7268d5dcd9233bb8b3580cd9bce5a5a9fc50Jack Jansen##Method = OSErrWeakLinkMethodGenerator 5017448e24081eb713ac00d7bcb681f4f0d8abfcbfGuido van Rossum 5117448e24081eb713ac00d7bcb681f4f0d8abfcbfGuido van Rossum# Create and populate the lists 5217448e24081eb713ac00d7bcb681f4f0d8abfcbfGuido van Rossumfunctions = [] 5317448e24081eb713ac00d7bcb681f4f0d8abfcbfGuido van Rossumexecfile(INPUTFILE) 5417448e24081eb713ac00d7bcb681f4f0d8abfcbfGuido van Rossum 55ec982e2739f6d7992d530c0940965f6eeb73a467Jack Jansen# Move TickCount here, for convenience 56ec982e2739f6d7992d530c0940965f6eeb73a467Jack Jansenf = Function(UInt32, 'TickCount', 57ec982e2739f6d7992d530c0940965f6eeb73a467Jack Jansen) 58ec982e2739f6d7992d530c0940965f6eeb73a467Jack Jansenfunctions.append(f) 59ec982e2739f6d7992d530c0940965f6eeb73a467Jack Jansen 6017448e24081eb713ac00d7bcb681f4f0d8abfcbfGuido van Rossum# add the populated lists to the generator groups 6117448e24081eb713ac00d7bcb681f4f0d8abfcbfGuido van Rossum# (in a different wordl the scan program would generate this) 6217448e24081eb713ac00d7bcb681f4f0d8abfcbfGuido van Rossumfor f in functions: module.add(f) 6317448e24081eb713ac00d7bcb681f4f0d8abfcbfGuido van Rossum 6491b5bedf1cf35911e5b7e92af0bf4626dbd90da9Jack JansenWaitNextEvent_body = """ 6591b5bedf1cf35911e5b7e92af0bf4626dbd90da9Jack JansenBoolean _rv; 6691b5bedf1cf35911e5b7e92af0bf4626dbd90da9Jack JansenEventMask eventMask; 6791b5bedf1cf35911e5b7e92af0bf4626dbd90da9Jack JansenEventRecord theEvent; 6891b5bedf1cf35911e5b7e92af0bf4626dbd90da9Jack JansenUInt32 sleep; 6991b5bedf1cf35911e5b7e92af0bf4626dbd90da9Jack JansenHandle mouseregion = (Handle)0; 7091b5bedf1cf35911e5b7e92af0bf4626dbd90da9Jack Jansen 714fb67f46595e53f8637b8aea2afa5e852f26abc7Jack Jansenif (!PyArg_ParseTuple(_args, "Hl|O&", 7291b5bedf1cf35911e5b7e92af0bf4626dbd90da9Jack Jansen &eventMask, 7391b5bedf1cf35911e5b7e92af0bf4626dbd90da9Jack Jansen &sleep, 7491b5bedf1cf35911e5b7e92af0bf4626dbd90da9Jack Jansen OptResObj_Convert, &mouseregion)) 75182b5aca27d376b08a2904bed42b751496f932f3Tim Peters return NULL; 7691b5bedf1cf35911e5b7e92af0bf4626dbd90da9Jack Jansen_rv = WaitNextEvent(eventMask, 7791b5bedf1cf35911e5b7e92af0bf4626dbd90da9Jack Jansen &theEvent, 7891b5bedf1cf35911e5b7e92af0bf4626dbd90da9Jack Jansen sleep, 7991b5bedf1cf35911e5b7e92af0bf4626dbd90da9Jack Jansen (RgnHandle)mouseregion); 8091b5bedf1cf35911e5b7e92af0bf4626dbd90da9Jack Jansen_res = Py_BuildValue("bO&", 8191b5bedf1cf35911e5b7e92af0bf4626dbd90da9Jack Jansen _rv, 8291b5bedf1cf35911e5b7e92af0bf4626dbd90da9Jack Jansen PyMac_BuildEventRecord, &theEvent); 8391b5bedf1cf35911e5b7e92af0bf4626dbd90da9Jack Jansenreturn _res; 8491b5bedf1cf35911e5b7e92af0bf4626dbd90da9Jack Jansen""" 8591b5bedf1cf35911e5b7e92af0bf4626dbd90da9Jack Jansenf = ManualGenerator("WaitNextEvent", WaitNextEvent_body); 8691b5bedf1cf35911e5b7e92af0bf4626dbd90da9Jack Jansenf.docstring = lambda: "(EventMask eventMask, UInt32 sleep [,RegionHandle]) -> (Boolean _rv, EventRecord theEvent)" 8791b5bedf1cf35911e5b7e92af0bf4626dbd90da9Jack Jansenmodule.add(f) 8891b5bedf1cf35911e5b7e92af0bf4626dbd90da9Jack Jansen 89ec982e2739f6d7992d530c0940965f6eeb73a467Jack Jansen 9017448e24081eb713ac00d7bcb681f4f0d8abfcbfGuido van Rossum# generate output (open the output file as late as possible) 9117448e24081eb713ac00d7bcb681f4f0d8abfcbfGuido van RossumSetOutputFileName(OUTPUTFILE) 9217448e24081eb713ac00d7bcb681f4f0d8abfcbfGuido van Rossummodule.generate() 93