diff options
Diffstat (limited to 'Mac/Modules/cm/cmsupport.py')
-rw-r--r-- | Mac/Modules/cm/cmsupport.py | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/Mac/Modules/cm/cmsupport.py b/Mac/Modules/cm/cmsupport.py new file mode 100644 index 0000000..0a1915f --- /dev/null +++ b/Mac/Modules/cm/cmsupport.py @@ -0,0 +1,108 @@ +# This script generates a Python interface for an Apple Macintosh Manager. +# It uses the "bgen" package to generate C code. +# The function specifications are generated by scanning the mamager's header file, +# using the "scantools" package (customized for this particular manager). + +import string + +# Declarations that change for each manager +MACHEADERFILE = 'Components.h' # The Apple header file +MODNAME = 'Cm' # The name of the module + +# The following is *usually* unchanged but may still require tuning +MODPREFIX = MODNAME # The prefix for module-wide routines +C_OBJECTPREFIX = 'CmpObj' # The prefix for object methods +CI_OBJECTPREFIX = 'CmpInstObj' +INPUTFILE = string.lower(MODPREFIX) + 'gen.py' # The file generated by the scanner +OUTPUTFILE = MODNAME + "module.c" # The file generated by this program + +from macsupport import * + +# Create the type objects + +includestuff = includestuff + """ +#include <%s>""" % MACHEADERFILE + """ + +/* +** Parse/generate ComponentDescriptor records +*/ +PyObject *CmpDesc_New(itself) + ComponentDescription *itself; +{ + + return Py_BuildValue("O&O&O&ll", + PyMac_BuildOSType, itself->componentType, + PyMac_BuildOSType, itself->componentSubType, + PyMac_BuildOSType, itself->componentManufacturer, + itself->componentFlags, itself->componentFlagsMask); +} + +CmpDesc_Convert(v, p_itself) + PyObject *v; + ComponentDescription *p_itself; +{ + return PyArg_ParseTuple(v, "O&O&O&ll", + PyMac_GetOSType, &p_itself->componentType, + PyMac_GetOSType, &p_itself->componentSubType, + PyMac_GetOSType, &p_itself->componentManufacturer, + &p_itself->componentFlags, &p_itself->componentFlagsMask); +} + +""" + +ComponentDescription = OpaqueType('ComponentDescription', 'CmpDesc') +Component = OpaqueByValueType('Component', C_OBJECTPREFIX) +ComponentInstance = OpaqueByValueType('ComponentInstance', CI_OBJECTPREFIX) +ComponentResult = Type("ComponentResult", "l") + +ComponentResourceHandle = OpaqueByValueType("ComponentResourceHandle", "ResObj") + +class MyCIObjectDefinition(GlobalObjectDefinition): + def outputCheckNewArg(self): + Output("""if (itself == NULL) { + PyErr_SetString(Cm_Error,"NULL ComponentInstance"); + return NULL; + }""") + +class MyCObjectDefinition(GlobalObjectDefinition): + def outputCheckNewArg(self): + Output("""if (itself == NULL) { + /* XXXX Or should we return None? */ + PyErr_SetString(Cm_Error,"No such component"); + return NULL; + }""") + + def outputCheckConvertArg(self): + Output("""if ( v == Py_None ) { + *p_itself = 0; + return 1; + }""") + +# Create the generator groups and link them +module = MacModule(MODNAME, MODPREFIX, includestuff, finalstuff, initstuff) +ci_object = MyCIObjectDefinition('ComponentInstance', CI_OBJECTPREFIX, + 'ComponentInstance') +c_object = MyCObjectDefinition('Component', C_OBJECTPREFIX, 'Component') +module.addobject(ci_object) +module.addobject(c_object) + +# Create the generator classes used to populate the lists +Function = OSErrFunctionGenerator +Method = OSErrMethodGenerator + +# Create and populate the lists +functions = [] +c_methods = [] +ci_methods = [] +execfile(INPUTFILE) + +# add the populated lists to the generator groups +# (in a different wordl the scan program would generate this) +for f in functions: module.add(f) +for f in c_methods: c_object.add(f) +for f in ci_methods: ci_object.add(f) + +# generate output (open the output file as late as possible) +SetOutputFileName(OUTPUTFILE) +module.generate() + |