1 # This script generates a Python interface for an Apple Macintosh Manager. 2 # It uses the "bgen" package to generate C code. 3 # The function specifications are generated by scanning the mamager's header file, 4 # using the "scantools" package (customized for this particular manager). 5 6 import string 7 8 # Declarations that change for each manager 9 MODNAME = '_Launch' # The name of the module 10 OBJECTNAME = 'UNUSED' # The basic name of the objects used here 11 KIND = 'Record' # Usually 'Ptr' or 'Handle' 12 13 # The following is *usually* unchanged but may still require tuning 14 MODPREFIX = 'Launch' # The prefix for module-wide routines 15 OBJECTTYPE = OBJECTNAME + KIND # The C type used to represent them 16 OBJECTPREFIX = MODPREFIX + 'Obj' # The prefix for object methods 17 INPUTFILE = string.lower(MODPREFIX) + 'gen.py' # The file generated by the scanner 18 OUTPUTFILE = MODNAME + "module.c" # The file generated by this program 19 20 from macsupport import * 21 22 # Create the type objects 23 LSAcceptanceFlags = Type("LSAcceptanceFlags", "l") 24 LSInitializeFlags = Type("LSInitializeFlags", "l") 25 LSRequestedInfo = Type("LSRequestedInfo", "l") 26 LSRolesMask = Type("LSRolesMask", "l") 27 UniCharCount = Type("UniCharCount", "l") 28 OptCFStringRef = OpaqueByValueType("CFStringRef", "OptCFStringRefObj") 29 LSItemInfoRecord = OpaqueType("LSItemInfoRecord", "LSItemInfoRecord") 30 31 includestuff = includestuff + """ 32 #if PY_VERSION_HEX < 0x02040000 33 PyObject *PyMac_GetOSErrException(void); 34 #endif 35 36 #include <ApplicationServices/ApplicationServices.h> 37 38 /* 39 ** Optional CFStringRef. None will pass NULL 40 */ 41 static int 42 OptCFStringRefObj_Convert(PyObject *v, CFStringRef *spec) 43 { 44 if (v == Py_None) { 45 *spec = NULL; 46 return 1; 47 } 48 return CFStringRefObj_Convert(v, spec); 49 } 50 51 PyObject * 52 OptCFStringRefObj_New(CFStringRef it) 53 { 54 if (it == NULL) { 55 Py_INCREF(Py_None); 56 return Py_None; 57 } 58 return CFStringRefObj_New(it); 59 } 60 61 /* 62 ** Convert LSItemInfoRecord to Python. 63 */ 64 PyObject * 65 LSItemInfoRecord_New(LSItemInfoRecord *it) 66 { 67 return Py_BuildValue("{s:is:O&s:O&s:O&s:O&s:i}", 68 "flags", it->flags, 69 "filetype", PyMac_BuildOSType, it->filetype, 70 "creator", PyMac_BuildOSType, it->creator, 71 "extension", OptCFStringRefObj_New, it->extension, 72 "iconFileName", OptCFStringRefObj_New, it->iconFileName, 73 "kindID", it->kindID); 74 } 75 """ 76 77 # From here on it's basically all boiler plate... 78 execfile(string.lower(MODPREFIX) + 'typetest.py') 79 80 # Create the generator groups and link them 81 module = MacModule(MODNAME, MODPREFIX, includestuff, finalstuff, initstuff) 82 ##object = MyObjectDefinition(OBJECTNAME, OBJECTPREFIX, OBJECTTYPE) 83 ##module.addobject(object) 84 85 # Create the generator classes used to populate the lists 86 Function = OSErrFunctionGenerator 87 ##Method = OSErrMethodGenerator 88 89 # Create and populate the lists 90 functions = [] 91 ##methods = [] 92 execfile(INPUTFILE) 93 94 # add the populated lists to the generator groups 95 # (in a different wordl the scan program would generate this) 96 for f in functions: module.add(f) 97 ##for f in methods: object.add(f) 98 99 # generate output (open the output file as late as possible) 100 SetOutputFileName(OUTPUTFILE) 101 module.generate() 102